[Pkg-virtualbox-commits] [virtualbox] 01/02: Imported Upstream version 5.0.6-dfsg

Gianfranco Costamagna locutusofborg-guest at moszumanska.debian.org
Sat Oct 3 11:39:20 UTC 2015


This is an automated email from the git hooks/post-receive script.

locutusofborg-guest pushed a commit to branch master
in repository virtualbox.

commit 379c4cb40d5afc6d36f0a542731f01c1ae67c51a
Author: Gianfranco Costamagna <costamagnagianfranco at yahoo.it>
Date:   Fri Oct 2 23:52:19 2015 +0200

    Imported Upstream version 5.0.6-dfsg
---
 Config.kmk                                         |   63 +-
 configure                                          |  183 +-
 doc/VBox-CodingGuidelines.cpp                      |   56 +-
 doc/manual/en_US/user_Installation.xml             |    4 +-
 doc/manual/user_ChangeLogImpl.xml                  |  165 ++
 include/VBox/HostServices/GuestControlSvc.h        |    2 +-
 include/iprt/asm.h                                 |   12 +-
 include/iprt/crypto/digest.h                       |    4 +-
 include/iprt/env.h                                 |   19 +-
 include/iprt/err.h                                 |   42 +
 include/iprt/log.h                                 |    7 +-
 include/iprt/mangling.h                            |   19 +-
 include/iprt/nt/nt-and-windows.h                   |    1 +
 include/iprt/nt/nt.h                               |   23 +-
 include/iprt/pipe.h                                |   26 +
 include/iprt/process.h                             |   21 +-
 include/iprt/string.h                              |   25 +
 include/iprt/uri.h                                 |  251 +-
 include/iprt/vfs.h                                 |   13 +-
 .../Additions/common/VBoxGuestLib/Makefile.kmk     |    3 +-
 .../VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp       |   75 -
 .../VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp     |   32 +-
 .../common/VBoxGuestLib/VBoxGuestR3LibPidFile.cpp  |  108 +
 .../Additions/common/VBoxService/VBoxService.cpp   |   50 +-
 .../common/VBoxService/VBoxServiceControl.cpp      |    6 +-
 .../common/VBoxService/VBoxServiceControl.h        |   10 +-
 .../VBoxService/VBoxServiceControlProcess.cpp      |   13 +-
 .../VBoxService/VBoxServiceControlSession.cpp      |  748 +++---
 .../common/VBoxService/VBoxServiceInternal.h       |   12 +-
 .../common/VBoxService/VBoxServiceVMInfo.cpp       |   53 +-
 .../Additions/common/crOpenGL/pack/packspu_get.py  |    0
 src/VBox/Additions/common/crOpenGL/stub_common.py  |    0
 .../Additions/linux/installer/vboxadd-service.sh   |   13 +-
 .../linux/lightdm-greeter/vbox-greeter.cpp         |    2 +-
 src/VBox/Devices/Audio/DrvHostDSound.cpp           |  133 +-
 src/VBox/Devices/Audio/DrvHostNullAudio.cpp        |   25 +-
 src/VBox/Devices/EFI/DevEFI.cpp                    |   17 +-
 .../BaseTools/Source/C/PyEfiCompressor/setup.py    |    0
 .../Firmware/BaseTools/Source/C/PyUtility/setup.py |    0
 .../BaseTools/Source/Python/AutoGen/AutoGen.py     |    0
 .../BaseTools/Source/Python/AutoGen/BuildEngine.py |    0
 .../BaseTools/Source/Python/AutoGen/GenC.py        |    0
 .../BaseTools/Source/Python/AutoGen/GenDepex.py    |    0
 .../BaseTools/Source/Python/AutoGen/GenMake.py     |    0
 .../BaseTools/Source/Python/AutoGen/StrGather.py   |    0
 .../Source/Python/AutoGen/UniClassObject.py        |    0
 .../Firmware/BaseTools/Source/Python/BPDG/BPDG.py  |    0
 .../BaseTools/Source/Python/BPDG/GenVpd.py         |    0
 .../BaseTools/Source/Python/Common/Database.py     |    0
 .../Source/Python/Common/DecClassObject.py         |    0
 .../BaseTools/Source/Python/Common/Dictionary.py   |    0
 .../Source/Python/Common/DscClassObject.py         |    0
 .../Source/Python/Common/EdkIIWorkspace.py         |    0
 .../Source/Python/Common/EdkIIWorkspaceBuild.py    |    0
 .../BaseTools/Source/Python/Common/EdkLogger.py    |    0
 .../BaseTools/Source/Python/Common/Expression.py   |    0
 .../Source/Python/Common/FdfClassObject.py         |    0
 .../Source/Python/Common/FdfParserLite.py          |    0
 .../Source/Python/Common/Identification.py         |    0
 .../Source/Python/Common/InfClassObject.py         |    0
 .../Source/Python/Common/MigrationUtilities.py     |    0
 .../BaseTools/Source/Python/Common/Misc.py         |    0
 .../BaseTools/Source/Python/Common/Parsing.py      |    0
 .../BaseTools/Source/Python/Common/String.py       |    0
 .../Source/Python/Common/TargetTxtClassObject.py   |    0
 .../Source/Python/Common/ToolDefClassObject.py     |    0
 .../BaseTools/Source/Python/Common/VpdInfoFile.py  |    0
 .../Source/Python/CommonDataClass/CommonClass.py   |    0
 .../Source/Python/CommonDataClass/FdfClass.py      |    0
 .../Source/Python/CommonDataClass/ModuleClass.py   |    0
 .../Source/Python/CommonDataClass/PackageClass.py  |    0
 .../Source/Python/CommonDataClass/PlatformClass.py |    0
 .../Firmware/BaseTools/Source/Python/Ecc/CLexer.py |    0
 .../BaseTools/Source/Python/Ecc/CParser.py         |    0
 .../Firmware/BaseTools/Source/Python/Ecc/Check.py  |    0
 .../BaseTools/Source/Python/Ecc/CodeFragment.py    |    0
 .../Source/Python/Ecc/CodeFragmentCollector.py     |    0
 .../BaseTools/Source/Python/Ecc/Configuration.py   |    0
 .../BaseTools/Source/Python/Ecc/Database.py        |    0
 .../Firmware/BaseTools/Source/Python/Ecc/Ecc.py    |    0
 .../BaseTools/Source/Python/Ecc/Exception.py       |    0
 .../BaseTools/Source/Python/Ecc/FileProfile.py     |    0
 .../BaseTools/Source/Python/Ecc/MetaDataParser.py  |    0
 .../Python/Ecc/MetaFileWorkspace/MetaDataTable.py  |    0
 .../Python/Ecc/MetaFileWorkspace/MetaFileParser.py |    0
 .../Python/Ecc/MetaFileWorkspace/MetaFileTable.py  |    0
 .../BaseTools/Source/Python/Ecc/ParserWarning.py   |    0
 .../BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py |    0
 .../EFI/Firmware/BaseTools/Source/Python/Ecc/c.py  |    0
 .../Firmware/BaseTools/Source/Python/Eot/CLexer.py |    0
 .../BaseTools/Source/Python/Eot/CParser.py         |    0
 .../BaseTools/Source/Python/Eot/CodeFragment.py    |    0
 .../Source/Python/Eot/CodeFragmentCollector.py     |    0
 .../BaseTools/Source/Python/Eot/Database.py        |    0
 .../Firmware/BaseTools/Source/Python/Eot/Eot.py    |    0
 .../BaseTools/Source/Python/Eot/EotGlobalData.py   |    0
 .../BaseTools/Source/Python/Eot/FileProfile.py     |    0
 .../BaseTools/Source/Python/Eot/FvImage.py         |    0
 .../BaseTools/Source/Python/Eot/InfParserLite.py   |    0
 .../Firmware/BaseTools/Source/Python/Eot/Parser.py |    0
 .../BaseTools/Source/Python/Eot/ParserWarning.py   |    0
 .../Firmware/BaseTools/Source/Python/Eot/Report.py |    0
 .../EFI/Firmware/BaseTools/Source/Python/Eot/c.py  |    0
 .../Source/Python/GenFds/AprioriSection.py         |    0
 .../BaseTools/Source/Python/GenFds/Attribute.py    |    0
 .../BaseTools/Source/Python/GenFds/Capsule.py      |    0
 .../BaseTools/Source/Python/GenFds/CapsuleData.py  |    0
 .../Source/Python/GenFds/ComponentStatement.py     |    0
 .../Source/Python/GenFds/CompressSection.py        |    0
 .../BaseTools/Source/Python/GenFds/DataSection.py  |    0
 .../BaseTools/Source/Python/GenFds/DepexSection.py |    0
 .../BaseTools/Source/Python/GenFds/EfiSection.py   |    0
 .../Firmware/BaseTools/Source/Python/GenFds/Fd.py  |    0
 .../BaseTools/Source/Python/GenFds/FdfParser.py    |    0
 .../Firmware/BaseTools/Source/Python/GenFds/Ffs.py |    0
 .../Source/Python/GenFds/FfsFileStatement.py       |    0
 .../Source/Python/GenFds/FfsInfStatement.py        |    0
 .../Firmware/BaseTools/Source/Python/GenFds/Fv.py  |    0
 .../Source/Python/GenFds/FvImageSection.py         |    0
 .../BaseTools/Source/Python/GenFds/GenFds.py       |    0
 .../Source/Python/GenFds/GenFdsGlobalVariable.py   |    0
 .../BaseTools/Source/Python/GenFds/GuidSection.py  |    0
 .../Source/Python/GenFds/OptRomFileStatement.py    |    0
 .../Source/Python/GenFds/OptRomInfStatement.py     |    0
 .../BaseTools/Source/Python/GenFds/OptionRom.py    |    0
 .../BaseTools/Source/Python/GenFds/Region.py       |    0
 .../BaseTools/Source/Python/GenFds/Rule.py         |    0
 .../Source/Python/GenFds/RuleComplexFile.py        |    0
 .../Source/Python/GenFds/RuleSimpleFile.py         |    0
 .../BaseTools/Source/Python/GenFds/Section.py      |    0
 .../BaseTools/Source/Python/GenFds/UiSection.py    |    0
 .../BaseTools/Source/Python/GenFds/VerSection.py   |    0
 .../Firmware/BaseTools/Source/Python/GenFds/Vtf.py |    0
 .../Python/GenPatchPcdTable/GenPatchPcdTable.py    |    0
 .../Source/Python/PatchPcdValue/PatchPcdValue.py   |    0
 .../BaseTools/Source/Python/Table/Table.py         |    0
 .../Source/Python/Table/TableDataModel.py          |    0
 .../BaseTools/Source/Python/Table/TableDec.py      |    0
 .../BaseTools/Source/Python/Table/TableDsc.py      |    0
 .../Source/Python/Table/TableEotReport.py          |    0
 .../BaseTools/Source/Python/Table/TableFdf.py      |    0
 .../BaseTools/Source/Python/Table/TableFile.py     |    0
 .../BaseTools/Source/Python/Table/TableFunction.py |    0
 .../Source/Python/Table/TableIdentifier.py         |    0
 .../BaseTools/Source/Python/Table/TableInf.py      |    0
 .../BaseTools/Source/Python/Table/TablePcd.py      |    0
 .../BaseTools/Source/Python/Table/TableQuery.py    |    0
 .../BaseTools/Source/Python/Table/TableReport.py   |    0
 .../Source/Python/TargetTool/TargetTool.py         |    0
 .../Firmware/BaseTools/Source/Python/Trim/Trim.py  |    0
 .../Source/Python/UPT/Core/DependencyRules.py      |    0
 .../Python/UPT/Core/DistributionPackageClass.py    |    0
 .../BaseTools/Source/Python/UPT/Core/IpiDb.py      |    0
 .../Source/Python/UPT/Core/PackageFile.py          |    0
 .../Source/Python/UPT/GenMetaFile/GenDecFile.py    |    0
 .../Source/Python/UPT/GenMetaFile/GenInfFile.py    |    0
 .../Python/UPT/GenMetaFile/GenMetaFileMisc.py      |    0
 .../BaseTools/Source/Python/UPT/InstallPkg.py      |    0
 .../Source/Python/UPT/Library/CommentGenerating.py |    0
 .../Source/Python/UPT/Library/CommentParsing.py    |    0
 .../Python/UPT/Library/ExpressionValidate.py       |    0
 .../BaseTools/Source/Python/UPT/Library/Misc.py    |    0
 .../Source/Python/UPT/Library/ParserValidate.py    |    0
 .../BaseTools/Source/Python/UPT/Library/Parsing.py |    0
 .../BaseTools/Source/Python/UPT/Library/String.py  |    0
 .../Source/Python/UPT/Library/Xml/XmlRoutines.py   |    0
 .../BaseTools/Source/Python/UPT/Logger/Log.py      |    0
 .../Firmware/BaseTools/Source/Python/UPT/MkPkg.py  |    0
 .../Source/Python/UPT/Object/POM/CommonObject.py   |    0
 .../Source/Python/UPT/Object/POM/ModuleObject.py   |    0
 .../Source/Python/UPT/Object/POM/PackageObject.py  |    0
 .../Source/Python/UPT/Object/Parser/DecObject.py   |    0
 .../Python/UPT/Object/Parser/InfBinaryObject.py    |    0
 .../UPT/Object/Parser/InfBuildOptionObject.py      |    0
 .../Python/UPT/Object/Parser/InfCommonObject.py    |    0
 .../UPT/Object/Parser/InfDefineCommonObject.py     |    0
 .../Python/UPT/Object/Parser/InfDefineObject.py    |    0
 .../Python/UPT/Object/Parser/InfDepexObject.py     |    0
 .../Python/UPT/Object/Parser/InfGuidObject.py      |    0
 .../Python/UPT/Object/Parser/InfHeaderObject.py    |    0
 .../UPT/Object/Parser/InfLibraryClassesObject.py   |    0
 .../Source/Python/UPT/Object/Parser/InfMisc.py     |    0
 .../Python/UPT/Object/Parser/InfPackagesObject.py  |    0
 .../Python/UPT/Object/Parser/InfPcdObject.py       |    0
 .../Python/UPT/Object/Parser/InfPpiObject.py       |    0
 .../Python/UPT/Object/Parser/InfProtocolObject.py  |    0
 .../Python/UPT/Object/Parser/InfSoucesObject.py    |    0
 .../UPT/Object/Parser/InfUserExtensionObject.py    |    0
 .../Source/Python/UPT/Parser/DecParser.py          |    0
 .../Source/Python/UPT/Parser/DecParserMisc.py      |    0
 .../Source/Python/UPT/Parser/InfAsBuiltProcess.py  |    0
 .../Python/UPT/Parser/InfBinarySectionParser.py    |    0
 .../UPT/Parser/InfBuildOptionSectionParser.py      |    0
 .../Python/UPT/Parser/InfDefineSectionParser.py    |    0
 .../Python/UPT/Parser/InfDepexSectionParser.py     |    0
 .../UPT/Parser/InfGuidPpiProtocolSectionParser.py  |    0
 .../Python/UPT/Parser/InfLibrarySectionParser.py   |    0
 .../Python/UPT/Parser/InfPackageSectionParser.py   |    0
 .../Source/Python/UPT/Parser/InfParser.py          |    0
 .../Source/Python/UPT/Parser/InfParserMisc.py      |    0
 .../Python/UPT/Parser/InfPcdSectionParser.py       |    0
 .../Source/Python/UPT/Parser/InfSectionParser.py   |    0
 .../Python/UPT/Parser/InfSourceSectionParser.py    |    0
 .../Python/UPT/PomAdapter/DecPomAlignment.py       |    0
 .../Python/UPT/PomAdapter/InfPomAlignment.py       |    0
 .../Python/UPT/PomAdapter/InfPomAlignmentMisc.py   |    0
 .../Firmware/BaseTools/Source/Python/UPT/RmPkg.py  |    0
 .../Firmware/BaseTools/Source/Python/UPT/UPT.py    |    0
 .../UPT/UnitTest/CommentGeneratingUnitTest.py      |    0
 .../Python/UPT/UnitTest/CommentParsingUnitTest.py  |    0
 .../Source/Python/UPT/UnitTest/DecParserTest.py    |    0
 .../Python/UPT/UnitTest/DecParserUnitTest.py       |    0
 .../Python/UPT/UnitTest/InfBinarySectionTest.py    |    0
 .../BaseTools/Source/Python/UPT/Xml/CommonXml.py   |    0
 .../Source/Python/UPT/Xml/GuidProtocolPpiXml.py    |    0
 .../BaseTools/Source/Python/UPT/Xml/IniToXml.py    |    0
 .../Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py  |    0
 .../Source/Python/UPT/Xml/PackageSurfaceAreaXml.py |    0
 .../BaseTools/Source/Python/UPT/Xml/PcdXml.py      |    0
 .../BaseTools/Source/Python/UPT/Xml/XmlParser.py   |    0
 .../Source/Python/UPT/Xml/XmlParserMisc.py         |    0
 .../Source/Python/Workspace/BuildClassObject.py    |    0
 .../Source/Python/Workspace/MetaDataTable.py       |    0
 .../Source/Python/Workspace/MetaFileParser.py      |    0
 .../Source/Python/Workspace/MetaFileTable.py       |    0
 .../Source/Python/Workspace/WorkspaceDatabase.py   |    0
 .../BaseTools/Source/Python/build/BuildReport.py   |    0
 .../BaseTools/Source/Python/build/build.py         |    0
 .../Firmware/UefiCpuPkg/ResetVector/Vtf0/Build.py  |    0
 .../ResetVector/Vtf0/Tools/FixupForRawSection.py   |    0
 src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd      |  Bin 1048576 -> 1048576 bytes
 src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd      |  Bin 1048576 -> 1048576 bytes
 .../Graphics/BIOS/VBoxVgaBiosAlternative.asm       |    6 +-
 .../Graphics/BIOS/VBoxVgaBiosAlternative.md5sum    |    2 +-
 src/VBox/Devices/Graphics/DevVGA-SVGA.cpp          |   11 +
 src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.h    |    1 +
 src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.m    |   99 +-
 src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp    |   31 +-
 src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp    |    5 +
 src/VBox/Devices/Graphics/DevVGA-SVGA3d.h          |    1 +
 src/VBox/Devices/Graphics/DevVGA_VBVA.cpp          |    2 +-
 src/VBox/Devices/Graphics/VBoxSVGA3DObjC.def       |    1 +
 src/VBox/Devices/Graphics/shaderlib/directx.c      |    2 +-
 src/VBox/Devices/Makefile.kmk                      |   10 -
 src/VBox/Devices/Network/DrvNAT.cpp                |    2 +
 src/VBox/Devices/Network/SrvIntNetR0.cpp           |   16 +-
 src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm   |    4 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative.md5sum     |    2 +-
 src/VBox/Devices/PC/DevACPI.cpp                    |   69 +-
 src/VBox/Devices/PC/vbox.dsl                       |   69 +-
 src/VBox/Devices/Parallel/DevParallel.cpp          |   48 +-
 src/VBox/Devices/Serial/DrvHostSerial.cpp          |   20 +-
 src/VBox/Devices/Serial/DrvNamedPipe.cpp           |   18 +-
 src/VBox/Devices/Storage/DevAHCI.cpp               |    1 +
 src/VBox/Devices/USB/VUSBDevice.cpp                |    3 +-
 .../Devices/USB/darwin/USBProxyDevice-darwin.cpp   |   10 -
 src/VBox/Devices/build/VBoxDDUDeps.cpp             |    3 +-
 .../VBoxDTrace/onnv/cmd/dtrace/demo/mkdemo.pl      |    0
 .../dtrace/test/tst/common/ip/tst.ipv4localtcp.ksh |    0
 .../dtrace/test/tst/common/ip/tst.ipv4localudp.ksh |    0
 .../test/tst/common/ip/tst.ipv4remotetcp.ksh       |    0
 .../test/tst/common/ip/tst.ipv4remoteudp.ksh       |    0
 .../test/tst/common/ip/tst.localtcpstate.ksh       |    0
 .../test/tst/common/ip/tst.remotetcpstate.ksh      |    0
 .../scripting/err.D_MACRO_UNDEF.invalidargs.d      |    0
 .../tst/common/scripting/err.D_OP_LVAL.rdonly.d    |    0
 .../common/scripting/err.D_OP_WRITE.usepidmacro.d  |    0
 .../test/tst/common/scripting/err.D_SYNTAX.inval.d |    0
 .../test/tst/common/scripting/err.D_SYNTAX.pid.d   |    0
 .../dtrace/test/tst/common/scripting/tst.arg0.d    |    0
 .../dtrace/test/tst/common/scripting/tst.assign.d  |    0
 .../dtrace/test/tst/common/scripting/tst.basic.d   |    0
 .../dtrace/test/tst/common/scripting/tst.egid.d    |    0
 .../dtrace/test/tst/common/scripting/tst.euid.d    |    0
 .../cmd/dtrace/test/tst/common/scripting/tst.gid.d |    0
 .../dtrace/test/tst/common/scripting/tst.pgid.d    |    0
 .../cmd/dtrace/test/tst/common/scripting/tst.pid.d |    0
 .../dtrace/test/tst/common/scripting/tst.ppid.d    |    0
 .../dtrace/test/tst/common/scripting/tst.projid.d  |    0
 .../dtrace/test/tst/common/scripting/tst.quite.d   |    0
 .../cmd/dtrace/test/tst/common/scripting/tst.sid.d |    0
 .../dtrace/test/tst/common/scripting/tst.taskid.d  |    0
 .../dtrace/test/tst/common/scripting/tst.trace.d   |    0
 .../cmd/dtrace/test/tst/common/scripting/tst.uid.d |    0
 .../err.D_ACT_SPEC.SpeculateWithBreakPoint.d       |    0
 .../err.D_ACT_SPEC.SpeculateWithChill.d            |    0
 .../err.D_ACT_SPEC.SpeculateWithCopyOut.d          |    0
 .../err.D_ACT_SPEC.SpeculateWithCopyOutStr.d       |    0
 .../err.D_ACT_SPEC.SpeculateWithPanic.d            |    0
 .../err.D_ACT_SPEC.SpeculateWithRaise.d            |    0
 .../speculation/err.D_ACT_SPEC.SpeculateWithStop.d |    0
 .../dtrace/test/tst/common/usdt/tst.corruptenv.ksh |    0
 .../onnv/lib/libdtrace/common/mkerrtags.sh         |    0
 src/VBox/ExtPacks/VNC/VBoxVNC.cpp                  |    4 +-
 .../Frontends/VBoxManage/VBoxManageDebugVM.cpp     |   16 +-
 src/VBox/Frontends/VirtualBox/Makefile.kmk         |   63 +-
 src/VBox/Frontends/VirtualBox/images/OSE/about.png |  Bin 153570 -> 151159 bytes
 .../VirtualBox/images/OSE/about_hidpi.png          |  Bin 384157 -> 379687 bytes
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts |   16 +-
 .../Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts   |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts |    8 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts |    8 +-
 .../Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts   |    8 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts |   12 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts |   14 +-
 .../Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts   |   14 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts |    8 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts |   16 +-
 .../Frontends/VirtualBox/nls/VirtualBox_km_KH.ts   |   10 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts |   18 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts |   20 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts |    8 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts |   14 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts |   10 +-
 .../Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts   |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts |    8 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts |   14 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts |   14 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts |   16 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts |    8 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts |   16 +-
 .../Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts   |    4 +-
 .../Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts   |   12 +-
 .../Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts   |    8 +-
 .../Frontends/VirtualBox/src/UIVMLogViewer.cpp     |    4 +-
 src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.cpp |  165 +-
 src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h   |   61 +-
 .../VirtualBox/src/converter/UIConverterBackend.h  |    1 +
 .../src/converter/UIConverterBackendGlobal.cpp     |   29 +
 .../VirtualBox/src/extensions/QIMessageBox.cpp     |   32 +-
 .../VirtualBox/src/extensions/QIMessageBox.h       |   14 +-
 .../VirtualBox/src/globals/UIActionPool.cpp        |    9 +-
 src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h |    6 +-
 .../VirtualBox/src/globals/UIMainEventListener.cpp |    7 +
 .../VirtualBox/src/globals/UIMainEventListener.h   |    2 +
 .../VirtualBox/src/globals/UIMessageCenter.cpp     |   96 +-
 .../VirtualBox/src/globals/UIMessageCenter.h       |    3 +-
 .../VirtualBox/src/globals/UIShortcutPool.cpp      |   33 +-
 .../VirtualBox/src/globals/UIShortcutPool.h        |    1 +
 .../VirtualBox/src/globals/UIThreadPool.cpp        |  248 +-
 .../VirtualBox/src/globals/UIThreadPool.h          |  122 +-
 .../VirtualBox/src/globals/VBoxGlobal.cpp          |   53 +-
 .../Frontends/VirtualBox/src/globals/VBoxGlobal.h  |   16 +-
 src/VBox/Frontends/VirtualBox/src/main.cpp         |   24 +-
 .../VirtualBox/src/medium/UIMediumEnumerator.cpp   |   77 +-
 .../VirtualBox/src/medium/UIMediumEnumerator.h     |    9 +-
 .../VirtualBox/src/net/UINetworkReply.cpp          |  306 +--
 .../VirtualBox/src/net/tstSSLCertDownloads.cpp     |  165 ++
 .../src/platform/darwin/VBoxUtils-darwin-cocoa.mm  |   17 +
 .../src/platform/darwin/VBoxUtils-darwin.cpp       |    5 +
 .../src/platform/darwin/VBoxUtils-darwin.h         |   14 +
 .../VirtualBox/src/runtime/UIActionPoolRuntime.cpp |    5 +-
 .../VirtualBox/src/runtime/UIActionPoolRuntime.h   |    4 +-
 .../src/runtime/UIConsoleEventHandler.cpp          |    4 +
 .../VirtualBox/src/runtime/UIConsoleEventHandler.h |    2 +
 .../VirtualBox/src/runtime/UIMachineLogic.cpp      |    2 +-
 .../Frontends/VirtualBox/src/runtime/UISession.cpp |  172 +-
 .../Frontends/VirtualBox/src/runtime/UISession.h   |    7 +
 .../src/runtime/normal/UIMachineWindowNormal.cpp   |    4 +
 .../src/runtime/scale/UIMachineWindowScale.cpp     |    4 +
 .../src/selector/UIActionPoolSelector.cpp          |    5 +-
 .../VirtualBox/src/selector/UIActionPoolSelector.h |    4 +-
 .../graphics/details/UIGDetailsElements.cpp        | 1522 +++++-------
 .../selector/graphics/details/UIGDetailsElements.h |  444 ++--
 .../VirtualBox/src/settings/UISettingsDefs.cpp     |    8 +-
 .../VirtualBox/src/settings/UISettingsDefs.h       |   16 +-
 .../VirtualBox/src/settings/UISettingsPage.h       |    7 +-
 .../settings/machine/UIMachineSettingsNetwork.cpp  |    2 +-
 .../settings/machine/UIMachineSettingsStorage.cpp  |    2 +-
 .../VirtualBox/src/widgets/UIFilmContainer.cpp     |    0
 src/VBox/GuestHost/OpenGL/packer/pack_current.py   |    0
 .../GuestHost/OpenGL/packer/pack_currentheader.py  |    0
 src/VBox/GuestHost/OpenGL/packer/packer.py         |    0
 src/VBox/GuestHost/OpenGL/state_tracker/convert.py |    0
 .../GuestHost/OpenGL/state_tracker/dump_gen.py     |    0
 .../OpenGL/state_tracker/state_current.py          |    0
 .../GuestHost/OpenGL/state_tracker/state_get.py    |    0
 src/VBox/HostDrivers/Support/Makefile.kmk          |    6 +
 src/VBox/HostDrivers/Support/SUPDrv.cpp            |    2 +-
 src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp |    2 +-
 .../HostDrivers/Support/darwin/SUPDrv-darwin.cpp   |    4 +-
 src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c  |   16 +-
 .../VBoxNetAdp/linux/VBoxNetAdp-linux.c            |    7 +-
 .../HostDrivers/VBoxNetAdp/win/VBoxNetAdp-win.cpp  |    2 +
 .../VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c     |    2 +-
 .../VBoxNetFlt/win/drv/VBoxNetLwf-win.cpp          |  145 +-
 src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp    |    5 +-
 src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp        |    8 +-
 src/VBox/HostServices/DragAndDrop/service.cpp      |   12 +-
 src/VBox/HostServices/GuestProperties/service.cpp  |  163 ++
 src/VBox/HostServices/SharedFolders/vbsf.cpp       |   11 +-
 src/VBox/HostServices/SharedFolders/vbsfpath.cpp   |   13 +-
 src/VBox/HostServices/SharedFolders/vbsfpath.h     |    6 +-
 .../SharedOpenGL/crserverlib/server_simpleget.py   |    0
 .../HostServices/SharedOpenGL/dlm/dlm_generated.py |    0
 src/VBox/Installer/linux/Makefile.kmk              |    8 +
 src/VBox/Installer/linux/VBox.sh                   |    4 +-
 src/VBox/Installer/linux/install.sh                |  141 +-
 src/VBox/Installer/linux/postinst-common.sh        |   74 +
 src/VBox/Installer/linux/prerm-common.sh           |   90 +
 src/VBox/Installer/linux/routines.sh               |  234 +-
 src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec  |  180 +-
 src/VBox/Installer/linux/rpm/rules                 |   58 +-
 src/VBox/Installer/linux/run-inst.sh               |    2 -
 src/VBox/Installer/linux/uninstall.sh              |   37 +-
 src/VBox/Installer/linux/vboxdrv.sh.in             |    4 +-
 src/VBox/Main/glue/constants-python.xsl            |    0
 src/VBox/Main/glue/vboxapi.py                      |    0
 src/VBox/Main/idl/VirtualBox.xidl                  |    2 +-
 src/VBox/Main/include/HostUSBDeviceImpl.h          |    2 +-
 src/VBox/Main/include/MachineImpl.h                |    4 +-
 src/VBox/Main/include/NATEngineImpl.h              |   10 +-
 src/VBox/Main/include/NetworkAdapterImpl.h         |    3 +-
 src/VBox/Main/include/ParallelPortImpl.h           |    3 +-
 src/VBox/Main/include/USBProxyService.h            |    6 -
 src/VBox/Main/src-client/ConsoleImpl2.cpp          |   23 +-
 src/VBox/Main/src-server/HostUSBDeviceImpl.cpp     |   45 +-
 src/VBox/Main/src-server/MachineImpl.cpp           |   70 +-
 src/VBox/Main/src-server/NATEngineImpl.cpp         |  116 +-
 src/VBox/Main/src-server/NetworkAdapterImpl.cpp    |   37 +-
 src/VBox/Main/src-server/ParallelPortImpl.cpp      |   44 +-
 src/VBox/Main/src-server/USBProxyService.cpp       |    4 +-
 .../src-server/darwin/USBProxyServiceDarwin.cpp    |   51 +-
 src/VBox/Main/src-server/linux/HostPowerLinux.cpp  |   17 +-
 src/VBox/Runtime/Makefile.kmk                      |   97 +-
 ...RTCrStoreCertAddWantedFromFishingExpedition.cpp |   12 +-
 src/VBox/Runtime/common/crypto/tsp-template.h      |    6 +-
 src/VBox/Runtime/common/misc/http.cpp              |  898 -------
 src/VBox/Runtime/common/misc/uri.cpp               |  954 ++++----
 src/VBox/Runtime/common/path/RTPathGlob.cpp        |   17 +-
 src/VBox/Runtime/common/string/memrchr.asm         |   90 +
 src/VBox/Runtime/common/vfs/vfsmisc.cpp            |    3 +-
 src/VBox/Runtime/common/vfs/vfsstdpipe.cpp         |  317 +++
 .../RTCrStoreCreateSnapshotById-generic.cpp        |   14 +-
 src/VBox/Runtime/generic/env-generic.cpp           |   79 +
 src/VBox/Runtime/generic/http-curl.cpp             | 2455 ++++++++++++++++++++
 src/VBox/Runtime/include/internal/pipe.h           |   38 +
 src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp   |    3 +
 src/VBox/Runtime/r3/nt/direnum-r3-nt.cpp           |    5 +-
 src/VBox/Runtime/r3/os2/pipe-os2.cpp               |   29 +
 src/VBox/Runtime/r3/posix/pipe-posix.cpp           |   45 +
 .../Runtime/r3/posix/process-creation-posix.cpp    |  259 ++-
 src/VBox/Runtime/r3/posix/process-posix.cpp        |  119 +-
 .../Runtime/r3/win/RTSystemQueryTotalRam-win.cpp   |   86 +-
 src/VBox/Runtime/r3/win/VBoxRT-msvcp100-win32.def  | 1678 +++++++++++++
 src/VBox/Runtime/r3/win/VBoxRT-msvcr100-win32.def  | 1641 +++++++++++++
 src/VBox/Runtime/r3/win/VBoxRT-openssl.def         |    2 +-
 src/VBox/Runtime/r3/win/init-win.cpp               |   10 +
 src/VBox/Runtime/r3/win/internal-r3-win.h          |    2 +
 src/VBox/Runtime/r3/win/pipe-win.cpp               |   38 +-
 src/VBox/Runtime/r3/win/process-win.cpp            | 1938 ++++++++++-----
 src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp  |  294 ++-
 src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm |   12 +
 src/VBox/Runtime/r3/win/vcc100-msvcrt-fakes.cpp    |   82 +
 ...ueryTotalRam-win.cpp => vcc100-ntdll-fakes.cpp} |   64 +-
 ...kernel32-fakesA.asm => vcc100-ntdll-fakesA.asm} |    9 +-
 src/VBox/Runtime/r3/win/vcc100-ws2_32-fakes.cpp    |  103 +
 ...ernel32-fakesA.asm => vcc100-ws2_32-fakesA.asm} |   10 +-
 src/VBox/Runtime/testcase/tstRTProcCreateEx.cpp    |  353 ++-
 .../Runtime/testcase/tstRTProcQueryUsername.cpp    |   36 +-
 src/VBox/Runtime/testcase/tstRTUri.cpp             |  555 ++---
 src/VBox/Runtime/tools/Makefile.kmk                |    7 +
 src/VBox/Runtime/tools/RTHttp.cpp                  |  157 ++
 src/VBox/Runtime/win/RTErrConvertFromWin32.cpp     |   11 +-
 src/VBox/VMM/Makefile.kmk                          |    3 +
 src/VBox/VMM/VMMR3/PDMDriver.cpp                   |    7 +-
 src/VBox/VMM/VMMR3/VM.cpp                          |    6 +-
 src/VBox/ValidationKit/common/__init__.py          |    0
 .../ValidationKit/common/constants/__init__.py     |    0
 src/VBox/ValidationKit/common/utils.py             |    0
 src/VBox/ValidationKit/common/webutils.py          |    0
 src/VBox/ValidationKit/testanalysis/diff.py        |    0
 src/VBox/ValidationKit/testanalysis/reader.py      |    0
 src/VBox/ValidationKit/testanalysis/reporting.py   |    0
 .../ValidationKit/testboxscript/testboxcommand.py  |    0
 .../ValidationKit/testboxscript/testboxcommons.py  |    0
 .../testboxscript/testboxconnection.py             |    0
 .../ValidationKit/testboxscript/testboxtasks.py    |    0
 .../ValidationKit/testboxscript/testboxupgrade.py  |    0
 src/VBox/ValidationKit/testdriver/base.py          |    0
 src/VBox/ValidationKit/testdriver/reporter.py      |    0
 src/VBox/ValidationKit/testdriver/tst-txsclient.py |    0
 src/VBox/ValidationKit/testdriver/txsclient.py     |    0
 src/VBox/ValidationKit/testdriver/vbox.py          |    0
 src/VBox/ValidationKit/testdriver/vboxcon.py       |    0
 src/VBox/ValidationKit/testdriver/vboxtestvms.py   |    0
 src/VBox/ValidationKit/testdriver/vboxwrappers.py  |    0
 src/VBox/ValidationKit/testdriver/winbase.py       |    0
 src/VBox/ValidationKit/testmanager/core/base.py    |    0
 src/VBox/ValidationKit/testmanager/core/build.py   |    0
 .../testmanager/core/buildblacklist.py             |    0
 .../ValidationKit/testmanager/core/buildsource.py  |    0
 src/VBox/ValidationKit/testmanager/core/db.py      |    0
 .../ValidationKit/testmanager/core/dbobjcache.py   |    0
 .../testmanager/core/failurecategory.py            |    0
 .../testmanager/core/failurereason.py              |    0
 .../testmanager/core/globalresource.py             |    0
 src/VBox/ValidationKit/testmanager/core/report.py  |    0
 .../ValidationKit/testmanager/core/schedgroup.py   |    0
 .../testmanager/core/schedulerbase.py              |    0
 .../testmanager/core/schedulerbeci.py              |    0
 .../ValidationKit/testmanager/core/systemlog.py    |    0
 src/VBox/ValidationKit/testmanager/core/testbox.py |    0
 .../testmanager/core/testboxcontroller.py          |    4 +-
 .../testmanager/core/testboxstatus.py              |    0
 .../ValidationKit/testmanager/core/testcase.py     |    0
 .../ValidationKit/testmanager/core/testcaseargs.py |    0
 .../ValidationKit/testmanager/core/testgroup.py    |    0
 .../ValidationKit/testmanager/core/testresults.py  |   17 +-
 src/VBox/ValidationKit/testmanager/core/testset.py |    0
 .../ValidationKit/testmanager/core/useraccount.py  |    0
 .../ValidationKit/testmanager/core/vcsrevisions.py |    0
 .../testmanager/core/webservergluebase.py          |    0
 .../testmanager/core/webservergluecgi.py           |    0
 .../ValidationKit/testmanager/webui/wuiadmin.py    |    0
 .../testmanager/webui/wuiadminbuild.py             |    0
 .../testmanager/webui/wuiadminbuildblacklist.py    |    0
 .../testmanager/webui/wuiadminbuildcategory.py     |    0
 .../testmanager/webui/wuiadminbuildsource.py       |    0
 .../testmanager/webui/wuiadminfailurereason.py     |    0
 .../testmanager/webui/wuiadminglobalrsrc.py        |    0
 .../testmanager/webui/wuiadminschedgroup.py        |    0
 .../testmanager/webui/wuiadminsystemlog.py         |    0
 .../testmanager/webui/wuiadmintestbox.py           |    0
 .../testmanager/webui/wuiadmintestcase.py          |    0
 .../testmanager/webui/wuiadmintestgroup.py         |    0
 .../testmanager/webui/wuiadminuseraccount.py       |    0
 .../ValidationKit/testmanager/webui/wuibase.py     |    0
 .../testmanager/webui/wuicontentbase.py            |    0
 .../testmanager/webui/wuifailurecategory.py        |    0
 .../ValidationKit/testmanager/webui/wuigraphwiz.py |    0
 .../ValidationKit/testmanager/webui/wuihlpform.py  |    0
 .../ValidationKit/testmanager/webui/wuihlpgraph.py |    0
 .../testmanager/webui/wuihlpgraphbase.py           |    0
 .../testmanager/webui/wuihlpgraphgooglechart.py    |    0
 .../testmanager/webui/wuihlpgraphmatplotlib.py     |    0
 .../testmanager/webui/wuihlpgraphsimple.py         |    0
 .../testmanager/webui/wuilogviewer.py              |    0
 .../ValidationKit/testmanager/webui/wuimain.py     |    0
 .../ValidationKit/testmanager/webui/wuireport.py   |    0
 .../testmanager/webui/wuitestresult.py             |    0
 .../testmanager/webui/wuivcshistory.py             |    0
 src/VBox/ValidationKit/tests/usb/usbgadget.py      |    0
 src/libs/kStuff/Makefile.kmk                       |    2 +-
 src/libs/liblzf-3.4/Makefile.kmk                   |    2 +-
 src/libs/xpcom18a4/nsprpub/Makefile.in             |    0
 src/libs/xpcom18a4/nsprpub/config/config.mk        |    0
 src/libs/xpcom18a4/nsprpub/config/rules.mk         |    0
 src/libs/xpcom18a4/python/__init__.py              |    0
 src/libs/xpcom18a4/python/client/__init__.py       |    0
 src/libs/xpcom18a4/python/components.py            |    0
 src/libs/xpcom18a4/python/file.py                  |    0
 src/libs/xpcom18a4/python/nsError.py               |    0
 src/libs/xpcom18a4/python/primitives.py            |    0
 src/libs/xpcom18a4/python/server/__init__.py       |    0
 src/libs/xpcom18a4/python/server/enumerator.py     |    0
 src/libs/xpcom18a4/python/server/factory.py        |    0
 src/libs/xpcom18a4/python/server/loader.py         |    0
 src/libs/xpcom18a4/python/server/module.py         |    0
 src/libs/xpcom18a4/python/server/policy.py         |    0
 .../xpcom18a4/python/test/pyxpcom_test_tools.py    |    0
 .../xpcom18a4/python/test/test_com_exceptions.py   |    0
 src/libs/xpcom18a4/python/test/test_comfile.py     |    0
 .../test/test_component/py_test_component.py       |    0
 src/libs/xpcom18a4/python/test/test_components.py  |    0
 .../python/test/test_isupports_primitives.py       |    0
 src/libs/xpcom18a4/python/test/test_misc.py        |    0
 src/libs/xpcom18a4/python/test/test_streams.py     |    0
 .../xpcom18a4/python/test/test_test_component.py   |    0
 .../xpcom18a4/python/test/test_weakreferences.py   |    0
 src/libs/xpcom18a4/python/tools/regxpcom.py        |    0
 src/libs/xpcom18a4/python/tools/tracer_demo.py     |    0
 src/libs/xpcom18a4/python/xpt.py                   |    0
 580 files changed, 14994 insertions(+), 6164 deletions(-)

diff --git a/Config.kmk b/Config.kmk
index 1bfeaa6..3b43f55 100644
--- a/Config.kmk
+++ b/Config.kmk
@@ -208,7 +208,7 @@ VBOX_VERSION_MINOR = 0
 # This is the current build number. It should be increased every time we publish a
 # new build. The define is available in every source file. Only even build numbers
 # will be published, odd numbers are set during development.
-VBOX_VERSION_BUILD = 4
+VBOX_VERSION_BUILD = 6
 # The raw version string. This *must not* contain any other information/fields than
 # major, minor and build revision (as it is now) -- also will be used for host/guest version
 # comparison.
@@ -478,8 +478,6 @@ endif
 VBOX_WITH_AHCI = 1
 # Enable the new async completion manager
 VBOX_WITH_PDM_ASYNC_COMPLETION = 1
-# Temporary switch for enabling / disabling the new USB code on Darwin.
-VBOX_WITH_NEW_USB_CODE_ON_DARWIN = 1
 ifdef VBOX_WITH_USB
  VBOX_WITH_VUSB = 1
  VBOX_WITH_XHCI_IMPL=1
@@ -741,6 +739,9 @@ endif
 if1of ($(KBUILD_TARGET), darwin solaris)
  VBOX_WITH_NATIVE_DTRACE = 1
 endif
+# Makes it possible to run some of the testcases and tools on older
+# windows versions (only define when buildling win.x86).
+#VBOX_WITH_MORE_NT4_COMPAT_BINARIES = 1
 ## @}
 
 
@@ -3993,6 +3994,19 @@ ifeq ($(KBUILD_TARGET),win)
  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.amd64)_LIB)/oldnames.lib
  TEMPLATE_VBOXR3EXE_POST_CMDS          = $(VBOX_SIGN_IMAGE_CMDS)
+ if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+  TEMPLATE_VBOXR3EXE_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out)$$(NLTAB)$(TEMPLATE_VBOXR3EXE_POST_CMDS))
+  TEMPLATE_VBOXR3EXE_LNK_DEPS.win.x86  = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION))
+  TEMPLATE_VBOXR3EXE_LDFLAGS.win.x86   = \
+  	-Include:_vcc100_kernel32_fakes_cpp \
+	-Include:_vcc100_kernel32_fakes_asm
+  TEMPLATE_VBOXR3EXE_LIBS.win.x86      = \
+  	$(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB)
+  TEMPLATE_VBOXR3EXE_LIBS.x86          = \
+  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/oldnames.lib \
+  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
+ endif
 
 else # the gcc guys
 TEMPLATE_VBOXR3EXE_TOOL                = $(VBOX_GCC_TOOL)
@@ -4395,6 +4409,11 @@ else
  endif
 endif
 TEMPLATE_VBoxR3Tool_LIBS       = $(LIB_RUNTIME) $(TEMPLATE_VBOXR3EXE_LIBS)
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ TEMPLATE_VBoxR3Tool_LIBS.x86  = \
+ 	$(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB) \
+ 	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/oldnames.lib
+endif
 
 #
 # Template for building R3 shared objects / DLLs with the 10.5 Mac OS X SDK.
@@ -4463,6 +4482,12 @@ if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
  TEMPLATE_VBOXR3TSTEXE_POST_CMDS =
  TEMPLATE_VBOXR3TSTEXE_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBOXR3EXE_LDFLAGS))
 endif
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ TEMPLATE_VBOXR3TSTEXE_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out))
+ TEMPLATE_VBOXR3TSTEXE_LIBS.x86 = \
+ 	$(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB) \
+ 	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/oldnames.lib
+endif
 
 #
 # Ring-3 testcase (no -pedantic)
@@ -4554,6 +4579,33 @@ TEMPLATE_VBoxR3DllNonPedantic-x86_DEFS      = $(filter-out HC_ARCH_BITS%,$(TEMPL
 
 
 #
+# Template for building libraries that are linked into VBoxRT.dll
+# and it's variations, pedantic variation.
+#
+TEMPLATE_VBoxR3RuntimeDll = For libraries that are linked into VBoxRT.
+TEMPLATE_VBoxR3RuntimeDll_EXTENDS = VBoxR3Dll
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ TEMPLATE_VBoxR3RuntimeDll_CFLAGS   = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+ TEMPLATE_VBoxR3RuntimeDll_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+ TEMPLATE_VBoxR3RuntimeDll_LIBS.x86 = $(filter-out $(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/%, $(TEMPLATE_VBoxR3Dll_LIBS.x86)) \
+ 	$(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/oldnames.lib \
+ 	$(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+ 	$(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
+endif
+
+#
+# Template for building libraries that are linked into VBoxRT.dll
+# and it's variations, non-pedantic variation.
+#
+TEMPLATE_VBoxR3RuntimeDllNonPedantic = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings.
+TEMPLATE_VBoxR3RuntimeDllNonPedantic_EXTENDS = VBoxR3DllNonPedantic
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && $(KBUILD_TARGET_ARCH) == "x86"
+ TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS   = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+ TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
+endif
+
+
+#
 # Template for building libraries, shared libraries / modules
 # which only depends on IPRT for crt.
 #
@@ -5553,6 +5605,9 @@ ifeq ($(KBUILD_TARGET),win)
  # HACK ALERT! Double expansion of $$(NLTAB).
  TEMPLATE_VBOXGUESTR3EXE_POST_CMDS.win.x86  = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out)$$(NLTAB)$(TEMPLATE_VBOXR3EXE_POST_CMDS))
  TEMPLATE_VBOXGUESTR3EXE_LNK_DEPS.win.x86   = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION))
+ if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+  TEMPLATE_VBOXGUESTR3EXE_LIBS.win.x86 = $(NO_SUCH_VARIABLE)# Ditch RuntimeR3VccTricks2
+ endif
 else # the gcc guys
  ifneq ($(VBOX_WITH_COMPATIBLE_LINUX_GUEST_PACKAGE),)
   ifneq ($(KBUILD_TARGET),linux)
@@ -6104,7 +6159,7 @@ endif
 SVN                    ?= svn$(HOSTSUFF_EXE)
 VBOX_SVN_REV_KMK        = $(PATH_OUT)/revision.kmk
 ifndef VBOX_SVN_REV
- VBOX_SVN_REV_FALLBACK := $(patsubst %:,,  $Rev: 102546 $  )
+ VBOX_SVN_REV_FALLBACK := $(patsubst %:,,  $Rev: 103037 $  )
  VBOX_SVN_DEP          := $(firstword $(wildcard $(PATH_ROOT)/.svn/wc.db $(abspath $(PATH_ROOT)/../.svn/wc.db) $(abspath $(PATH_ROOT)/../../.svn/wc.db) $(PATH_ROOT)/.svn/entries))
  ifeq ($(which $(SVN)),)
   VBOX_SVN_DEP         :=
diff --git a/configure b/configure
index f907cee..be49912 100755
--- a/configure
+++ b/configure
@@ -153,12 +153,19 @@ PKGCONFIG="`which_wrapper pkg-config`"
 PYTHONDIR="/usr /usr/local"
 QT4DIR="/usr/lib/qt4 /usr/share/qt4 /usr/lib64/qt4 /usr /usr/local"
 QT4DIR_PKGCONFIG=1
-QT4UIC3DIR="/usr/bin"
 KBUILDDIR="`cd \`dirname $0\`; pwd`/kBuild"
 DEVDIR="`cd \`dirname $0\`; pwd`/tools"
 if [ -d "/lib/modules/`uname -r`/build" ]; then
- LINUX="/lib/modules/`uname -r`/build"
-else
+  LINUX="/lib/modules/`uname -r`/build"
+elif [ "`echo /lib/modules/*`" != "/lib/modules/*" ]; then
+  # Get the most recent kernel headers if none match the current kernel.
+  for i in /lib/modules/*; do
+    if [ -r "$i/build" ]; then
+      LINUX="$i/build"
+    fi
+  done
+fi
+if [ -z "$LINUX" ]; then
  LINUX="/usr/src/linux"
 fi
 KCHMVIEWER="kchmviewer"
@@ -317,12 +324,18 @@ test_execute()
 # Execute a compiled test binary
 test_execute_path()
 {
+  ## LD_LIBRARY_PATH to set.
+  local_path="${1}"
+  ## Set this to non-empty to make this test non-fatal.
+  local_nofail="${2}"
   echo "executing the binary (LD_LIBRARY_PATH=$1)" >> $LOG
-  LD_LIBRARY_PATH=$1 $ODIR.tmp_out > $ODIR.test_execute.log
+  LD_LIBRARY_PATH="${local_path}" $ODIR.tmp_out > $ODIR.test_execute.log
   rc=$?
   cat $ODIR.test_execute.log | tee -a $LOG
   if [ $rc -ne 0 ]; then
-    fail
+    test -z "${local_nofail}" && fail
+    echo >> $LOG
+    echo >> $LOG
     return 1
   fi
   echo >> $LOG
@@ -422,9 +435,9 @@ check_gcc()
              -o \( $cc_maj -eq 3 -a $cc_min -lt 2 \) \
              -o \( $cc_maj -eq 4 -a $cc_min -lt 1 -a "$OS" != "darwin" \) \
              -o \( $cc_maj -eq 4 -a $cc_min -gt 9 \) \
-             -o \( $cc_maj -eq 5 -a $cc_min -gt 1 \) \
+             -o \( $cc_maj -eq 5 -a $cc_min -gt 2 \) \
              -o $cc_maj -gt 5 ]; then
-        log_failure "gcc version $cc_maj.$cc_min found, expected gcc 3.x with x>1 or gcc 4.x with 0<x<10 or gcc 5.1"
+        log_failure "gcc version $cc_maj.$cc_min found, expected gcc 3.x with x>1 or gcc 4.x with 0<x<10 or gcc 5.2"
         fail really
       else
         log_success "found version $cc_ver"
@@ -1134,7 +1147,7 @@ EOF
       fi
     fi
   else
-    log_failure "SDL not found"
+    log_failure "SDL not found (can be disabled using --disable-sdl)"
     fail
   fi
 }
@@ -1450,24 +1463,35 @@ check_qt4()
 {
   foundqt4=
   test_header Qt4
+  cat > $ODIR.tmp_src.cc << EOF
+#include <QtGlobal>
+extern "C" int main(void)
+{
+#if QT_VERSION >= 0x040800
+  return 0;
+#else
+  return 1;
+#endif
+}
+EOF
   if [ "$OS" = "darwin" ]; then
     # First check if there is the internal version of Qt. If yes nothing else
     # has to be done.
     QT_INTERNAL=`/bin/ls -rd1 $PWD/tools/$BUILD_TARGET.$BUILD_PLATFORM_ARCH/qt/* 2> /dev/null`
     for t in $QT_INTERNAL; do
-        if [ -f "$t/Frameworks/QtCoreVBox.framework/QtCoreVBox" ]; then
-          cnf_append "VBOX_WITH_QT4_SUN" "1"
-          log_success "use internal version"
-          return
-        fi
+      if [ -f "$t/Frameworks/QtCoreVBox.framework/QtCoreVBox" ]; then
+        cnf_append "VBOX_WITH_QT4_SUN" "1"
+        log_success "use internal version"
+        return
+      fi
     done
     # Now try the user provided directory and some of the standard directories.
     QT_TRIES="$QT4DIR /System/Library /Library"
     for t in $QT_TRIES; do
-        if [ -f "$t/Frameworks/QtCore.framework/QtCore" ]; then
-          PATH_SDK_QT4="$t"
-          break
-        fi
+      if [ -f "$t/Frameworks/QtCore.framework/QtCore" ]; then
+        PATH_SDK_QT4="$t"
+        break
+      fi
     done
     # Add the necessary params for building the test application
     if [ -n "$PATH_SDK_QT4" ]; then
@@ -1479,67 +1503,51 @@ check_qt4()
       log_failure "Qt4 framework not found (can be disabled using --disable-qt4)"
       fail
     fi
-  else
+  else # !darwin
     if [ $QT4DIR_PKGCONFIG -eq 1 ]; then
       # default is to use pkg-config
       if which_wrapper pkg-config > /dev/null; then
-        # this braindead path is necessary for mdv2008.1
-        qt4_ver=`\
-            PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/qt4/lib/pkgconfig \
-            pkg-config QtCore --modversion 2>> $LOG`
-        if [ $? -ne 0 ]; then
-          log_failure "QtCore not found"
-          fail
-        else
-          FLGQT4=`\
-              PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/qt4/lib/pkgconfig \
-              pkg-config QtCore --cflags`
+        qt4_ver=`pkg-config QtCore --modversion 2>> $LOG`
+        if [ $? -eq 0 ]; then
+          FLGQT4=`pkg-config QtCore --cflags`
           INCQT4=`strip_I "$FLGQT4"`
-          LIBQT4=`\
-              PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/qt4/lib/pkgconfig \
-              PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 \
-              pkg-config QtCore --libs`
-          foundqt4=1
+          LIBQT4=`PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 pkg-config QtCore --libs`
+          TOOLQT4=`pkg-config QtCore --variable=prefix`
+          TOOLQT4MOC="`pkg-config QtCore --variable=moc_location`"
+          TOOLQT4BIN="`dirname $TOOLQT4MOC`"
+          if test_compile "$LIBQT4 $LIBPTHREAD $I_INCQT4 $FLGQT4" qt4 qt4 nofatal; then
+            test_execute_path "`strip_L "$LIBQT4"`" nofatal && foundqt4=3 # pkg-config
+          fi
         fi
       else
         log_failure "pkg-config not found"
         fail
       fi
-    else
+    fi
+    if [ -z "$foundqt4" ]; then
       # do it the old way (e.g. user has specified QT4DIR)
-      cat > $ODIR.tmp_src.cc << EOF
-#include <cstdio>
-#include <QtGlobal>
-extern "C" int main(void)
-{
-  printf("found version %s", QT_VERSION_STR);
-#if QT_VERSION >= 0x040800
-  printf(", OK.\n");
-  return 0;
-#else
-  printf(", expected version 4.8.0 or higher\n");
-  return 1;
-#endif
-}
-EOF
-      for q in $QT4DIR; do
+      for q in $QT4DIR "$PWD/tools/linux.$TARGET_MACHINE"/qt/v4.8.*; do
         INCQT4="$q/include $q/include/QtCore"
         FLGQT4="-DQT_SHARED"
         I_INCQT4=`prefix_I "$INCQT4"`
         LIBQT4="-L$q/lib -lQtCoreVBox"
-        if test_compile "$LIBQT4 $LIBPTHREAD $I_INCQT4 $FLGQT4" qt4 qt4 nofatal; then
-          foundqt4=2
+        TOOLQT4="$q"
+        if test_compile "$LIBQT4 $LIBPTHREAD $I_INCQT4 $FLGQT4" qt4 qt4 nofatal &&
+            test_execute_path "`strip_L "$LIBQT4"`" nofatal; then
+          foundqt4=2 # internal
           break;
         fi
         LIBQT4="-L$q/lib -lQtCore"
-        if test_compile "$LIBQT4 $LIBPTHREAD $I_INCQT4 $FLGQT4" qt4 qt4 nofatal; then
-          foundqt4=1
+        if test_compile "$LIBQT4 $LIBPTHREAD $I_INCQT4 $FLGQT4" qt4 qt4 nofatal &&
+            test_execute_path "`strip_L "$LIBQT4"`" nofatal; then
+          foundqt4=1 # no pkg-config, Qt directory
           break;
         fi
       done
     fi
   fi
   if [ -n "$foundqt4" ]; then
+    # we decided which version of Qt to use. Now enforce the version requirement
     cat > $ODIR.tmp_src.cc << EOF
 #include <cstdio>
 #include <QtGlobal>
@@ -1568,7 +1576,6 @@ EOF
           # directories.
           for q in $PATH_SDK_QT4 /usr /Developer/Tools/Qt; do
             if which_wrapper "$q/bin/moc" > /dev/null; then
-              cnf_append "PATH_TOOL_QT4" "$q"
               cnf_append "PATH_TOOL_QT4_BIN" "$q/bin"
             fi
           done
@@ -1579,45 +1586,35 @@ EOF
           # most likely pkg-config gave us -I/usr/include/qt4 -I/usr/include/qt4/QtCore
           INCQT4=`echo "$INCQT4"|$KBUILD_SED 's|\([^ ]*\) .*|\1|'`
           cnf_append "VBOX_PATH_QT4_LIB" "`strip_L "$LIBQT4"`"
-          cnf_append "SDK_QT4_LIBPATH" "`strip_L "$LIBQT4"`"
           cnf_append "PATH_SDK_QT4_INC" "$INCQT4"
           # this is not quite right since the qt libpath does not have to be first...
           cnf_append "PATH_SDK_QT4_LIB" '$'"(firstword `strip_L "$LIBQT4"`)"
           if [ "$foundqt4" = "2" ]; then
             cnf_append "VBOX_WITH_QT4_SUN" "1"
+          elif [ "$foundqt4" = "3" ]; then
+            cnf_append "VBOX_PATH_QT4" "$TOOLQT4"
+            cnf_append "PATH_SDK_QT4" "$TOOLQT4"
+            cnf_append "PATH_TOOL_QT4_BIN" "$TOOLQT4BIN"
+            return
           fi
           test_header "Qt4 devtools"
-          for q in $QT4DIR; do
-            # first try it with a suffix, some platforms use that
-            if which_wrapper "$q/bin/moc-qt4" > /dev/null; then
-              moc_ver=`$q/bin/moc-qt4 -v 2>&1|sed 's+^.*(Qt \(.*\))+\1+'`
-              if [ $? -ne 0 ]; then
-                log_failure "moc-qt4 not working"
-                fail
-              else
-                log_success "found version $moc_ver"
-                cnf_append "VBOX_PATH_QT4" "$q"
-                cnf_append "PATH_SDK_QT4" "$q"
-                cnf_append "PATH_TOOL_QT4" "$q"
-                cnf_append "PATH_TOOL_QT4_BIN" "$q/bin"
-                cnf_append "TOOL_QT4_BIN_SUFF" "-qt4"
-                return
-              fi
-            elif which_wrapper "$q/bin/moc" > /dev/null; then
-              moc_ver=`$q/bin/moc -v 2>&1|sed 's+^.*(Qt \(.*\))+\1+'`
-              if [ $? -ne 0 ]; then
-                log_failure "moc not working"
-                fail
-              else
-                log_success "found version $moc_ver"
-                cnf_append "VBOX_PATH_QT4" "$q"
-                cnf_append "PATH_SDK_QT4" "$q"
-                cnf_append "PATH_TOOL_QT4" "$q"
-                cnf_append "PATH_TOOL_QT4_BIN" "$q/bin"
-                return
-              fi
-            fi
-          done
+          # try it with a suffix, some platforms use that
+          if which_wrapper "$TOOLQT4/bin/moc-qt4" > /dev/null; then
+            QT4BINSUFF="-qt4"
+          else
+            QT4BINSUFF=""
+          fi
+          moc_ver=`$TOOLQT4/bin/moc$QT4BINSUFF -v 2>&1|sed 's+^.*(Qt \(.*\))+\1+'`
+          if [ $? -ne 0 ]; then
+            log_failure "moc$QT4BINSUFF not working"
+            fail
+          else
+            log_success "found version $moc_ver"
+            cnf_append "VBOX_PATH_QT4" "$TOOLQT4"
+            cnf_append "PATH_SDK_QT4" "$TOOLQT4"
+            cnf_append "PATH_TOOL_QT4_BIN" "$TOOLQT4/bin"
+            [ -n "$QT4BINSUFF" ] && cnf_append "TOOL_QT4_BIN_SUFF" "$QT4BINSUFF"
+          fi
         fi
       fi
     else
@@ -1630,6 +1627,7 @@ EOF
   fi
 }
 
+
 #
 # Check for libvpx
 #
@@ -2513,6 +2511,9 @@ for option in "$@"; do
     --disable-libvpx)
       WITH_LIBVPX=0
       ;;
+    --disable-vboxsdl)
+      WITH_SDL=0
+      ;;
     --build-debug|-d)
       BUILD_TYPE=debug
       ;;
@@ -2720,7 +2721,11 @@ if [ $ONLY_ADDITIONS -eq 0 ]; then
  [ "$OS" != "darwin"  ] && check_z
   [ "$OS" != "darwin"  ] && check_png
   [ $OSE -eq 0 -a "$OS" = "linux" ] && check_pam
-  [ $WITH_SDL -eq 1 ]    && check_sdl
+  if [ $WITH_SDL -eq 1 ]; then
+    check_sdl
+  else
+    cnf_append "VBOX_WITH_VBOXSDL" ""
+  fi
   [ $WITH_SDL_TTF -eq 1 -a $OSE -eq 0 ] && check_sdl_ttf
   [ $WITH_X11    -eq 1 ] && check_x
   # TODO check for xcomposite-dev (X11/extensions/Xcomposite.h, additions only)
diff --git a/doc/VBox-CodingGuidelines.cpp b/doc/VBox-CodingGuidelines.cpp
index 0a0766a..e72ffff 100644
--- a/doc/VBox-CodingGuidelines.cpp
+++ b/doc/VBox-CodingGuidelines.cpp
@@ -69,6 +69,9 @@
  *
  *      - char strings are UTF-8.
  *
+ *      - Strings from any external source must be treated with utmost care as
+ *        they do not have to be valid UTF-8.  Only trust internal strings.
+ *
  *      - All functions return VBox status codes. There are three general
  *        exceptions from this:
  *              -# Predicate functions. These are function which are boolean in
@@ -92,19 +95,24 @@
  *      - The code shall not cause compiler warnings. Check this on ALL
  *        the platforms.
  *
+ *      - The use of symbols leading with single or double underscores is
+ *        forbidden as that intrudes on reserved compiler/system namespace. (3)
+ *
  *      - All files have file headers with $Id and a file tag which describes
  *        the file in a sentence or two.
- *        Note: Remember to enable keyword expansion when adding files to svn.
+ *        Note: Use the svn-ps.cmd/svn-ps.sh utility with the -a option to add
+ *              new sources with keyword expansion and exporting correctly
+ *              configured.
  *
  *      - All public functions are fully documented in Doxygen style using the
  *        javadoc dialect (using the 'at' instead of the 'slash' as
  *        commandprefix.)
  *
  *      - All structures in header files are described, including all their
- *        members.
+ *        members. (Doxygen style, of course.)
  *
- *      - All modules have a documentation 'page' in the main source file which
- *        describes the intent and actual implementation.
+ *      - All modules have a documentation '\@page' in the main source file
+ *        which describes the intent and actual implementation.
  *
  *      - Code which is doing things that are not immediately comprehensible
  *        shall include explanatory comments.
@@ -115,7 +123,8 @@
  *        comments, only ANSI C comments!
  *
  *      - Comments on \#else indicates what begins while the comment on a
- *        \#endif indicates what ended.
+ *        \#endif indicates what ended.  Only add these when there are more than
+ *        a few lines (6-10) of \#ifdef'ed code, otherwise they're just clutter.
  *
  *
  * (1) It is common practice on Unix to have a single symbol namespace for an
@@ -127,6 +136,11 @@
  *     __declspect(export) constructs are the main reason for this.
  *     OTOH, we do perhaps have a bit too detailed graining of this in VMM...
  *
+ * (3) There are guys out there grepping public sources for symbols leading with
+ *     single and double underscores as well as gotos and other things
+ *     considered bad practice.  They'll post statistics on how bad our sources
+ *     are on some mailing list, forum or similar.
+ *
  *
  * @subsection sec_vbox_guideline_compulsory_sub64  64-bit and 32-bit
  *
@@ -275,6 +289,38 @@
  *        end up wasting all the time reallocating the output buffer.
  *
  *
+ * @subsection sec_vbox_guideline_compulsory_doxygen    Doxygen Comments
+ *
+ * As mentioned above, we shall use doxygen/javadoc style commenting of public
+ * functions, typedefs, classes and such.  It is preferred to use this style in
+ * as many places as possible.
+ *
+ * A couple of hints on how to best write doxygen comments:
+ *
+ *      - A good class, method, function, structure or enum doxygen comment
+ *        starts with a one line sentence giving a brief description of the
+ *        item.  Details comes in a new paragraph (after blank line).
+ *
+ *      - Except for list generators like \@todo, \@cfgm, \@gcfgm and others,
+ *        all doxygen comments are related to things in the code.  So, for
+ *        instance you DO NOT add a doxygen \@note comment in the middle of a
+ *        because you've got something important to note, you add a normal
+ *        comment like 'Note! blah, very importan blah!'
+ *
+ *      - We do NOT use TODO/XXX/BUGBUG or similar markers in the code to flag
+ *        things needing fixing later, we always use \@todo doxygen comments.
+ *
+ *      - There is no colon after the \@todo.  And it is ALWAYS in a doxygen
+ *        comment.
+ *
+ *      - The \@retval tag is used to explain status codes a method/function may
+ *        returns.  It is not used to describe output parameters, that is done
+ *        using the \@param or \@param[out] tag.
+ *
+ * See https://www.stack.nl/~dimitri/doxygen/manual/index.html for the official
+ * doxygen documention.
+ *
+ *
  * @section sec_vbox_guideline_optional         Optional
  *
  * First part is the actual coding style and all the prefixes.  The second part
diff --git a/doc/manual/en_US/user_Installation.xml b/doc/manual/en_US/user_Installation.xml
index ed4055b..79b74c9 100644
--- a/doc/manual/en_US/user_Installation.xml
+++ b/doc/manual/en_US/user_Installation.xml
@@ -463,7 +463,7 @@
 
           <listitem>
             <para>It creates
-            <computeroutput>/etc/init.d/vboxdrv</computeroutput>, an init
+            <computeroutput>/sbin/rcvboxdrv</computeroutput>, an init
             script to start the VirtualBox kernel module.</para>
           </listitem>
 
@@ -584,7 +584,7 @@ tar jxf ./install/VirtualBox.tar.bz2 -C /opt/VirtualBox</screen></para>
         read/writable only for the user.</para>
 
         <para>Next, you will have to install the system initialization script
-        for the kernel module:<screen>cp /opt/VirtualBox/vboxdrv.sh /etc/init.d/vboxdrv</screen>(assuming
+        for the kernel module:<screen>cp /opt/VirtualBox/vboxdrv.sh /sbin/rcvboxdrv</screen>(assuming
         you installed VirtualBox to the
         <computeroutput>/opt/VirtualBox</computeroutput> directory) and
         activate the initialization script using the right method for your
diff --git a/doc/manual/user_ChangeLogImpl.xml b/doc/manual/user_ChangeLogImpl.xml
index 9b30833..00335a6 100644
--- a/doc/manual/user_ChangeLogImpl.xml
+++ b/doc/manual/user_ChangeLogImpl.xml
@@ -3,6 +3,171 @@
 <chapter> <!-- HACK ALERT! Seems we must have a single top level element for xi:include to work.
                            So, we use chapter and xpointer="xpointer(/chapter/)" with xi:include. -->
   <sect1>
+    <title>Version 5.0.6 (2015-10-02)</title>
+
+    <para>This is a maintenance release. The following items were fixed and/or
+      added:</para>
+
+    <itemizedlist>
+
+      <listitem>
+        <para>GUI: the update check now uses the HTTP system proxy settings by
+          default</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: About dialog improvements. Copyable version text, do not close
+          dialog on mouse-clicks and focus losing, explicit close button at the
+          bottom of dialog and disabled close button fix on OS X. (bugs #9912,
+          #12749)</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed bug when re-assigning shortcuts (bug #14565)</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed default focus button in message-box dialogs (bug #14486)</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed settings dialog which is opened if the network settings
+          need to be changed at VM startup (5.0.0 regression; bug #14601)</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed crash during VM start if an early error message needs
+          to be shown, for example Linux kernel modules not present (bug #14646)</para>
+      </listitem>
+
+      <listitem>
+        <para>Bridged Networking: fixed handling of guest DHCP requests without UDP
+          checksum when bridging to a wireless interface (bug #14615).</para>
+      </listitem>
+
+      <listitem>
+        <para>Audio: latency fixes (Windows hosts only; bug #4088)</para>
+      </listitem>
+
+      <listitem>
+        <para>Guest Control: correctly set <emphasis>USERNAME</emphasis> and
+          <emphasis>USERPROFILE</emphasis> environment variables (Windows
+          guests only)</para>
+      </listitem>
+
+      <listitem>
+        <para>Guest Control: several fixes</para>
+      </listitem>
+
+      <listitem>
+        <para>API: properly restore NAT port forwarding rules when reverting to
+          a snapshot</para>
+      </listitem>
+
+      <listitem>
+        <para>Parallel ports: Several fixes allowing to enable two parallel ports
+          for a VM</para>
+      </listitem>
+
+      <listitem>
+        <para>VBoxManage: fixed wrong output of <computeroutput>debugvm show</computeroutput>
+          command</para>
+      </listitem>
+
+      <listitem>
+        <para>VBoxManage: fixed hang when specifying logging groups with
+          <computeroutput>debugvm log</computeroutput> starting with
+          <emphasis>h</emphasis>, for example <emphasis>hex</emphasis></para>
+      </listitem>
+
+      <listitem>
+        <para>Windows hosts: renamed <emphasis>VBoxStartup.log</emphasis> to
+          <emphasis>VBoxHardening.log</emphasis> and provide this log file in
+          the GUI log viewer</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows hosts: fixed a small memory leak in the Windows host interface
+          driver (VBoxNetAdp) which caused a BSOD if the driver verifier is enabled
+          (bug #14562)</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows hosts: fixed a failure to start VMs on hosts where dsound.dll
+          is not available (bug #14574)</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows hosts: another fix for <emphasis>VERR_LDR_MISMATCH_NATIVE</emphasis>
+          errors (bug #14579)</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows hosts: fixed host-to-guest communication with bridged networking
+          (bugs #14326, #14457)</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows hosts: fixed broken data receiving from the serial device with
+          the named pipe backend if Kaspersky AV is installed</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux hosts: Linux 4.3 compile fixes</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux hosts: installer fix for certain systems (bug #14627)</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux hosts / guests: native systemd support for the host/guest
+          installer scripts. The scripts for re-compiling the kernel modules
+          are now located at /sbin/rcvboxdrv (host) and /sbin/rcvboxadd
+          (Guest Additions)</para>
+      </listitem>
+
+      <listitem>
+        <para>Mac OS X hosts: GUI-related fixes for El Capitan</para>
+      </listitem>
+
+      <listitem>
+        <para>Mac OS X hosts: fixed a problem with capturing USB devices under
+          El Capitan</para>
+      </listitem>
+
+      <listitem>
+        <para>Mac OS X hosts: allow colon character on shared folders (bug #14554)</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux Additions: properly set the VBoxService process ID in the PID
+          file (bug #14571)</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux Additions: Guest Control fixes (bug #14573)</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows Additions: fixed shutting down VBoxTray when running with
+          older VirtualBox host versions</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows Additions: fixed video playback with VLC and Windows Media
+          Player when the WDDM driver is used and 3D is not used</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows Additions: prevent a possible VLC crash when the WDDM driver
+          is used and 3D is enabled by implementing YV12 surfaces</para>
+      </listitem>
+
+    </itemizedlist>
+  </sect1>
+
+  <sect1>
     <title>Version 5.0.4 (2015-09-08)</title>
 
     <para>This is a maintenance release. The following items were fixed and/or
diff --git a/include/VBox/HostServices/GuestControlSvc.h b/include/VBox/HostServices/GuestControlSvc.h
index eee473c..50abbc1 100644
--- a/include/VBox/HostServices/GuestControlSvc.h
+++ b/include/VBox/HostServices/GuestControlSvc.h
@@ -142,7 +142,7 @@ enum eProcessStatus
 #define EXECUTEPROCESSFLAG_WAIT_START       RT_BIT(0)
 #define EXECUTEPROCESSFLAG_IGNORE_ORPHANED  RT_BIT(1)
 #define EXECUTEPROCESSFLAG_HIDDEN           RT_BIT(2)
-#define EXECUTEPROCESSFLAG_NO_PROFILE       RT_BIT(3)
+#define EXECUTEPROCESSFLAG_NO_PROFILE       RT_BIT(3) /** @todo Rename to EXECUTEPROCESSFLAG_PROFILE in next API change. */
 #define EXECUTEPROCESSFLAG_WAIT_STDOUT      RT_BIT(4)
 #define EXECUTEPROCESSFLAG_WAIT_STDERR      RT_BIT(5)
 #define EXECUTEPROCESSFLAG_EXPAND_ARGUMENTS RT_BIT(6)
diff --git a/include/iprt/asm.h b/include/iprt/asm.h
index 72ba7cb..36925f1 100644
--- a/include/iprt/asm.h
+++ b/include/iprt/asm.h
@@ -4321,13 +4321,13 @@ DECLINLINE(void) ASMBitClearRange(volatile void *pvBitmap, int32_t iBitStart, in
         int iStart = iBitStart & ~31;
         int iEnd   = iBitEnd & ~31;
         if (iStart == iEnd)
-            *pu32 &= ((1 << (iBitStart & 31)) - 1) | ~((1 << (iBitEnd & 31)) - 1);
+            *pu32 &= ((1U << (iBitStart & 31)) - 1) | ~((1U << (iBitEnd & 31)) - 1);
         else
         {
             /* bits in first dword. */
             if (iBitStart & 31)
             {
-                *pu32 &= (1 << (iBitStart & 31)) - 1;
+                *pu32 &= (1U << (iBitStart & 31)) - 1;
                 pu32++;
                 iBitStart = iStart + 32;
             }
@@ -4340,7 +4340,7 @@ DECLINLINE(void) ASMBitClearRange(volatile void *pvBitmap, int32_t iBitStart, in
             if (iBitEnd & 31)
             {
                 pu32 = (volatile uint32_t *)pvBitmap + (iBitEnd >> 5);
-                *pu32 &= ~((1 << (iBitEnd & 31)) - 1);
+                *pu32 &= ~((1U << (iBitEnd & 31)) - 1);
             }
         }
     }
@@ -4362,13 +4362,13 @@ DECLINLINE(void) ASMBitSetRange(volatile void *pvBitmap, int32_t iBitStart, int3
         int iStart = iBitStart & ~31;
         int iEnd   = iBitEnd & ~31;
         if (iStart == iEnd)
-            *pu32 |= ((1 << (iBitEnd - iBitStart)) - 1) << (iBitStart & 31);
+            *pu32 |= ((1U << (iBitEnd - iBitStart)) - 1) << (iBitStart & 31);
         else
         {
             /* bits in first dword. */
             if (iBitStart & 31)
             {
-                *pu32 |= ~((1 << (iBitStart & 31)) - 1);
+                *pu32 |= ~((1U << (iBitStart & 31)) - 1);
                 pu32++;
                 iBitStart = iStart + 32;
             }
@@ -4381,7 +4381,7 @@ DECLINLINE(void) ASMBitSetRange(volatile void *pvBitmap, int32_t iBitStart, int3
             if (iBitEnd & 31)
             {
                 pu32 = (volatile uint32_t *)pvBitmap + (iBitEnd >> 5);
-                *pu32 |= (1 << (iBitEnd & 31)) - 1;
+                *pu32 |= (1U << (iBitEnd & 31)) - 1;
             }
         }
     }
diff --git a/include/iprt/crypto/digest.h b/include/iprt/crypto/digest.h
index b3ea5c3..f969835 100644
--- a/include/iprt/crypto/digest.h
+++ b/include/iprt/crypto/digest.h
@@ -145,7 +145,7 @@ typedef RTCRDIGESTDESC const *PCRTCRDIGESTDESC;
  *                          RTCrDigestCreate.  This is optional, fewer
  *                          algortihms are available if not specified.
  */
-RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjIdString(const char *pszObjId, void *ppvOpaque);
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjIdString(const char *pszObjId, void **ppvOpaque);
 
 /**
  * Finds a cryptographic hash / message digest descriptor by object identifier
@@ -159,7 +159,7 @@ RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjIdString(const char *pszObjId, void
  *                          RTCrDigestCreate.  This is optional, fewer
  *                          algortihms are available if not specified.
  */
-RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjId(PCRTASN1OBJID pObjId, void **ppvOpaque);
 
 RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByType(RTDIGESTTYPE enmDigestType);
 RTDECL(int) RTCrDigestCreateByObjIdString(PRTCRDIGEST phDigest, const char *pszObjId);
diff --git a/include/iprt/env.h b/include/iprt/env.h
index 5bd23a9..1422815 100644
--- a/include/iprt/env.h
+++ b/include/iprt/env.h
@@ -70,6 +70,24 @@ RTDECL(int) RTEnvCreate(PRTENV pEnv);
 RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone);
 
 /**
+ * Creates an environment block from an UTF-16 environment raw block.
+ *
+ * This is the reverse of RTEnvQueryUtf16Block.
+ *
+ * @returns IPRT status code.
+ * @retval  VERR_NO_MEMORY
+ * @retval  VERR_NO_STR_MEMORY
+ *
+ * @param   phEnv       Where to store the handle of the new environment block.
+ * @param   pwszzBlock  List of zero terminated string end with a zero length
+ *                      string (or two zero terminators if you prefer).  The
+ *                      strings are on the RTPutEnv format (VAR=VALUE), except
+ *                      they are all expected to include an equal sign.
+ * @param   fFlags      Flags served for the future.
+ */
+RTDECL(int) RTEnvCloneUtf16Block(PRTENV phEnv, PCRTUTF16 pwszzBlock, uint32_t fFlags);
+
+/**
  * Destroys an environment block.
  *
  * @returns IPRT status code.
@@ -384,7 +402,6 @@ RTDECL(bool) RTEnvIsChangeRecord(RTENV hEnv);
  */
 RTDECL(int) RTEnvApplyChanges(RTENV hEnvDst, RTENV hEnvChanges);
 
-
 #endif /* IN_RING3 */
 
 /** @} */
diff --git a/include/iprt/err.h b/include/iprt/err.h
index b4a4236..a9046fd 100644
--- a/include/iprt/err.h
+++ b/include/iprt/err.h
@@ -936,6 +936,20 @@ RT_C_DECLS_END
 #define VERR_MISMATCH                       (-22408)
 /** Wrong type. */
 #define VERR_WRONG_TYPE                     (-22409)
+/** This indicates that the process does not have sufficient privileges to
+ * perform the operation. */
+#define VERR_PRIVILEGE_NOT_HELD             (-22410)
+/** Process does not have the trusted code base (TCB) privilege needed for user
+ * authentication or/and process creation as a given user.  TCB is also called
+ * 'Act as part of the operating system'. */
+#define VERR_PROC_TCB_PRIV_NOT_HELD         (-22411)
+/** Process does not have the assign primary token (APT) privilege needed
+ * for creating process as a given user.  APT is also called 'Replace a process
+ * level token'. */
+#define VERR_PROC_APT_PRIV_NOT_HELD         (-22412)
+/** Process does not have the increase quota (IQ) privilege needed for
+ * creating a process as a given user. IQ is also called 'Increase quotas'. */
+#define VERR_PROC_IQ_PRIV_NOT_HELD          (-22413)
 /** @} */
 
 
@@ -1693,6 +1707,10 @@ RT_C_DECLS_END
 #define VERR_HTTP_REDIRECTED                    (-894)
 /** Proxy couldn't be resolved. */
 #define VERR_HTTP_PROXY_NOT_FOUND               (-895)
+/** Unexpected cURL error configure the proxy. */
+#define VERR_HTTP_CURL_PROXY_CONFIG             (-897)
+/** Generic CURL error. */
+#define VERR_HTTP_CURL_ERROR                    (-899)
 /** @} */
 
 /** @name RTManifest status codes
@@ -2495,6 +2513,30 @@ RT_C_DECLS_END
 #define VERR_PATH_GLOB_UNKNOWN_CHAR_CLASS           (-24403)
 /** @} */
 
+/** @name RTUri status codes.
+ * @{ */
+/** The URI is empty */
+#define VERR_URI_EMPTY                              (-24600)
+/** The URI is too short to be a valid URI. */
+#define VERR_URI_TOO_SHORT                          (-24601)
+/** Invalid scheme.  */
+#define VERR_URI_INVALID_SCHEME                     (-24602)
+/** Invalid port number.  */
+#define VERR_URI_INVALID_PORT_NUMBER                (-24603)
+/** Invalid escape sequence.  */
+#define VERR_URI_INVALID_ESCAPE_SEQ                 (-24604)
+/** Escape URI char decodes as zero (the C string terminator). */
+#define VERR_URI_ESCAPED_ZERO                       (-24605)
+/** Escaped URI characters does not decode to valid UTF-8. */
+#define VERR_URI_ESCAPED_CHARS_NOT_VALID_UTF8       (-24606)
+/** Escaped URI character is not a valid UTF-8 lead byte. */
+#define VERR_URI_INVALID_ESCAPED_UTF8_LEAD_BYTE     (-24607)
+/** Escaped URI character sequence with invalid UTF-8 continutation byte. */
+#define VERR_URI_INVALID_ESCAPED_UTF8_CONTINUATION_BYTE (-24608)
+/** Missing UTF-8 continutation in escaped URI character sequence. */
+#define VERR_URI_MISSING_UTF8_CONTINUATION_BYTE     (-24609)
+/** @} */
+
 /* SED-END */
 
 /** @} */
diff --git a/include/iprt/log.h b/include/iprt/log.h
index d5b9ee9..2ee0daf 100644
--- a/include/iprt/log.h
+++ b/include/iprt/log.h
@@ -52,11 +52,13 @@ typedef enum RTLOGGROUP
 {
     /** Default logging group. */
     RTLOGGROUP_DEFAULT,
+    RTLOGGROUP_CRYPTO,
     RTLOGGROUP_DBG,
     RTLOGGROUP_DBG_DWARF,
     RTLOGGROUP_DIR,
     RTLOGGROUP_FILE,
     RTLOGGROUP_FS,
+    RTLOGGROUP_HTTP,
     RTLOGGROUP_LDR,
     RTLOGGROUP_PATH,
     RTLOGGROUP_PROCESS,
@@ -64,7 +66,6 @@ typedef enum RTLOGGROUP
     RTLOGGROUP_THREAD,
     RTLOGGROUP_TIME,
     RTLOGGROUP_TIMER,
-    RTLOGGROUP_CRYPTO,
     RTLOGGROUP_ZIP = 31,
     RTLOGGROUP_FIRST_USER = 32
 } RTLOGGROUP;
@@ -84,11 +85,13 @@ typedef enum RTLOGGROUP
  */
 #define RT_LOGGROUP_NAMES \
     "DEFAULT",      \
+    "RT_CRYPTO",    \
     "RT_DBG",       \
     "RT_DBG_DWARF", \
     "RT_DIR",       \
     "RT_FILE",      \
     "RT_FS",        \
+    "RT_HTTP", \
     "RT_LDR",       \
     "RT_PATH",      \
     "RT_PROCESS",   \
@@ -96,8 +99,6 @@ typedef enum RTLOGGROUP
     "RT_THREAD",    \
     "RT_TIME",      \
     "RT_TIMER",     \
-    "RT_CRYPTO",    \
-    "RT_14", \
     "RT_15", \
     "RT_16", \
     "RT_17", \
diff --git a/include/iprt/mangling.h b/include/iprt/mangling.h
index 73d1bb3..12aa4a8 100644
--- a/include/iprt/mangling.h
+++ b/include/iprt/mangling.h
@@ -509,6 +509,7 @@
 # define RTDvmVolumeCreateVfsFile                       RT_MANGLER(RTDvmVolumeCreateVfsFile)
 # define RTEnvApplyChanges                              RT_MANGLER(RTEnvApplyChanges)
 # define RTEnvClone                                     RT_MANGLER(RTEnvClone)
+# define RTEnvCloneUtf16Block                           RT_MANGLER(RTEnvCloneUtf16Block)
 # define RTEnvCountEx                                   RT_MANGLER(RTEnvCountEx)
 # define RTEnvCreate                                    RT_MANGLER(RTEnvCreate)
 # define RTEnvCreateChangeRecord                        RT_MANGLER(RTEnvCreateChangeRecord)
@@ -1104,6 +1105,7 @@
 # define RTPipeCreate                                   RT_MANGLER(RTPipeCreate)
 # define RTPipeFlush                                    RT_MANGLER(RTPipeFlush)
 # define RTPipeFromNative                               RT_MANGLER(RTPipeFromNative)
+# define RTPipeQueryInfo                                RT_MANGLER(RTPipeQueryInfo)
 # define RTPipeQueryReadable                            RT_MANGLER(RTPipeQueryReadable)
 # define RTPipeRead                                     RT_MANGLER(RTPipeRead)
 # define RTPipeReadBlocking                             RT_MANGLER(RTPipeReadBlocking)
@@ -1856,16 +1858,22 @@
 # define RTUdpServerShutdown                            RT_MANGLER(RTUdpServerShutdown)
 # define RTUdpWrite                                     RT_MANGLER(RTUdpWrite)
 # define RTUniFree                                      RT_MANGLER(RTUniFree)
-# define RTUriAuthority                                 RT_MANGLER(RTUriAuthority)
 # define RTUriCreate                                    RT_MANGLER(RTUriCreate)
 # define RTUriFileCreate                                RT_MANGLER(RTUriFileCreate)
 # define RTUriFileNPath                                 RT_MANGLER(RTUriFileNPath)
 # define RTUriFilePath                                  RT_MANGLER(RTUriFilePath)
-# define RTUriFragment                                  RT_MANGLER(RTUriFragment)
-# define RTUriHasScheme                                 RT_MANGLER(RTUriHasScheme)
+# define RTUriParse                                     RT_MANGLER(RTUriParse)
+# define RTUriParsedAuthority                           RT_MANGLER(RTUriParsedAuthority)
+# define RTUriParsedAuthorityHost                       RT_MANGLER(RTUriParsedAuthorityHost)
+# define RTUriParsedAuthorityPassword                   RT_MANGLER(RTUriParsedAuthorityPassword)
+# define RTUriParsedAuthorityPort                       RT_MANGLER(RTUriParsedAuthorityPort)
+# define RTUriParsedAuthorityUsername                   RT_MANGLER(RTUriParsedAuthorityUsername)
+# define RTUriParsedFragment                            RT_MANGLER(RTUriParsedFragment)
+# define RTUriParsedPath                                RT_MANGLER(RTUriParsedPath)
+# define RTUriParsedScheme                              RT_MANGLER(RTUriParsedScheme)
+# define RTUriParsedQuery                               RT_MANGLER(RTUriParsedQuery)
+# define RTUriIsSchemeMatch                             RT_MANGLER(RTUriIsSchemeMatch)
 # define RTUriPath                                      RT_MANGLER(RTUriPath)
-# define RTUriQuery                                     RT_MANGLER(RTUriQuery)
-# define RTUriScheme                                    RT_MANGLER(RTUriScheme)
 # define RTUtf16AllocTag                                RT_MANGLER(RTUtf16AllocTag)
 # define RTUtf16CalcLatin1Len                           RT_MANGLER(RTUtf16CalcLatin1Len)
 # define RTUtf16CalcLatin1LenEx                         RT_MANGLER(RTUtf16CalcLatin1LenEx)
@@ -1934,6 +1942,7 @@
 # define RTVfsIoStreamToPrivate                         RT_MANGLER(RTVfsIoStreamToPrivate)
 # define RTVfsIoStrmFlush                               RT_MANGLER(RTVfsIoStrmFlush)
 # define RTVfsIoStrmFromRTFile                          RT_MANGLER(RTVfsIoStrmFromRTFile)
+# define RTVfsIoStrmFromRTPipe                          RT_MANGLER(RTVfsIoStrmFromRTPipe)
 # define RTVfsIoStrmFromStdHandle                       RT_MANGLER(RTVfsIoStrmFromStdHandle)
 # define RTVfsIoStrmIsAtEnd                             RT_MANGLER(RTVfsIoStrmIsAtEnd)
 # define RTVfsIoStrmOpenNormal                          RT_MANGLER(RTVfsIoStrmOpenNormal)
diff --git a/include/iprt/nt/nt-and-windows.h b/include/iprt/nt/nt-and-windows.h
index 490c022..6da9ad3 100644
--- a/include/iprt/nt/nt-and-windows.h
+++ b/include/iprt/nt/nt-and-windows.h
@@ -36,6 +36,7 @@
 #define PTEB    IncompleteWindows_PTEB
 
 #define IPRT_NT_USE_WINTERNL
+#define IPRT_NT_HAVE_CURRENT_TEB_MACRO
 #define WIN32_NO_STATUS
 #include <Windows.h>
 #undef WIN32_NO_STATUS
diff --git a/include/iprt/nt/nt.h b/include/iprt/nt/nt.h
index d307330..9e96105 100644
--- a/include/iprt/nt/nt.h
+++ b/include/iprt/nt/nt.h
@@ -1357,10 +1357,25 @@ typedef PPEB_COMMON PPEB;
 typedef TEB_COMMON  TEB;
 typedef PTEB_COMMON PTEB;
 
-#define RTNtCurrentTeb()        ((PTEB)NtCurrentTeb())
-#define RTNtCurrentPeb()        (RTNtCurrentTeb()->ProcessEnvironmentBlock)
-#define NtCurrentPeb()          RTNtCurrentPeb()
-#define RTNtCurrentThreadId()   ((uint32_t)(uintptr_t)RTNtCurrentTeb()->ClientId.UniqueThread)
+#if !defined(NtCurrentTeb) && !defined(IPRT_NT_HAVE_CURRENT_TEB_MACRO)
+# ifdef RT_ARCH_X86
+DECL_FORCE_INLINE(PTEB)     RTNtCurrentTeb(void) { return (PTEB)__readfsdword(RT_OFFSETOF(TEB_COMMON, NtTib.Self)); }
+DECL_FORCE_INLINE(PPEB)     RTNtCurrentPeb(void) { return (PPEB)__readfsdword(RT_OFFSETOF(TEB_COMMON, ProcessEnvironmentBlock)); }
+DECL_FORCE_INLINE(uint32_t) RTNtCurrentThreadId(void) { return __readfsdword(RT_OFFSETOF(TEB_COMMON, ClientId.UniqueThread)); }
+# elif defined(RT_ARCH_AMD64)
+DECL_FORCE_INLINE(PTEB)     RTNtCurrentTeb(void) { return (PTEB)__readgsqword(RT_OFFSETOF(TEB_COMMON, NtTib.Self)); }
+DECL_FORCE_INLINE(PPEB)     RTNtCurrentPeb(void) { return (PPEB)__readgsqword(RT_OFFSETOF(TEB_COMMON, ProcessEnvironmentBlock)); }
+DECL_FORCE_INLINE(uint32_t) RTNtCurrentThreadId(void) { return (uint32_t)__readgsqword(RT_OFFSETOF(TEB_COMMON, ClientId.UniqueThread)); }
+# else
+#  error "Port me"
+# endif
+#else
+# define RTNtCurrentTeb()        ((PTEB)NtCurrentTeb())
+# define RTNtCurrentPeb()        (RTNtCurrentTeb()->ProcessEnvironmentBlock)
+# define RTNtCurrentThreadId()   ((uint32_t)(uintptr_t)RTNtCurrentTeb()->ClientId.UniqueThread)
+#endif
+#define NtCurrentPeb()           RTNtCurrentPeb()
+
 
 /** @} */
 
diff --git a/include/iprt/pipe.h b/include/iprt/pipe.h
index b99fa5d..fe4363a 100644
--- a/include/iprt/pipe.h
+++ b/include/iprt/pipe.h
@@ -28,6 +28,7 @@
 
 #include <iprt/cdefs.h>
 #include <iprt/types.h>
+#include <iprt/fs.h>
 
 RT_C_DECLS_BEGIN
 
@@ -218,6 +219,31 @@ RTDECL(int) RTPipeSelectOne(RTPIPE hPipe, RTMSINTERVAL cMillies);
  */
 RTDECL(int) RTPipeQueryReadable(RTPIPE hPipe, size_t *pcbReadable);
 
+/**
+ * Query information about a pipe (mainly a VFS I/O stream formality).
+ *
+ * The only thing we guarentee to be returned is RTFSOBJINFO::Attr.fMode being
+ * set to FIFO and will reflect the read/write end in the RTFS_DOS_READONLY,
+ * RTFS_UNIX_IRUSR and RTFS_UNIX_IWUSR bits.
+ *
+ * Some implementations sometimes provide the pipe buffer size via
+ * RTFSOBJINFO::cbAllocated.
+ *
+ * Some implementations sometimes provide the available read data or available
+ * write space via RTFSOBJINFO::cbObject.
+ *
+ * Some implementations sometimes provide valid device and/or inode numbers.
+ *
+ * @returns iprt status code.
+ *
+ * @param   hPipe       The IPRT read pipe handle.
+ * @param   pObjInfo    Object information structure to be filled on successful
+ *                      return.
+ * @param   enmAddAttr  Which set of additional attributes to request.  Use
+ *                      RTFSOBJATTRADD_NOTHING if this doesn't matter.
+ */
+RTDECL(int) RTPipeQueryInfo(RTPIPE hPipe, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr);
+
 /** @} */
 
 RT_C_DECLS_END
diff --git a/include/iprt/process.h b/include/iprt/process.h
index b02d702..1dc7371 100644
--- a/include/iprt/process.h
+++ b/include/iprt/process.h
@@ -186,7 +186,7 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
  * be possible to wait for it, i.e. @a phProcess shall be NULL. */
 #define RTPROC_FLAGS_DETACHED               RT_BIT(0)
 /** Don't show the started process.
- * This is a window (and maybe OS/2) concept, do not use on other platforms. */
+ * This is a Windows (and maybe OS/2) concept, do not use on other platforms. */
 #define RTPROC_FLAGS_HIDDEN                 RT_BIT(1)
 /** Use special code path for starting child processes from a service (daemon).
  * This is a windows concept for dealing with the so called "Session 0"
@@ -197,9 +197,13 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
  * on Solaris.  Without this flag the contract id is always changed, as that's
  * the more frequently used case. */
 #define RTPROC_FLAGS_SAME_CONTRACT          RT_BIT(3)
-/** Do not load user profile data when executing a process.
- * This bit at the moment only is valid on Windows. */
-#define RTPROC_FLAGS_NO_PROFILE             RT_BIT(4)
+/** Load user profile data when executing a process.
+ * This redefines the meaning of RTENV_DEFAULT to the profile environment.
+ * @remarks On non-windows platforms, the resulting environment maybe very
+ *          different from what you see in your shell.  Among other reasons,
+ *          we cannot run shell profile scripts which typically sets up the
+ *          environment. */
+#define RTPROC_FLAGS_PROFILE                RT_BIT(4)
 /** Create process without a console window.
  * This is a Windows (and OS/2) concept, do not use on other platforms. */
 #define RTPROC_FLAGS_NO_WINDOW              RT_BIT(5)
@@ -210,8 +214,11 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
  * just join up argv with a space between each.  Ignored on platforms
  * passing argument the vector. */
 #define RTPROC_FLAGS_UNQUOTED_ARGS          RT_BIT(7)
+/** Consider hEnv an environment change record to be applied to RTENV_DEFAULT.
+ * If hEnv is RTENV_DEFAULT, the flag has no effect. */
+#define RTPROC_FLAGS_ENV_CHANGE_RECORD      RT_BIT(8)
 /** Valid flag mask. */
-#define RTPROC_FLAGS_VALID_MASK             UINT32_C(0xff)
+#define RTPROC_FLAGS_VALID_MASK             UINT32_C(0x1ff)
 /** @}  */
 
 
@@ -384,14 +391,14 @@ RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent);
  * @returns IPRT status code.
  * @retval VERR_BUFFER_OVERFLOW if the given buffer size is to small for the username.
  * @param   hProcess     The process handle to query the username for.
+ *                       NIL_PROCESS is an alias for the current process.
  * @param   pszUser      Where to store the user name on success.
  * @param   cbUser       The size of the user name buffer.
  * @param   pcbUser      Where to store the username length on success
  *                       or the required buffer size if VERR_BUFFER_OVERFLOW
  *                       is returned.
  */
-RTR3DECL(int)   RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser,
-                                    size_t *pcbUser);
+RTR3DECL(int)   RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser, size_t *pcbUser);
 
 /**
  * Query the username of the given process allocating the string for the username.
diff --git a/include/iprt/string.h b/include/iprt/string.h
index 176d7fe..a162077 100644
--- a/include/iprt/string.h
+++ b/include/iprt/string.h
@@ -109,6 +109,13 @@ char *strpbrk(const char *pszStr, const char *pszChars);
 RT_C_DECLS_END
 #endif
 
+#if !defined(RT_OS_LINUX) || !defined(_GNU_SOURCE)
+RT_C_DECLS_BEGIN
+void *memrchr(const char *pv, int ch, size_t cb);
+RT_C_DECLS_END
+#endif
+
+
 /** @def RT_USE_RTC_3629
  * When defined the UTF-8 range will stop at  0x10ffff.  If not defined, the
  * range stops at 0x7fffffff.
@@ -2533,6 +2540,24 @@ DECLINLINE(char *) RTStrEnd(const char *pszString, size_t cchMax)
 RT_C_DECLS_BEGIN
 
 /**
+ * Finds the offset at which a simple character first occurs in a string.
+ *
+ * @returns The offset of the first occurence or the terminator offset.
+ * @param   pszHaystack The string to search.
+ * @param   chNeedle    The character to search for.
+ */
+DECLINLINE(size_t) RTStrOffCharOrTerm(const char *pszHaystack, char chNeedle)
+{
+    const char *psz = pszHaystack;
+    char ch;
+    while (   (ch = *psz) != chNeedle
+           && ch != '\0')
+        psz++;
+    return psz - pszHaystack;
+}
+
+
+/**
  * Matches a simple string pattern.
  *
  * @returns true if the string matches the pattern, otherwise false.
diff --git a/include/iprt/uri.h b/include/iprt/uri.h
index 27fd4d8..a36fa40 100644
--- a/include/iprt/uri.h
+++ b/include/iprt/uri.h
@@ -32,87 +32,247 @@
 RT_C_DECLS_BEGIN
 
 /** @defgroup grp_rt_uri    RTUri - Uri parsing and creation
- * URI parsing and creation based on RFC 3986.
- * See http://datatracker.ietf.org/doc/rfc3986/ for the full specification.
- * @note Currently it isn't the full specification implemented.
- * @note Currently only some generic URI support and a minimum File(file:) URI
- * support is implemented. Other specific scheme support, like html:, ldap:,
- * data:, ..., is missing.
- * @see grp_rt_uri_file
+ *
+ * URI parsing and creation based on RFC-3986.
+ *
+ * @remarks The whole specification isn't implemented and we only provide scheme
+ *          specific special APIs for "file://".
+ *
  * @ingroup grp_rt
  * @{
  */
 
+
 /**
- * Creates a generic URI. The returned pointer must be freed
- * using RTStrFree().
+ * Parsed URI.
  *
- * @returns the new URI on success, NULL otherwise.
- * @param   pszScheme           The URI scheme.
- * @param   pszAuthority        The authority part of the URI (optional).
- * @param   pszPath             The path part of the URI (optional).
- * @param   pszQuery            The query part of the URI (optional).
- * @param   pszFragment         The fragment part of the URI (optional).
+ * @remarks This structure is subject to change.
  */
-RTR3DECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery,
-                             const char *pszFragment);
+typedef struct RTURIPARSED
+{
+    /** Magic value (for internal use only). */
+    uint32_t    u32Magic;
+    /** RTURIPARSED_F_XXX. */
+    uint32_t    fFlags;
+
+    /** The length of the scheme. */
+    size_t      cchScheme;
+
+    /** The offset into the string of the authority. */
+    size_t      offAuthority;
+    /** The authority length.
+     * @remarks The authority component can be zero length, so to check whether
+     *          it's there or not consult RTURIPARSED_F_HAVE_AUTHORITY. */
+    size_t      cchAuthority;
+
+    /** The offset into the string of the path. */
+    size_t      offPath;
+    /** The length of the path. */
+    size_t      cchPath;
+
+    /** The offset into the string of the query. */
+    size_t      offQuery;
+    /** The length of the query. */
+    size_t      cchQuery;
+
+    /** The offset into the string of the fragment. */
+    size_t      offFragment;
+    /** The length of the fragment. */
+    size_t      cchFragment;
+
+    /** @name Authority subdivisions
+     * @{ */
+    /** If there is a userinfo part, this is the start of it. Otherwise it's the
+     * same as offAuthorityHost. */
+    size_t      offAuthorityUsername;
+    /** The length of the username (zero if not present). */
+    size_t      cchAuthorityUsername;
+    /** If there is a userinfo part containing a password, this is the start of it.
+     * Otherwise it's the same as offAuthorityHost. */
+    size_t      offAuthorityPassword;
+    /** The length of the password (zero if not present). */
+    size_t      cchAuthorityPassword;
+    /** The offset of the host part of the authority. */
+    size_t      offAuthorityHost;
+    /** The length of the host part of the authority. */
+    size_t      cchAuthorityHost;
+    /** The authority port number, UINT32_MAX if not present. */
+    uint32_t    uAuthorityPort;
+    /** @} */
+} RTURIPARSED;
+/** Pointer to a parsed URI. */
+typedef RTURIPARSED *PRTURIPARSED;
+/** Pointer to a const parsed URI. */
+typedef RTURIPARSED const *PCRTURIPARSED;
+
+/** @name  RTURIPARSED_F_XXX - RTURIPARSED::fFlags
+ * @{  */
+/** Set if the URI contains escaped characters. */
+#define RTURIPARSED_F_CONTAINS_ESCAPED_CHARS        UINT32_C(0x00000001)
+/** Set if the URI have an authority component.  Necessary since the authority
+ * component can have a zero length. */
+#define RTURIPARSED_F_HAVE_AUTHORITY                UINT32_C(0x00000002)
+/** @} */
 
 /**
- * Check an string for a specific URI scheme.
+ * Parses a URI.
  *
- * @returns true if the scheme match, false if not.
- * @param   pszUri              The URI to check.
- * @param   pszScheme           The scheme to compare with.
+ * @returns IPRT status code.
+ * @param   pszUri              The URI to parse.
+ * @param   pParsed             Where to return the details.  This can be handed
+ *                              to the RTUriParsed* APIs for retriving
+ *                              information.
  */
-RTR3DECL(bool)   RTUriHasScheme(const char *pszUri, const char *pszScheme);
+RTDECL(int) RTUriParse(const char *pszUri, PRTURIPARSED pParsed);
 
 /**
- * Extract the scheme out of an URI.
+ * Extract the scheme out of a parsed URI.
  *
  * @returns the scheme if the URI is valid, NULL otherwise.
- * @param   pszUri              The URI to extract from.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
  */
-RTR3DECL(char *) RTUriScheme(const char *pszUri);
+RTDECL(char *) RTUriParsedScheme(const char *pszUri, PCRTURIPARSED pParsed);
 
 /**
- * Extract the authority out of an URI.
+ * Extract the authority out of a parsed URI.
  *
  * @returns the authority if the URI contains one, NULL otherwise.
- * @param   pszUri              The URI to extract from.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
+ * @remarks The authority can have a zero length.
  */
-RTR3DECL(char *) RTUriAuthority(const char *pszUri);
+RTDECL(char *) RTUriParsedAuthority(const char *pszUri, PCRTURIPARSED pParsed);
 
 /**
- * Extract the path out of an URI.
+ * Extract the username out of the authority component in a parsed URI.
+ *
+ * @returns The username if the URI contains one, otherwise NULL.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
+ *
+ * @todo    This may currently be returning NULL when it maybe would be more
+ *          appropriate to return an empty string...
+ */
+RTDECL(char *) RTUriParsedAuthorityUsername(const char *pszUri, PCRTURIPARSED pParsed);
+
+/**
+ * Extract the password out of the authority component in a parsed URI.
+ *
+ * @returns The password if the URI contains one, otherwise NULL.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
+ *
+ * @todo    This may currently be returning NULL when it maybe would be more
+ *          appropriate to return an empty string...
+ */
+RTDECL(char *) RTUriParsedAuthorityPassword(const char *pszUri, PCRTURIPARSED pParsed);
+
+/**
+ * Extract the host out of the authority component in a parsed URI.
+ *
+ * @returns The host if the URI contains one, otherwise NULL.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
+ *
+ * @todo    This may currently be returning NULL when it maybe would be more
+ *          appropriate to return an empty string...
+ */
+RTDECL(char *) RTUriParsedAuthorityHost(const char *pszUri, PCRTURIPARSED pParsed);
+
+/**
+ * Extract the port number out of the authority component in a parsed URI.
+ *
+ * @returns The port number if the URI contains one, otherwise UINT32_MAX.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
+ */
+RTDECL(uint32_t) RTUriParsedAuthorityPort(const char *pszUri, PCRTURIPARSED pParsed);
+
+/**
+ * Extract the path out of a parsed URI.
  *
  * @returns the path if the URI contains one, NULL otherwise.
- * @param   pszUri              The URI to extract from.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
  */
-RTR3DECL(char *) RTUriPath(const char *pszUri);
+RTDECL(char *) RTUriParsedPath(const char *pszUri, PCRTURIPARSED pParsed);
 
 /**
- * Extract the query out of an URI.
+ * Extract the query out of a parsed URI.
  *
  * @returns the query if the URI contains one, NULL otherwise.
- * @param   pszUri              The URI to extract from.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
  */
-RTR3DECL(char *) RTUriQuery(const char *pszUri);
+RTDECL(char *) RTUriParsedQuery(const char *pszUri, PCRTURIPARSED pParsed);
 
 /**
- * Extract the fragment out of an URI.
+ * Extract the fragment out of a parsed URI.
  *
  * @returns the fragment if the URI contains one, NULL otherwise.
+ * @param   pszUri              The URI passed to RTUriParse when producing the
+ *                              info in @a pParsed.
+ * @param   pParsed             Pointer to the RTUriParse output.
+ */
+RTDECL(char *) RTUriParsedFragment(const char *pszUri, PCRTURIPARSED pParsed);
+
+
+
+/**
+ * Creates a generic URI.
+ *
+ * The returned pointer must be freed using RTStrFree().
+ *
+ * @returns the new URI on success, NULL otherwise.
+ * @param   pszScheme           The URI scheme.
+ * @param   pszAuthority        The authority part of the URI (optional).
+ * @param   pszPath             The path part of the URI (optional).
+ * @param   pszQuery            The query part of the URI (optional).
+ * @param   pszFragment         The fragment part of the URI (optional).
+ */
+RTDECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery,
+                           const char *pszFragment);
+
+/**
+ * Check whether the given scheme matches that of the URI.
+ *
+ * This does not validate the URI, it just compares the scheme, no more, no
+ * less.  Thus it's much faster than using RTUriParsedScheme.
+ *
+ * @returns true if the scheme match, false if not.
+ * @param   pszUri              The URI to check.
+ * @param   pszScheme           The scheme to compare with.
+ */
+RTDECL(bool)   RTUriIsSchemeMatch(const char *pszUri, const char *pszScheme);
+
+/**
+ * Extract the path out of an URI.
+ *
+ * @returns the path if the URI contains one, NULL otherwise.
  * @param   pszUri              The URI to extract from.
+ * @deprecated
  */
-RTR3DECL(char *) RTUriFragment(const char *pszUri);
+RTDECL(char *) RTUriPath(const char *pszUri);
+
 
 /** @defgroup grp_rt_uri_file   RTUriFile - Uri file parsing and creation
- * Adds file: scheme support to the generic RTUri interface. This is partly
- * documented in http://datatracker.ietf.org/doc/rfc1738/.
+ *
+ * Implements basic "file:" scheme support to the generic RTUri interface.  This
+ * is partly documented in RFC-1738.
+ *
  * @{
  */
 
-/** Auto detect in which format a path is returned. */
+/** Return the host format. */
 #define URI_FILE_FORMAT_AUTO  UINT32_C(0)
 /** Return a path in UNIX format style. */
 #define URI_FILE_FORMAT_UNIX  UINT32_C(1)
@@ -120,15 +280,16 @@ RTR3DECL(char *) RTUriFragment(const char *pszUri);
 #define URI_FILE_FORMAT_WIN   UINT32_C(2)
 
 /**
- * Creates a file URI. The returned pointer must be freed
- * using RTStrFree().
+ * Creates a file URI.
+ *
+ * The returned pointer must be freed using RTStrFree().
  *
  * @see RTUriCreate
  *
- * @returns the new URI on success, NULL otherwise.
+ * @returns The new URI on success, NULL otherwise.  Free With RTStrFree.
  * @param   pszPath             The path of the URI.
  */
-RTR3DECL(char *) RTUriFileCreate(const char *pszPath);
+RTDECL(char *) RTUriFileCreate(const char *pszPath);
 
 /**
  * Returns the file path encoded in the URI.
@@ -137,7 +298,7 @@ RTR3DECL(char *) RTUriFileCreate(const char *pszPath);
  * @param   pszUri              The URI to extract from.
  * @param   uFormat             In which format should the path returned.
  */
-RTR3DECL(char *) RTUriFilePath(const char *pszUri, uint32_t uFormat);
+RTDECL(char *) RTUriFilePath(const char *pszUri, uint32_t uFormat);
 
 /**
  * Returns the file path encoded in the URI, given a max string length.
@@ -147,7 +308,7 @@ RTR3DECL(char *) RTUriFilePath(const char *pszUri, uint32_t uFormat);
  * @param   uFormat             In which format should the path returned.
  * @param   cbMax               The max string length to inspect.
  */
-RTR3DECL(char *) RTUriFileNPath(const char *pszUri, uint32_t uFormat, size_t cchMax);
+RTDECL(char *) RTUriFileNPath(const char *pszUri, uint32_t uFormat, size_t cchMax);
 
 /** @} */
 
diff --git a/include/iprt/vfs.h b/include/iprt/vfs.h
index 62e1233..6de79cb 100644
--- a/include/iprt/vfs.h
+++ b/include/iprt/vfs.h
@@ -439,7 +439,7 @@ RTDECL(int)         RTVfsSymlinkRead(RTVFSSYMLINK hVfsSym, char *pszTarget, size
  */
 
 /**
- * Create a VFS I/O stream handle from a standard IPRT file handle (RTFILE).
+ * Creates a VFS I/O stream handle from a standard IPRT file handle (RTFILE).
  *
  * @returns IPRT status code.
  * @param   hFile           The standard IPRT file handle.
@@ -452,6 +452,17 @@ RTDECL(int)         RTVfsSymlinkRead(RTVFSSYMLINK hVfsSym, char *pszTarget, size
 RTDECL(int)         RTVfsIoStrmFromRTFile(RTFILE hFile, uint64_t fOpen, bool fLeaveOpen, PRTVFSIOSTREAM phVfsIos);
 
 /**
+ * Creates a VFS I/O stream handle from a standard IPRT pipe handle (RTPIPE).
+ *
+ * @returns IPRT status code.
+ * @param   hPipe           The standard IPRT pipe handle.
+ * @param   fLeaveOpen      Whether to leave the handle open when the VFS file
+ *                          is released, or to close it (@c false).
+ * @param   phVfsIos        Where to return the VFS I/O stream handle.
+ */
+RTDECL(int)         RTVfsIoStrmFromRTPipe(RTPIPE hPipe, bool fLeaveOpen, PRTVFSIOSTREAM phVfsIos);
+
+/**
  * Convenience function combining RTFileOpen with RTVfsIoStrmFromRTFile.
  *
  * @returns IPRT status code.
diff --git a/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk b/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk
index b790aad..bd4669a 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk
+++ b/src/VBox/Additions/common/VBoxGuestLib/Makefile.kmk
@@ -116,7 +116,8 @@ VBoxGuestR3Lib_SOURCES     = \
 	VBoxGuestR3LibMisc.cpp \
 	VBoxGuestR3LibStat.cpp \
 	VBoxGuestR3LibTime.cpp \
- 	VBoxGuestR3LibModule.cpp
+ 	VBoxGuestR3LibModule.cpp \
+ 	VBoxGuestR3LibPidFile.cpp
 ifneq ($(KBUILD_TARGET),win) ## @todo get rid of this hack (as soon as it's all implemented / #defined).
  VBoxGuestR3Lib_SOURCES   += \
  	VBoxGuestR3LibDaemonize.cpp \
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp
index 12ed1d0..808e76b 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDaemonize.cpp
@@ -51,7 +51,6 @@
 # include <errno.h>
 #endif
 
-#include <iprt/file.h>
 #include <iprt/process.h>
 #include <iprt/string.h>
 #include "VBGLR3Internal.h"
@@ -250,77 +249,3 @@ VBGLR3DECL(int) VbglR3Daemonize(bool fNoChDir, bool fNoClose, bool fRespawn, uns
     return VINF_SUCCESS;
 #endif
 }
-
-
-/**
- * Creates a PID File and returns the open file descriptor.
- *
- * On DOS based system, file sharing (deny write) is used for locking the PID
- * file.
- *
- * On Unix-y systems, an exclusive advisory lock is used for locking the PID
- * file since the file sharing support is usually missing there.
- *
- * This API will overwrite any existing PID Files without a lock on them, on the
- * assumption that they are stale files which an old process did not properly
- * clean up.
- *
- * @returns IPRT status code.
- * @param   pszPath  The path and filename to create the PID File under
- * @param   phFile   Where to store the file descriptor of the open (and locked
- *                   on Unix-y systems) PID File. On failure, or if another
- *                   process owns the PID File, this will be set to NIL_RTFILE.
- */
-VBGLR3DECL(int) VbglR3PidFile(const char *pszPath, PRTFILE phFile)
-{
-    AssertPtrReturn(pszPath, VERR_INVALID_PARAMETER);
-    AssertPtrReturn(phFile, VERR_INVALID_PARAMETER);
-    *phFile = NIL_RTFILE;
-
-    RTFILE hPidFile;
-    int rc = RTFileOpen(&hPidFile, pszPath,
-                        RTFILE_O_READWRITE | RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_WRITE
-                        | (0644 << RTFILE_O_CREATE_MODE_SHIFT));
-    if (RT_SUCCESS(rc))
-    {
-#if !defined(RT_OS_WINDOWS) && !defined(RT_OS_OS2)
-        /** @todo using size 0 for locking means lock all on Posix.
-         * We should adopt this as our convention too, or something
-         * similar. */
-        rc = RTFileLock(hPidFile, RTFILE_LOCK_WRITE, 0, 0);
-        if (RT_FAILURE(rc))
-            RTFileClose(hPidFile);
-        else
-#endif
-        {
-            char szBuf[256];
-            size_t cbPid = RTStrPrintf(szBuf, sizeof(szBuf), "%d\n",
-                                       RTProcSelf());
-            RTFileWrite(hPidFile, szBuf, cbPid, NULL);
-            *phFile = hPidFile;
-        }
-    }
-    return rc;
-}
-
-
-/**
- * Close and remove an open PID File.
- *
- * @param  pszPath  The path to the PID File,
- * @param  hFile    The handle for the file. NIL_RTFILE is ignored as usual.
- */
-VBGLR3DECL(void) VbglR3ClosePidFile(const char *pszPath, RTFILE hFile)
-{
-    AssertPtrReturnVoid(pszPath);
-    if (hFile != NIL_RTFILE)
-    {
-#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
-        RTFileWriteAt(hFile, 0, "-1", 2, NULL);
-#else
-        RTFileDelete(pszPath);
-#endif
-        RTFileClose(hFile);
-    }
-}
-
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp
index 2dd30f6..e4c50de 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp
@@ -937,7 +937,7 @@ VBGLR3DECL(int) VbglR3DnDConnect(PVBGLR3GUESTDNDCMDCTX pCtx)
 
         if (RT_SUCCESS(rc))
         {
-            /* Set the protocol version to use. */
+            /* Set the default protocol version to use. */
             pCtx->uProtocol = 2;
 
             Assert(Info.u32ClientID);
@@ -945,8 +945,31 @@ VBGLR3DECL(int) VbglR3DnDConnect(PVBGLR3GUESTDNDCMDCTX pCtx)
         }
     }
 
+    /*
+     * Check if the host is >= VBox 5.0 which in case supports GUEST_DND_CONNECT.
+     */
+    bool fSupportsConnectReq = false;
     if (RT_SUCCESS(rc))
     {
+        /* The guest property service might not be available. Not fatal. */
+        uint32_t uGuestPropSvcClientID;
+        int rc2 = VbglR3GuestPropConnect(&uGuestPropSvcClientID);
+        if (RT_SUCCESS(rc2))
+        {
+            char *pszHostVersion;
+            rc2 = VbglR3GuestPropReadValueAlloc(uGuestPropSvcClientID, "/VirtualBox/HostInfo/VBoxVer", &pszHostVersion);
+            if (RT_SUCCESS(rc2))
+            {
+                fSupportsConnectReq = RTStrVersionCompare(pszHostVersion, "5.0") >= 0;
+                VbglR3GuestPropReadValueFree(pszHostVersion);
+            }
+
+            VbglR3GuestPropDisconnect(uGuestPropSvcClientID);
+        }
+    }
+
+    if (fSupportsConnectReq)
+    {
         /*
          * Try sending the connect message to tell the protocol version to use.
          * Note: This might fail when the Guest Additions run on an older VBox host (< VBox 5.0) which
@@ -966,9 +989,16 @@ VBGLR3DECL(int) VbglR3DnDConnect(PVBGLR3GUESTDNDCMDCTX pCtx)
         if (RT_SUCCESS(rc2))
             rc2 = Msg.hdr.result; /* Not fatal. */
 
+        if (RT_FAILURE(rc2))
+            fSupportsConnectReq = false;
+
         LogFlowFunc(("Connection request ended with rc=%Rrc\n", rc2));
     }
 
+    /* GUEST_DND_CONNECT not supported; play safe here and just use protocol v1. */
+    if (!fSupportsConnectReq)
+        pCtx->uProtocol = 1; /* Fall back to protocol version 1 (< VBox 5.0). */
+
     LogFlowFunc(("uClient=%RU32, uProtocol=%RU32, rc=%Rrc\n", pCtx->uClientID, pCtx->uProtocol, rc));
     return rc;
 }
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibPidFile.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibPidFile.cpp
new file mode 100644
index 0000000..d112720
--- /dev/null
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibPidFile.cpp
@@ -0,0 +1,108 @@
+/** $Id: VBoxGuestR3LibPidFile.cpp $ */
+/** @file
+ * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions,
+ * Create a PID file.
+ */
+
+/*
+ * Copyright (C) 2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#include <iprt/file.h>
+#include <iprt/string.h>
+#include <iprt/process.h>
+#include "VBGLR3Internal.h"
+
+/**
+ * Creates a PID File and returns the open file descriptor.
+ *
+ * On DOS based system, file sharing (deny write) is used for locking the PID
+ * file.
+ *
+ * On Unix-y systems, an exclusive advisory lock is used for locking the PID
+ * file since the file sharing support is usually missing there.
+ *
+ * This API will overwrite any existing PID Files without a lock on them, on the
+ * assumption that they are stale files which an old process did not properly
+ * clean up.
+ *
+ * @returns IPRT status code.
+ * @param   pszPath  The path and filename to create the PID File under
+ * @param   phFile   Where to store the file descriptor of the open (and locked
+ *                   on Unix-y systems) PID File. On failure, or if another
+ *                   process owns the PID File, this will be set to NIL_RTFILE.
+ */
+VBGLR3DECL(int) VbglR3PidFile(const char *pszPath, PRTFILE phFile)
+{
+    AssertPtrReturn(pszPath, VERR_INVALID_PARAMETER);
+    AssertPtrReturn(phFile, VERR_INVALID_PARAMETER);
+    *phFile = NIL_RTFILE;
+
+    RTFILE hPidFile;
+    int rc = RTFileOpen(&hPidFile, pszPath,
+                        RTFILE_O_READWRITE | RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_WRITE
+                        | (0644 << RTFILE_O_CREATE_MODE_SHIFT));
+    if (RT_SUCCESS(rc))
+    {
+#if !defined(RT_OS_WINDOWS) && !defined(RT_OS_OS2)
+        /** @todo using size 0 for locking means lock all on Posix.
+         * We should adopt this as our convention too, or something
+         * similar. */
+        rc = RTFileLock(hPidFile, RTFILE_LOCK_WRITE, 0, 0);
+        if (RT_FAILURE(rc))
+            RTFileClose(hPidFile);
+        else
+#endif
+        {
+            char szBuf[256];
+            size_t cbPid = RTStrPrintf(szBuf, sizeof(szBuf), "%d\n",
+                                       RTProcSelf());
+            RTFileWrite(hPidFile, szBuf, cbPid, NULL);
+            *phFile = hPidFile;
+        }
+    }
+    return rc;
+}
+
+
+/**
+ * Close and remove an open PID File.
+ *
+ * @param  pszPath  The path to the PID File,
+ * @param  hFile    The handle for the file. NIL_RTFILE is ignored as usual.
+ */
+VBGLR3DECL(void) VbglR3ClosePidFile(const char *pszPath, RTFILE hFile)
+{
+    AssertPtrReturnVoid(pszPath);
+    if (hFile != NIL_RTFILE)
+    {
+#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
+        RTFileWriteAt(hFile, 0, "-1", 2, NULL);
+#else
+        RTFileDelete(pszPath);
+#endif
+        RTFileClose(hFile);
+    }
+}
+
diff --git a/src/VBox/Additions/common/VBoxService/VBoxService.cpp b/src/VBox/Additions/common/VBoxService/VBoxService.cpp
index cd410b2..f02054a 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxService.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxService.cpp
@@ -68,8 +68,9 @@
 /** The program name (derived from argv[0]). */
 char                *g_pszProgName =  (char *)"";
 /** The current verbosity level. */
-int                  g_cVerbosity = 0;
+unsigned             g_cVerbosity = 0;
 char                 g_szLogFile[RTPATH_MAX + 128] = "";
+char                 g_szPidFile[RTPATH_MAX] = "";
 /** Logging parameters. */
 /** @todo Make this configurable later. */
 static PRTLOGGER     g_pLoggerRelease = NULL;
@@ -289,6 +290,28 @@ void VBoxServiceLogDestroy(void)
     RTLogDestroy(RTLogRelSetDefaultInstance(NULL));
 }
 
+/*
+ * Create the PID file.
+ */
+int vboxServiceCreatePidFile(const char *pszPidFile)
+{
+    RTFILE hFile;
+    int rc = RTFileOpen(&hFile, pszPidFile, RTFILE_O_WRITE | RTFILE_O_TRUNCATE);
+    if (RT_SUCCESS(rc))
+    {
+        char szPid[32];
+        RTPROCESS Process = RTProcSelf();
+        size_t cb = RTStrPrintf(szPid, sizeof(szPid), "%RU64\n", (uint64_t)Process);
+        rc = RTFileWrite(hFile, szPid, cb, NULL);
+        int rc2 = RTFileClose(hFile);
+        if (RT_SUCCESS(rc))
+            rc = rc2;
+    }
+    if (RT_FAILURE(rc))
+        VBoxServiceError("Failed to create PID file: %Rrc\n", rc);
+    return rc;
+}
+
 
 /**
  * Displays the program usage message.
@@ -299,7 +322,7 @@ static int vboxServiceUsage(void)
 {
     RTPrintf("Usage:\n"
              " %-12s [-f|--foreground] [-v|--verbose] [-l|--logfile <file>]\n"
-             "              [-i|--interval <seconds>]\n"
+             "              [-p|--pidfile <file>] [-i|--interval <seconds>]\n"
              "              [--disable-<service>] [--enable-<service>]\n"
              "              [--only-<service>] [-h|-?|--help]\n", g_pszProgName);
 #ifdef RT_OS_WINDOWS
@@ -313,6 +336,7 @@ static int vboxServiceUsage(void)
              "    -i | --interval         The default interval.\n"
              "    -f | --foreground       Don't daemonize the program. For debugging.\n"
              "    -l | --logfile <file>   Enables logging to a file.\n"
+             "    -p | --pidfile <file>   Write the process ID to a file.\n"
              "    -v | --verbose          Increment the verbosity level. For debugging.\n"
              "    -V | --version          Show version information.\n"
              "    -h | -? | --help        Show this message and exit with status 1.\n"
@@ -370,7 +394,7 @@ RTEXITCODE VBoxServiceError(const char *pszFormat, ...)
  * @param   pszFormat   The message text.
  * @param   ...         Format arguments.
  */
-void VBoxServiceVerbose(int iLevel, const char *pszFormat, ...)
+void VBoxServiceVerbose(unsigned iLevel, const char *pszFormat, ...)
 {
     if (iLevel <= g_cVerbosity)
     {
@@ -865,7 +889,7 @@ int main(int argc, char **argv)
      * handles a guest control session.
      */
     if (fUserSession)
-        return VBoxServiceControlSessionForkInit(argc, argv);
+        return VBoxServiceControlSessionSpawnInit(argc, argv);
 #endif
 
     /*
@@ -907,6 +931,8 @@ int main(int argc, char **argv)
 #endif
             else if (MATCHES("logfile"))
                 psz = "l";
+            else if (MATCHES("pidfile"))
+                psz = "p";
             else if (MATCHES("daemonized"))
             {
                 fDaemonized = true;
@@ -1003,6 +1029,16 @@ int main(int argc, char **argv)
                     break;
                 }
 
+                case 'p':
+                {
+                    rc = VBoxServiceArgString(argc, argv, psz + 1, &i,
+                                              g_szPidFile, sizeof(g_szPidFile));
+                    if (rc)
+                        return rc;
+                    psz = NULL;
+                    break;
+                }
+
                 default:
                 {
                     rcExit = vboxServiceLazyPreInit();
@@ -1124,9 +1160,15 @@ int main(int argc, char **argv)
 # endif /* !RT_OS_NT4 */
 #endif /* RT_OS_WINDOWS */
         rc = VBoxServiceStartServices();
+        RTFILE hPidFile = NIL_RTFILE;
+        if (RT_SUCCESS(rc))
+            if (g_szPidFile[0])
+                rc = VbglR3PidFile(g_szPidFile, &hPidFile);
         rcExit = RT_SUCCESS(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
         if (RT_SUCCESS(rc))
             VBoxServiceMainWait();
+        if (g_szPidFile[0] && hPidFile != NIL_RTFILE)
+            VbglR3ClosePidFile(g_szPidFile, hPidFile);
 #ifdef RT_OS_WINDOWS
 # ifndef RT_OS_NT4
         /* Uninstall console control handler. */
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp
index 6f61209..5cd21e7 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp
@@ -129,12 +129,12 @@ static DECLCALLBACK(int) VBoxServiceControlOption(const char **ppszShort, int ar
 #ifdef DEBUG
     else if (!strcmp(argv[*pi], "--control-dump-stdout"))
     {
-        g_Session.uFlags |= VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT;
+        g_Session.fFlags |= VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT;
         rc = 0; /* Flag this command as parsed. */
     }
     else if (!strcmp(argv[*pi], "--control-dump-stderr"))
     {
-        g_Session.uFlags |= VBOXSERVICECTRLSESSION_FLAG_DUMPSTDERR;
+        g_Session.fFlags |= VBOXSERVICECTRLSESSION_FLAG_DUMPSTDERR;
         rc = 0; /* Flag this command as parsed. */
     }
 #endif
@@ -371,7 +371,7 @@ static int gstcntlHandleSessionOpen(PVBGLR3GUESTCTRLCMDCTX pHostCtx)
                                            ssInfo.szUser,     sizeof(ssInfo.szUser),
                                            ssInfo.szPassword, sizeof(ssInfo.szPassword),
                                            ssInfo.szDomain,   sizeof(ssInfo.szDomain),
-                                           &ssInfo.uFlags,    &ssInfo.uSessionID);
+                                           &ssInfo.fFlags,    &ssInfo.uSessionID);
     if (RT_SUCCESS(rc))
     {
         /* The session open call has the protocol version the host
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControl.h b/src/VBox/Additions/common/VBoxService/VBoxServiceControl.h
index 1fcdc58..a3e540f 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceControl.h
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControl.h
@@ -81,7 +81,7 @@ typedef struct VBOXSERVICECTRLSESSIONSTARTUPINFO
     char                            szDomain[GUESTPROCESS_MAX_DOMAIN_LEN];
     /** Session creation flags.
      *  @sa VBOXSERVICECTRLSESSIONSTARTUPFLAG_* flags. */
-    uint32_t                        uFlags;
+    uint32_t                        fFlags;
 } VBOXSERVICECTRLSESSIONSTARTUPINFO;
 /** Pointer to thread data. */
 typedef VBOXSERVICECTRLSESSIONSTARTUPINFO *PVBOXSERVICECTRLSESSIONSTARTUPINFO;
@@ -135,9 +135,9 @@ typedef struct VBOXSERVICECTRLSESSIONTHREAD
 /** Pointer to thread data. */
 typedef VBOXSERVICECTRLSESSIONTHREAD *PVBOXSERVICECTRLSESSIONTHREAD;
 
-/** Flag indicating that this session has been forked from
+/** Flag indicating that this session has been spawned from
  *  the main executable. */
-#define VBOXSERVICECTRLSESSION_FLAG_FORK                 RT_BIT(0)
+#define VBOXSERVICECTRLSESSION_FLAG_SPAWN                RT_BIT(0)
 /** Flag indicating that this session is anonymous, that is,
  *  it will run start guest processes with the same credentials
  *  as the main executable. */
@@ -176,7 +176,7 @@ typedef struct VBOXSERVICECTRLSESSION
     /** Internal session flags, not related
      *  to StartupInfo stuff.
      *  @sa VBOXSERVICECTRLSESSION_FLAG_* flags. */
-    uint32_t                        uFlags;
+    uint32_t                        fFlags;
     /** How many processes do we allow keeping around at a time? */
     uint32_t                        uProcsMaxKept;
 } VBOXSERVICECTRLSESSION;
@@ -298,7 +298,7 @@ extern int                      GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
 extern int                      GstCntlSessionThreadDestroy(PVBOXSERVICECTRLSESSIONTHREAD pSession, uint32_t uFlags);
 extern int                      GstCntlSessionThreadDestroyAll(PRTLISTANCHOR pList, uint32_t uFlags);
 extern int                      GstCntlSessionThreadTerminate(PVBOXSERVICECTRLSESSIONTHREAD pSession);
-extern RTEXITCODE               VBoxServiceControlSessionForkInit(int argc, char **argv);
+extern RTEXITCODE               VBoxServiceControlSessionSpawnInit(int argc, char **argv);
 /* Per-session functions. */
 extern PVBOXSERVICECTRLPROCESS  GstCntlSessionRetainProcess(PVBOXSERVICECTRLSESSION pSession, uint32_t uPID);
 extern int                      GstCntlSessionClose(PVBOXSERVICECTRLSESSION pSession);
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp
index 0b4527e..564bccf 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp
@@ -1371,8 +1371,9 @@ static int gstcntlProcessCreateProcess(const char *pszExec, const char * const *
             {
                 if (fFlags & EXECUTEPROCESSFLAG_HIDDEN)
                     uProcFlags |= RTPROC_FLAGS_HIDDEN;
-                if (fFlags & EXECUTEPROCESSFLAG_NO_PROFILE)
-                    uProcFlags |= RTPROC_FLAGS_NO_PROFILE;
+                /** @todo Rename to EXECUTEPROCESSFLAG_PROFILE in next API change. */
+                if (!(fFlags & EXECUTEPROCESSFLAG_NO_PROFILE))
+                    uProcFlags |= RTPROC_FLAGS_PROFILE;
                 if (fFlags & EXECUTEPROCESSFLAG_UNQUOTED_ARGS)
                     uProcFlags |= RTPROC_FLAGS_UNQUOTED_ARGS;
             }
@@ -1496,7 +1497,7 @@ static int gstcntlProcessProcessWorker(PVBOXSERVICECTRLPROCESS pProcess)
                                 (pProcess->StartupInfo.uNumArgs > 0) ? pProcess->StartupInfo.szArgs : "",
                                 RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL);
     /* Did we get the same result? */
-    Assert(pProcess->StartupInfo.uNumArgs == uNumArgs);
+    Assert(pProcess->StartupInfo.uNumArgs == uNumArgs + 1 /* Take argv[0] into account */);
 
     /*
      * Prepare environment variables list.
@@ -1614,7 +1615,7 @@ static int gstcntlProcessProcessWorker(PVBOXSERVICECTRLPROCESS pProcess)
                             if (RT_SUCCESS(rc))
                             {
                                 AssertPtr(pProcess->pSession);
-                                bool fNeedsImpersonation = !(pProcess->pSession->uFlags & VBOXSERVICECTRLSESSION_FLAG_FORK);
+                                bool fNeedsImpersonation = !(pProcess->pSession->fFlags & VBOXSERVICECTRLSESSION_FLAG_SPAWN);
 
                                 rc = gstcntlProcessCreateProcess(pProcess->StartupInfo.szCmd, papszArgs, hEnv,
                                                                  pProcess->StartupInfo.uFlags,
@@ -1971,7 +1972,7 @@ static DECLCALLBACK(int) gstcntlProcessOnOutput(PVBOXSERVICECTRLPROCESS pThis,
 #ifdef DEBUG
         if (RT_SUCCESS(rc))
         {
-            if (   pSession->uFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT
+            if (   pSession->fFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT
                 && (   uHandle == OUTPUT_HANDLE_ID_STDOUT
                     || uHandle == OUTPUT_HANDLE_ID_STDOUT_DEPRECATED)
                )
@@ -1983,7 +1984,7 @@ static DECLCALLBACK(int) gstcntlProcessOnOutput(PVBOXSERVICECTRLPROCESS pThis,
                     rc = gstcntlProcessDumpToFile(szDumpFile, pvBuf, cbRead);
                 AssertRC(rc);
             }
-            else if (   pSession->uFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDERR
+            else if (   pSession->fFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDERR
                      && uHandle == OUTPUT_HANDLE_ID_STDERR)
             {
                 char szDumpFile[RTPATH_MAX];
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp
index 6b0ca63..e8200ab 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp
@@ -1,7 +1,6 @@
 /* $Id: VBoxServiceControlSession.cpp $ */
 /** @file
- * VBoxServiceControlSession - Guest session handling. Also handles
- *                             the forked session processes.
+ * VBoxServiceControlSession - Guest session handling. Also handles the spawned session processes.
  */
 
 /*
@@ -74,7 +73,7 @@ static int                  gstcntlSessionHandleProcTerminate(const PVBOXSERVICE
 static int                  gstcntlSessionHandleProcWaitFor(const PVBOXSERVICECTRLSESSION pSession, PVBGLR3GUESTCTRLCMDCTX pHostCtx);
 
 
-/** Generic option indices for session fork arguments. */
+/** Generic option indices for session spawn arguments. */
 enum
 {
     VBOXSERVICESESSIONOPT_FIRST = 1000, /* For initialization. */
@@ -132,76 +131,44 @@ static int gstcntlSessionHandleDirRemove(PVBOXSERVICECTRLSESSION pSession,
     AssertPtrReturn(pHostCtx, VERR_INVALID_POINTER);
 
     char szDir[RTPATH_MAX];
-    uint32_t uFlags = 0;
+    uint32_t fFlags = 0;
 
     int rc = VbglR3GuestCtrlDirGetRemove(pHostCtx,
                                          /* Directory to remove. */
                                          szDir, sizeof(szDir),
                                          /* Flags of type DIRREMOVE_FLAG_. */
-                                         &uFlags);
+                                         &fFlags);
     if (RT_SUCCESS(rc))
     {
-        uint32_t uFlagsRemRec = 0;
-        bool fRecursive = false;
-/** @todo r=bird: Unnecessary variable fRecursive.  You can check for
- * DIRREMOVE_FLAG_RECURSIVE directly in the flags when deciding which API to
- * call. */
-
-        if (!(uFlags & ~DIRREMOVE_FLAG_VALID_MASK))
+        AssertReturn(!(fFlags & ~DIRREMOVE_FLAG_VALID_MASK), VERR_INVALID_PARAMETER);
+        if (!(fFlags & ~DIRREMOVE_FLAG_VALID_MASK))
         {
-            if (uFlags & DIRREMOVE_FLAG_RECURSIVE)
-            {
-                /* Note: DIRREMOVE_FLAG_RECURSIVE must be set explicitly.
-                 *       Play safe here. */
-                fRecursive = true;
-            }
-/** @todo r=bird: Understand how APIs you use work (read docs, check constant,
- * check code). If you check the actual values of RTDIRRMREC_F_CONTENT_AND_DIR
- * and RTDIRRMREC_F_CONTENT_ONLY, you'd notice that the first one is 0 and the
- * second is 1.  This code is a little confused about how it all works, though
- * it ends up doing the right thing as if by accident almost. */
-            if (uFlags & DIRREMOVE_FLAG_CONTENT_AND_DIR)
+            if (fFlags & DIRREMOVE_FLAG_RECURSIVE)
             {
-                /* Setting direct value is intentional. */
-                uFlagsRemRec = RTDIRRMREC_F_CONTENT_AND_DIR;
-            }
+                uint32_t fFlagsRemRec = RTDIRRMREC_F_CONTENT_AND_DIR; /* Set default. */
+                if (fFlags & DIRREMOVE_FLAG_CONTENT_ONLY)
+                    fFlagsRemRec |= RTDIRRMREC_F_CONTENT_ONLY;
 
-            if (uFlags & DIRREMOVE_FLAG_CONTENT_ONLY)
-            {
-                /* Setting direct value is intentional. */
-                uFlagsRemRec |= RTDIRRMREC_F_CONTENT_ONLY;
+                rc = RTDirRemoveRecursive(szDir, fFlagsRemRec);
             }
+            else /* Only delete directory if not empty. */
+                rc = RTDirRemove(szDir);
         }
         else
             rc = VERR_NOT_SUPPORTED;
 
-        VBoxServiceVerbose(4, "[Dir %s]: Removing with uFlags=0x%x, fRecursive=%RTbool\n",
-                           szDir, uFlags, fRecursive);
-
-/** @todo r=bird: Convoluted code flow. It would be shorter and easier to
- * read if you moved this code up and into the flags-are-valid if body. */
-        if (RT_SUCCESS(rc))
-        {
-            /** @todo Add own recursive function (or a new IPRT function w/ callback?) to
-             *        provide guest-to-host progress reporting. */
-            if (fRecursive)
-                rc = RTDirRemoveRecursive(szDir, uFlagsRemRec);
-            else
-                rc = RTDirRemove(szDir);
-        }
+        VBoxServiceVerbose(4, "[Dir %s]: Removing with fFlags=0x%x, rc=%Rrc\n", szDir, fFlags, rc);
 
         /* Report back in any case. */
         int rc2 = VbglR3GuestCtrlMsgReply(pHostCtx, rc);
         if (RT_FAILURE(rc2))
-            VBoxServiceError("[Dir %s]: Failed to report removing status, rc=%Rrc\n",
-                             szDir, rc2);
+            VBoxServiceError("[Dir %s]: Failed to report removing status, rc=%Rrc\n", szDir, rc2);
         if (RT_SUCCESS(rc))
             rc = rc2;
     }
 
 #ifdef DEBUG
-    VBoxServiceVerbose(4, "Removing directory \"%s\" returned rc=%Rrc\n",
-                       szDir, rc);
+    VBoxServiceVerbose(4, "Removing directory \"%s\" returned rc=%Rrc\n", szDir, rc);
 #endif
     return rc;
 }
@@ -245,17 +212,15 @@ static int gstcntlSessionHandleFileOpen(PVBOXSERVICECTRLSESSION pSession,
             if (!strlen(szFile))
                 rc = VERR_INVALID_PARAMETER;
 
-            if (   RT_SUCCESS(rc)
-                && !RTStrPrintf(pFile->szName, sizeof(pFile->szName), "%s", szFile))
-                rc = VERR_NO_MEMORY;
-
             if (RT_SUCCESS(rc))
             {
+                RTStrPrintf(pFile->szName, sizeof(pFile->szName), "%s", szFile);
+
                 uint64_t fFlags;
                 rc = RTFileModeToFlagsEx(szAccess, szDisposition,
                                          NULL /* pszSharing, not used yet */, &fFlags);
-                VBoxServiceVerbose(4, "[File %s]: Opening flags=0x%x, rc=%Rrc\n",
-                                   pFile->szName, fFlags, rc);
+                VBoxServiceVerbose(4, "[File %s]: Opening with fFlags=0x%x, rc=%Rrc\n", pFile->szName, fFlags, rc);
+
                 if (RT_SUCCESS(rc))
                     rc = RTFileOpen(&pFile->hFile, pFile->szName, fFlags);
                 if (   RT_SUCCESS(rc)
@@ -269,8 +234,7 @@ static int gstcntlSessionHandleFileOpen(PVBOXSERVICECTRLSESSION pSession,
                                          pFile->szName, uOffset, rc);
                 }
                 else if (RT_FAILURE(rc))
-                    VBoxServiceError("[File %s]: Opening failed; rc=%Rrc\n",
-                                     pFile->szName, rc);
+                    VBoxServiceError("[File %s]: Opening failed with rc=%Rrc\n", pFile->szName, rc);
             }
 
             if (RT_SUCCESS(rc))
@@ -480,8 +444,7 @@ static int gstcntlSessionHandleFileWrite(const PVBOXSERVICECTRLSESSION pSession,
     uint32_t cbToWrite;
 
     int rc = VbglR3GuestCtrlFileGetWrite(pHostCtx, &uHandle,
-                                         pvScratchBuf, cbScratchBuf,
-                                         &cbToWrite);
+                                         pvScratchBuf, (uint32_t)cbScratchBuf, &cbToWrite);
     if (RT_SUCCESS(rc))
     {
         size_t cbWritten = 0;
@@ -528,7 +491,7 @@ static int gstcntlSessionHandleFileWriteAt(const PVBOXSERVICECTRLSESSION pSessio
     uint32_t cbToWrite; int64_t iOffset;
 
     int rc = VbglR3GuestCtrlFileGetWriteAt(pHostCtx, &uHandle,
-                                           pvScratchBuf, cbScratchBuf,
+                                           pvScratchBuf, (uint32_t)cbScratchBuf,
                                            &cbToWrite, (uint64_t *)&iOffset);
     if (RT_SUCCESS(rc))
     {
@@ -866,7 +829,7 @@ int gstcntlSessionHandleProcInput(PVBOXSERVICECTRLSESSION pSession,
      * Ask the host for the input data.
      */
     int rc = VbglR3GuestCtrlProcGetInput(pHostCtx, &uPID, &uFlags,
-                                         pvScratchBuf, cbScratchBuf, &cbSize);
+                                         pvScratchBuf, (uint32_t)cbScratchBuf, &cbSize);
     if (RT_FAILURE(rc))
     {
         VBoxServiceError("Failed to retrieve process input command for PID=%RU32, rc=%Rrc\n",
@@ -1036,16 +999,16 @@ int GstCntlSessionHandler(PVBOXSERVICECTRLSESSION pSession,
     int rc = VINF_SUCCESS;
     /**
      * Only anonymous sessions (that is, sessions which run with local
-     * service privileges) or forked session processes can do certain
+     * service privileges) or spawned session processes can do certain
      * operations.
      */
-    bool fImpersonated = (   pSession->uFlags & VBOXSERVICECTRLSESSION_FLAG_FORK
-                          || pSession->uFlags & VBOXSERVICECTRLSESSION_FLAG_ANONYMOUS);
+    bool fImpersonated = (   pSession->fFlags & VBOXSERVICECTRLSESSION_FLAG_SPAWN
+                          || pSession->fFlags & VBOXSERVICECTRLSESSION_FLAG_ANONYMOUS);
 
     switch (uMsg)
     {
         case HOST_SESSION_CLOSE:
-            /* Shutdown (this fork). */
+            /* Shutdown (this spawn). */
             rc = GstCntlSessionClose(pSession);
             *pfShutdown = true; /* Shutdown in any case. */
             break;
@@ -1151,9 +1114,8 @@ int GstCntlSessionHandler(PVBOXSERVICECTRLSESSION pSession,
 
 
 /**
- * Thread main routine for a forked guest session process.
- * This thread runs in the main executable to control the forked
- * session process.
+ * Thread main routine for a spawned guest session process.
+ * This thread runs in the main executable to control the spawned session process.
  *
  * @return IPRT status code.
  * @param  RTTHREAD             Pointer to the thread's data.
@@ -1357,7 +1319,7 @@ static DECLCALLBACK(int) gstcntlSessionThread(RTTHREAD ThreadSelf, void *pvUser)
 }
 
 
-RTEXITCODE gstcntlSessionForkWorker(PVBOXSERVICECTRLSESSION pSession)
+RTEXITCODE gstcntlSessionSpawnWorker(PVBOXSERVICECTRLSESSION pSession)
 {
     AssertPtrReturn(pSession, RTEXITCODE_FAILURE);
 
@@ -1649,14 +1611,14 @@ int GstCntlSessionDestroy(PVBOXSERVICECTRLSESSION pSession)
 }
 
 
-int GstCntlSessionInit(PVBOXSERVICECTRLSESSION pSession, uint32_t uFlags)
+int GstCntlSessionInit(PVBOXSERVICECTRLSESSION pSession, uint32_t fFlags)
 {
     AssertPtrReturn(pSession, VERR_INVALID_POINTER);
 
     RTListInit(&pSession->lstProcesses);
     RTListInit(&pSession->lstFiles);
 
-    pSession->uFlags = uFlags;
+    pSession->fFlags = fFlags;
 
     /* Init critical section for protecting the thread lists. */
     int rc = RTCritSectInit(&pSession->CritSect);
@@ -1781,6 +1743,225 @@ int GstCntlSessionProcessStartAllowed(const PVBOXSERVICECTRLSESSION pSession,
 
 
 /**
+ * Creates the process for a guest session.
+ *
+ *
+ * @return  IPRT status code.
+ * @param   pSessionStartupInfo     Session startup info.
+ * @param   pSessionThread          The session thread under construction.
+ * @param   uCtrlSessionThread      The session thread debug ordinal.
+ */
+static int vgsvcGstCntlSessionThreadCreateProcess(const PVBOXSERVICECTRLSESSIONSTARTUPINFO pSessionStartupInfo,
+                                                  PVBOXSERVICECTRLSESSIONTHREAD pSessionThread, uint32_t uCtrlSessionThread)
+{
+    /*
+     * Is this an anonymous session?  Anonymous sessions run with the same
+     * privileges as the main VBoxService executable.
+     */
+    bool const fAnonymous = pSessionThread->StartupInfo.szUser[0] == '\0';
+    if (fAnonymous)
+    {
+        Assert(!strlen(pSessionThread->StartupInfo.szPassword));
+        Assert(!strlen(pSessionThread->StartupInfo.szDomain));
+
+        VBoxServiceVerbose(3, "New anonymous guest session ID=%RU32 created, fFlags=%x, using protocol %RU32\n",
+                           pSessionStartupInfo->uSessionID,
+                           pSessionStartupInfo->fFlags,
+                           pSessionStartupInfo->uProtocol);
+    }
+    else
+    {
+        VBoxServiceVerbose(3, "Spawning new guest session ID=%RU32, szUser=%s, szPassword=%s, szDomain=%s, fFlags=%x, using protocol %RU32\n",
+                           pSessionStartupInfo->uSessionID,
+                           pSessionStartupInfo->szUser,
+#ifdef DEBUG
+                           pSessionStartupInfo->szPassword,
+#else
+                           "XXX", /* Never show passwords in release mode. */
+#endif
+                           pSessionStartupInfo->szDomain,
+                           pSessionStartupInfo->fFlags,
+                           pSessionStartupInfo->uProtocol);
+    }
+
+    /*
+     * Spawn a child process for doing the actual session handling.
+     * Start by assembling the argument list.
+     */
+    int  rc = VINF_SUCCESS;
+    char szExeName[RTPATH_MAX];
+    char *pszExeName = RTProcGetExecutablePath(szExeName, sizeof(szExeName));
+    if (pszExeName)
+    {
+        char szParmSessionID[32];
+        RTStrPrintf(szParmSessionID, sizeof(szParmSessionID), "--session-id=%RU32", pSessionThread->StartupInfo.uSessionID);
+
+        char szParmSessionProto[32];
+        RTStrPrintf(szParmSessionProto, sizeof(szParmSessionProto), "--session-proto=%RU32",
+                    pSessionThread->StartupInfo.uProtocol);
+#ifdef DEBUG
+        char szParmThreadId[32];
+        RTStrPrintf(szParmThreadId, sizeof(szParmThreadId), "--thread-id=%RU32", uCtrlSessionThread);
+#endif
+        int idxArg = 0; /* Next index in argument vector. */
+        char const *apszArgs[24];
+
+        apszArgs[idxArg++] = pszExeName;
+        apszArgs[idxArg++] = "guestsession";
+        apszArgs[idxArg++] = szParmSessionID;
+        apszArgs[idxArg++] = szParmSessionProto;
+#ifdef DEBUG
+        apszArgs[idxArg++] = szParmThreadId;
+#endif
+        if (!fAnonymous) /* Do we need to pass a user name? */
+        {
+            apszArgs[idxArg++] = "--user";
+            apszArgs[idxArg++] = pSessionThread->StartupInfo.szUser;
+        }
+
+        /* Add same verbose flags as parent process. */
+        char szParmVerbose[32];
+        if (g_cVerbosity > 0)
+        {
+            unsigned cVs = RT_MIN(g_cVerbosity, RT_ELEMENTS(szParmVerbose) - 2);
+            szParmVerbose[0] = '-';
+            memset(&szParmVerbose[1], 'v', cVs);
+            szParmVerbose[1 + cVs] = '\0';
+            apszArgs[idxArg++] = szParmVerbose;
+        }
+
+        /* Add log file handling. Each session will have an own
+         * log file, naming based on the parent log file. */
+        char szParmLogFile[sizeof(g_szLogFile) + 128];
+        if (g_szLogFile[0])
+        {
+            const char *pszSuffix = RTPathSuffix(g_szLogFile);
+            if (!pszSuffix)
+                pszSuffix = strchr(g_szLogFile, '\0');
+            size_t cchBase = pszSuffix - g_szLogFile;
+#ifndef DEBUG
+            RTStrPrintf(szParmLogFile, sizeof(szParmLogFile), "%.*s-%RU32-%s%s",
+                        cchBase, g_szLogFile, pSessionStartupInfo->uSessionID, pSessionStartupInfo->szUser, pszSuffix);
+#else
+            RTStrPrintf(szParmLogFile, sizeof(szParmLogFile), "%.*s-%RU32-%RU32-%s%s",
+                        cchBase, g_szLogFile, pSessionStartupInfo->uSessionID, uCtrlSessionThread,
+                        pSessionStartupInfo->szUser, pszSuffix);
+#endif
+            apszArgs[idxArg++] = "--logfile";
+            apszArgs[idxArg++] = szParmLogFile;
+        }
+
+#ifdef DEBUG
+        VBoxServiceVerbose(4, "Argv building rc=%Rrc, session flags=%x\n", rc, g_Session.fFlags);
+        if (RT_SUCCESS(rc))
+        {
+            if (g_Session.fFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT)
+                apszArgs[idxArg++] = "--dump-stdout";
+            if (g_Session.fFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDERR)
+                apszArgs[idxArg++] = "--dump-stderr";
+        }
+#endif
+        apszArgs[idxArg] = NULL;
+        Assert(idxArg < RT_ELEMENTS(apszArgs));
+
+        if (g_cVerbosity > 3)
+        {
+            VBoxServiceVerbose(4, "Spawning parameters:\n");
+            for (idxArg = 0; apszArgs[idxArg]; idxArg++)
+                VBoxServiceVerbose(4, "\t%s\n", apszArgs[idxArg]);
+        }
+
+        /*
+         * Configure standard handles and finally create the process.
+         */
+        uint32_t fProcCreate = RTPROC_FLAGS_SERVICE
+#ifdef RT_OS_WINDOWS    /** @todo do on unix too! */
+                             /* Make sure to also load the profile data on a Windows guest. */
+                             | RTPROC_FLAGS_PROFILE
+#endif
+                             | RTPROC_FLAGS_HIDDEN;       /** @todo More flags from startup info? */
+
+#if 0 /* Pipe handling not needed (yet). */
+        /* Setup pipes. */
+        rc = GstcntlProcessSetupPipe("|", 0 /*STDIN_FILENO*/,
+                                     &pSession->StdIn.hChild, &pSession->StdIn.phChild, &pSession->hStdInW);
+        if (RT_SUCCESS(rc))
+        {
+            rc = GstcntlProcessSetupPipe("|", 1 /*STDOUT_FILENO*/,
+                                         &pSession->StdOut.hChild, &pSession->StdOut.phChild, &pSession->hStdOutR);
+            if (RT_SUCCESS(rc))
+            {
+                rc = GstcntlProcessSetupPipe("|", 2 /*STDERR_FILENO*/,
+                                             &pSession->StdErr.hChild, &pSession->StdErr.phChild, &pSession->hStdErrR);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = RTPollSetCreate(&pSession->hPollSet);
+                    if (RT_SUCCESS(rc))
+                        rc = RTPollSetAddPipe(pSession->hPollSet, pSession->hStdInW, RTPOLL_EVT_ERROR,
+                                              VBOXSERVICECTRLPIPEID_STDIN);
+                    if (RT_SUCCESS(rc))
+                        rc = RTPollSetAddPipe(pSession->hPollSet, pSession->hStdOutR, RTPOLL_EVT_READ | RTPOLL_EVT_ERROR,
+                                              VBOXSERVICECTRLPIPEID_STDOUT);
+                    if (RT_SUCCESS(rc))
+                        rc = RTPollSetAddPipe(pSession->hPollSet, pSession->hStdErrR, RTPOLL_EVT_READ | RTPOLL_EVT_ERROR,
+                                              VBOXSERVICECTRLPIPEID_STDERR);
+                }
+
+                if (RT_SUCCESS(rc))
+                    rc = RTProcCreateEx(pszExeName, apszArgs, hEnv, fProcCreate,
+                                        pSession->StdIn.phChild, pSession->StdOut.phChild, pSession->StdErr.phChild,
+                                        !fAnonymous ? pSession->StartupInfo.szUser : NULL,
+                                        !fAnonymous ? pSession->StartupInfo.szPassword : NULL,
+                                        &pSession->hProcess);
+
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * Close the child ends of any pipes and redirected files.
+                     */
+                    int rc2 = RTHandleClose(pSession->StdIn.phChild); AssertRC(rc2);
+                    pSession->StdIn.phChild     = NULL;
+                    rc2 = RTHandleClose(pSession->StdOut.phChild);    AssertRC(rc2);
+                    pSession->StdOut.phChild    = NULL;
+                    rc2 = RTHandleClose(pSession->StdErr.phChild);    AssertRC(rc2);
+                    pSession->StdErr.phChild    = NULL;
+                }
+            }
+        }
+#else
+        RTHANDLE hStdIn;
+        if (RT_SUCCESS(rc))
+            rc = RTFileOpenBitBucket(&hStdIn.u.hFile, RTFILE_O_READ);
+        if (RT_SUCCESS(rc))
+        {
+            hStdIn.enmType = RTHANDLETYPE_FILE;
+
+            RTHANDLE hStdOutAndErr;
+            rc = RTFileOpenBitBucket(&hStdOutAndErr.u.hFile, RTFILE_O_WRITE);
+            if (RT_SUCCESS(rc))
+            {
+                hStdOutAndErr.enmType = RTHANDLETYPE_FILE;
+
+                rc = RTProcCreateEx(pszExeName, apszArgs, RTENV_DEFAULT, fProcCreate,
+                                    &hStdIn, &hStdOutAndErr, &hStdOutAndErr,
+                                    !fAnonymous ? pSessionThread->StartupInfo.szUser : NULL,
+                                    !fAnonymous ? pSessionThread->StartupInfo.szPassword : NULL,
+                                    &pSessionThread->hProcess);
+
+                RTFileClose(hStdOutAndErr.u.hFile);
+            }
+
+            RTFileClose(hStdIn.u.hFile);
+        }
+#endif
+    }
+    else
+        rc = VERR_FILE_NOT_FOUND;
+    return rc;
+}
+
+
+/**
  * Creates a guest session.
  *
  * This will spawn a new VBoxService.exe instance under behalf of the given user
@@ -1801,18 +1982,15 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
     AssertPtrReturn(pSessionStartupInfo, VERR_INVALID_POINTER);
     /* ppSessionThread is optional. */
 
-#ifdef DEBUG
-    PVBOXSERVICECTRLSESSIONTHREAD pSessionCur;
+#ifdef VBOX_STRICT
     /* Check for existing session in debug mode. Should never happen because of
      * Main consistency. */
+    PVBOXSERVICECTRLSESSIONTHREAD pSessionCur;
     RTListForEach(pList, pSessionCur, VBOXSERVICECTRLSESSIONTHREAD, Node)
     {
-        if (pSessionCur->StartupInfo.uSessionID == pSessionStartupInfo->uSessionID)
-        {
-            AssertMsgFailed(("Guest session thread ID=%RU32 (%p) already exists when it should not\n",
-                             pSessionCur->StartupInfo.uSessionID, pSessionCur));
-            return VERR_ALREADY_EXISTS;
-        }
+        AssertMsgReturn(pSessionCur->StartupInfo.uSessionID != pSessionStartupInfo->uSessionID,
+                        ("Guest session thread ID=%RU32 (%p) already exists when it should not\n",
+                         pSessionCur->StartupInfo.uSessionID, pSessionCur), VERR_ALREADY_EXISTS);
     }
 #endif
     int rc = VINF_SUCCESS;
@@ -1822,382 +2000,81 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
     if (s_uCtrlSessionThread++ == UINT32_MAX)
         s_uCtrlSessionThread = 0; /* Wrap around to not let IPRT freak out. */
 
-    PVBOXSERVICECTRLSESSIONTHREAD pSessionThread =
-        (PVBOXSERVICECTRLSESSIONTHREAD)RTMemAllocZ(sizeof(VBOXSERVICECTRLSESSIONTHREAD));
+    /*
+     * Allocate and initialize the session thread structure.
+     */
+    PVBOXSERVICECTRLSESSIONTHREAD pSessionThread = (PVBOXSERVICECTRLSESSIONTHREAD)RTMemAllocZ(sizeof(*pSessionThread));
     if (pSessionThread)
     {
         /* Copy over session startup info. */
-        memcpy(&pSessionThread->StartupInfo, pSessionStartupInfo,
-               sizeof(VBOXSERVICECTRLSESSIONSTARTUPINFO));
+        memcpy(&pSessionThread->StartupInfo, pSessionStartupInfo, sizeof(VBOXSERVICECTRLSESSIONSTARTUPINFO));
 
         pSessionThread->fShutdown = false;
         pSessionThread->fStarted  = false;
         pSessionThread->fStopped  = false;
 
-        /* Is this an anonymous session? */
-        /* Anonymous sessions run with the same privileges as the main VBoxService executable. */
-        bool const fAnonymous = pSessionThread->StartupInfo.szUser[0] == '\0';
-        if (fAnonymous)
-        {
-            Assert(!strlen(pSessionThread->StartupInfo.szPassword));
-            Assert(!strlen(pSessionThread->StartupInfo.szDomain));
-
-            VBoxServiceVerbose(3, "New anonymous guest session ID=%RU32 created, uFlags=%x, using protocol %RU32\n",
-                               pSessionStartupInfo->uSessionID,
-                               pSessionStartupInfo->uFlags,
-                               pSessionStartupInfo->uProtocol);
-        }
-        else
-        {
-            VBoxServiceVerbose(3, "Forking new guest session ID=%RU32, szUser=%s, szPassword=%s, szDomain=%s, uFlags=%x, using protocol %RU32\n",
-                               pSessionStartupInfo->uSessionID,
-                               pSessionStartupInfo->szUser,
-#ifdef DEBUG
-                               pSessionStartupInfo->szPassword,
-#else
-                               "XXX", /* Never show passwords in release mode. */
-#endif
-                               pSessionStartupInfo->szDomain,
-                               pSessionStartupInfo->uFlags,
-                               pSessionStartupInfo->uProtocol);
-        }
-
         rc = RTCritSectInit(&pSessionThread->CritSect);
         AssertRC(rc);
-
-        /*
-         * Spawn a child process for doing the actual session handling.
-         */
-        char szExeName[RTPATH_MAX];
-        char *pszExeName = RTProcGetExecutablePath(szExeName, sizeof(szExeName));
-        if (pszExeName)
+        if (RT_SUCCESS(rc))
         {
-/** @todo r=bird: A while back we had this variant in the guest props code:
- *  @code
- *      int rc = RTStrPrintf(....);
- *      if (RT_SUCCESS(rc))
- *  @endcode
- *
- *  Here we've got a new variant:
- *  @code
- *      if (!RTStrPrintf(szBuf, sizeof(szBuf),...))
- *         return VERR_BUFFER_OVERFLOW;
- *  @endcode
- *  ... which is just as pointless.
- *
- *  According to the doxygen docs in iprt/string.h, RTStrPrintf returns "The
- *  length of the returned string (in pszBuffer) excluding the terminator".
- *
- *  Which admittedly makes it a real bitch to check for buffer overflows, but is
- *  a great help preventing memory corruption by careless use of the returned
- *  value if it was outside the buffer range (negative error codes or required
- *  buffer size).  We should probably add a new string formatter which API which
- *  returns VERR_BUFFER_OVERFLOW on overflow and optionally a required buffer
- *  size that you can use here...
- *
- *  However in most cases you don't need to because you make things way to
- *  complicated (see the log file name mangling for instance).
- *
- *  Here, you just need to format two or three (#ifdef DEBUG) 32-bit numbers
- *  which are no brainers, while the szUser can be used as is.  The trick is to
- *  pass the and option and the option value separately.
- */
-            char szParmUserName[GUESTPROCESS_MAX_USER_LEN + 32];
-            if (!fAnonymous)
-            {
-                if (!RTStrPrintf(szParmUserName, sizeof(szParmUserName), "--user=%s", pSessionThread->StartupInfo.szUser))
-                    rc = VERR_BUFFER_OVERFLOW;
-            }
-            char szParmSessionID[32];
-            if (RT_SUCCESS(rc) && !RTStrPrintf(szParmSessionID, sizeof(szParmSessionID), "--session-id=%RU32",
-                                               pSessionThread->StartupInfo.uSessionID))
-            {
-                rc = VERR_BUFFER_OVERFLOW;
-            }
-            char szParmSessionProto[32];
-            if (RT_SUCCESS(rc) && !RTStrPrintf(szParmSessionProto, sizeof(szParmSessionProto), "--session-proto=%RU32",
-                                               pSessionThread->StartupInfo.uProtocol))
-            {
-                rc = VERR_BUFFER_OVERFLOW;
-            }
-#ifdef DEBUG
-            char szParmThreadId[32];
-            if (RT_SUCCESS(rc) && !RTStrPrintf(szParmThreadId, sizeof(szParmThreadId), "--thread-id=%RU32",
-                                               s_uCtrlSessionThread))
-            {
-                rc = VERR_BUFFER_OVERFLOW;
-            }
-#endif
+            /*
+             * Start the session thread.
+             */
+            rc = vgsvcGstCntlSessionThreadCreateProcess(pSessionStartupInfo, pSessionThread, s_uCtrlSessionThread);
             if (RT_SUCCESS(rc))
             {
-                int iOptIdx = 0; /* Current index in argument vector. */
-
-                char const *papszArgs[16];
-                papszArgs[iOptIdx++] = pszExeName;
-                papszArgs[iOptIdx++] = "guestsession";
-                papszArgs[iOptIdx++] = szParmSessionID;
-                papszArgs[iOptIdx++] = szParmSessionProto;
-#ifdef DEBUG
-                papszArgs[iOptIdx++] = szParmThreadId;
-#endif
-                if (!fAnonymous)
-                    papszArgs[iOptIdx++] = szParmUserName;
-
-                /* Add same verbose flags as parent process. */
-                int rc2 = VINF_SUCCESS;
-                char szParmVerbose[32] = { 0 };
-                for (int i = 0; i < g_cVerbosity && RT_SUCCESS(rc2); i++)
-                {
-                    if (i == 0)
-                        rc2 = RTStrCat(szParmVerbose, sizeof(szParmVerbose), "-");
-                    if (RT_FAILURE(rc2))
-                        break;
-                    rc2 = RTStrCat(szParmVerbose, sizeof(szParmVerbose), "v");
-                }
-                if (RT_SUCCESS(rc2))
-                    papszArgs[iOptIdx++] = szParmVerbose;
-
-                /* Add log file handling. Each session will have an own
-                 * log file, naming based on the parent log file. */
-                char szParmLogFile[RTPATH_MAX];
-                if (   RT_SUCCESS(rc2)
-                    && strlen(g_szLogFile))
-                {
-                    char *pszLogFile = RTStrDup(g_szLogFile);
-                    if (pszLogFile)
-                    {
-                        char *pszLogSuff = NULL;
-                        if (RTPathHasSuffix(pszLogFile))
-                            pszLogSuff = RTStrDup(RTPathSuffix(pszLogFile));
-                        RTPathStripSuffix(pszLogFile);
-                        char *pszLogNewSuffix;
-#ifndef DEBUG
-                        if (RTStrAPrintf(&pszLogNewSuffix, "-%RU32-%s",
-                                         pSessionStartupInfo->uSessionID,
-                                         pSessionStartupInfo->szUser) < 0)
-                        {
-                            rc2 = VERR_NO_MEMORY;
-                        }
-#else /* DEBUG */
-                        /* Include the session thread ID in the log file name. */
-                        if (RTStrAPrintf(&pszLogNewSuffix, "-%RU32-%RU32-%s",
-                                         pSessionStartupInfo->uSessionID,
-                                         s_uCtrlSessionThread,
-                                         pSessionStartupInfo->szUser) < 0)
-                        {
-                            rc2 = VERR_NO_MEMORY;
-                        }
-#endif /* DEBUG */
-                        else
-                        {
-                            rc2 = RTStrAAppend(&pszLogFile, pszLogNewSuffix);
-                            if (RT_SUCCESS(rc2) && pszLogSuff)
-                                rc2 = RTStrAAppend(&pszLogFile, pszLogSuff);
-                            if (RT_SUCCESS(rc2))
-                            {
-                                if (!RTStrPrintf(szParmLogFile, sizeof(szParmLogFile),
-                                                 "--logfile=%s", pszLogFile))
-                                {
-                                    rc2 = VERR_BUFFER_OVERFLOW;
-                                }
-                            }
-                            RTStrFree(pszLogNewSuffix);
-                        }
-                        if (RT_FAILURE(rc2))
-                            VBoxServiceError("Error building session logfile string for session %RU32 (user %s), rc=%Rrc\n",
-                                             pSessionStartupInfo->uSessionID, pSessionStartupInfo->szUser, rc2);
-                        if (pszLogSuff)
-                            RTStrFree(pszLogSuff);
-                        RTStrFree(pszLogFile);
-                    }
-                    if (RT_SUCCESS(rc2))
-                        papszArgs[iOptIdx++] = szParmLogFile;
-
-                    rc = rc2;
-                }
-                else if (RT_FAILURE(rc2))
-                    rc = rc2;
-#ifdef DEBUG
-                VBoxServiceVerbose(4, "Argv building rc=%Rrc, session flags=%x\n",
-                                   rc, g_Session.uFlags);
-                char szParmDumpStdOut[32];
-                if (   RT_SUCCESS(rc)
-                    && g_Session.uFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT)
-                {
-/** @todo r=bird: This amazing code can be replaced by
- *  @code
- *    papszArgs[iOptIdx++] = "--dump-stdout";
- *  @endcode
- *  which doesn't even need braces.
- */
-                    if (!RTStrPrintf(szParmDumpStdOut, sizeof(szParmDumpStdOut), "--dump-stdout"))
-                        rc = VERR_BUFFER_OVERFLOW;
-                    if (RT_SUCCESS(rc))
-                        papszArgs[iOptIdx++] = szParmDumpStdOut;
-                }
-                char szParmDumpStdErr[32];
-                if (   RT_SUCCESS(rc)
-                    && g_Session.uFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDERR)
-                {
-                    if (!RTStrPrintf(szParmDumpStdErr, sizeof(szParmDumpStdErr), "--dump-stderr"))
-                        rc = VERR_BUFFER_OVERFLOW;
-                    if (RT_SUCCESS(rc))
-                        papszArgs[iOptIdx++] = szParmDumpStdErr;
-                }
-#endif
-                papszArgs[iOptIdx++] = NULL;
-
-                if (g_cVerbosity > 3)
-                {
-                    VBoxServiceVerbose(4, "Forking parameters:\n");
-
-                    iOptIdx = 0;
-                    while (papszArgs[iOptIdx])
-                        VBoxServiceVerbose(4, "\t%s\n", papszArgs[iOptIdx++]);
-                }
-
-                uint32_t uProcFlags = RTPROC_FLAGS_SERVICE
-                                    | RTPROC_FLAGS_HIDDEN; /** @todo More flags from startup info? */
-
                 /*
-                 * Create the session process' environment block.
+                 * Start the session thread.
                  */
-                RTENV hEnv = NIL_RTENV;
-                if (RT_SUCCESS(rc))
-                {
-                    /** @todo At the moment a session process does not have the ability to use the
-                     *        per-session environment variables itself, only the session's guest
-                     *        processes do so. Implement that later, also needs tweaking of
-                     *        VbglR3GuestCtrlSessionGetOpen(). */
-                    rc = RTEnvClone(&hEnv, RTENV_DEFAULT);
-                }
-
-#if 0 /* Pipe handling not needed (yet). */
-                /* Setup pipes. */
-                rc = GstcntlProcessSetupPipe("|", 0 /*STDIN_FILENO*/,
-                                             &pSession->StdIn.hChild, &pSession->StdIn.phChild, &pSession->hStdInW);
-                if (RT_SUCCESS(rc))
-                {
-                    rc = GstcntlProcessSetupPipe("|", 1 /*STDOUT_FILENO*/,
-                                                 &pSession->StdOut.hChild, &pSession->StdOut.phChild, &pSession->hStdOutR);
-                    if (RT_SUCCESS(rc))
-                    {
-                        rc = GstcntlProcessSetupPipe("|", 2 /*STDERR_FILENO*/,
-                                                     &pSession->StdErr.hChild, &pSession->StdErr.phChild, &pSession->hStdErrR);
-                        if (RT_SUCCESS(rc))
-                        {
-                            rc = RTPollSetCreate(&pSession->hPollSet);
-                            if (RT_SUCCESS(rc))
-                                rc = RTPollSetAddPipe(pSession->hPollSet, pSession->hStdInW, RTPOLL_EVT_ERROR,
-                                                      VBOXSERVICECTRLPIPEID_STDIN);
-                            if (RT_SUCCESS(rc))
-                                rc = RTPollSetAddPipe(pSession->hPollSet, pSession->hStdOutR, RTPOLL_EVT_READ | RTPOLL_EVT_ERROR,
-                                                      VBOXSERVICECTRLPIPEID_STDOUT);
-                            if (RT_SUCCESS(rc))
-                                rc = RTPollSetAddPipe(pSession->hPollSet, pSession->hStdErrR, RTPOLL_EVT_READ | RTPOLL_EVT_ERROR,
-                                                      VBOXSERVICECTRLPIPEID_STDERR);
-                        }
-
-                        if (RT_SUCCESS(rc))
-                            rc = RTProcCreateEx(pszExeName, papszArgs, hEnv, uProcFlags,
-                                                pSession->StdIn.phChild, pSession->StdOut.phChild, pSession->StdErr.phChild,
-                                                !fAnonymous ? pSession->StartupInfo.szUser : NULL,
-                                                !fAnonymous ? pSession->StartupInfo.szPassword : NULL,
-                                                &pSession->hProcess);
-
-                        if (RT_SUCCESS(rc))
-                        {
-                            /*
-                             * Close the child ends of any pipes and redirected files.
-                             */
-                            int rc2 = RTHandleClose(pSession->StdIn.phChild); AssertRC(rc2);
-                            pSession->StdIn.phChild     = NULL;
-                            rc2 = RTHandleClose(pSession->StdOut.phChild);    AssertRC(rc2);
-                            pSession->StdOut.phChild    = NULL;
-                            rc2 = RTHandleClose(pSession->StdErr.phChild);    AssertRC(rc2);
-                            pSession->StdErr.phChild    = NULL;
-                        }
-                    }
-                }
-#else
-                RTHANDLE hStdIn;
-                if (RT_SUCCESS(rc))
-                    rc = RTFileOpenBitBucket(&hStdIn.u.hFile, RTFILE_O_READ);
+                rc = RTThreadCreateF(&pSessionThread->Thread, gstcntlSessionThread,
+                                     pSessionThread /*pvUser*/, 0 /*cbStack*/,
+                                     RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "sess%u", s_uCtrlSessionThread);
                 if (RT_SUCCESS(rc))
                 {
-                    hStdIn.enmType = RTHANDLETYPE_FILE;
-
-                    RTHANDLE hStdOutAndErr;
-                    rc = RTFileOpenBitBucket(&hStdOutAndErr.u.hFile, RTFILE_O_WRITE);
-                    if (RT_SUCCESS(rc))
+                    /* Wait for the thread to initialize. */
+                    rc = RTThreadUserWait(pSessionThread->Thread, RT_MS_1MIN);
+                    if (   RT_SUCCESS(rc)
+                        && !ASMAtomicReadBool(&pSessionThread->fShutdown))
                     {
-                        hStdOutAndErr.enmType = RTHANDLETYPE_FILE;
+                        VBoxServiceVerbose(2, "Thread for session ID=%RU32 started\n", pSessionThread->StartupInfo.uSessionID);
 
-                        rc = RTProcCreateEx(pszExeName, papszArgs, hEnv, uProcFlags,
-                                            &hStdIn, &hStdOutAndErr, &hStdOutAndErr,
-                                            !fAnonymous ? pSessionThread->StartupInfo.szUser : NULL,
-                                            !fAnonymous ? pSessionThread->StartupInfo.szPassword : NULL,
-                                            &pSessionThread->hProcess);
+                        ASMAtomicXchgBool(&pSessionThread->fStarted, true);
 
-                        RTFileClose(hStdOutAndErr.u.hFile);
+                        /* Add session to list. */
+                        /* rc = */ RTListAppend(pList, &pSessionThread->Node);
+                        if (ppSessionThread) /* Return session if wanted. */
+                            *ppSessionThread = pSessionThread;
+                        return VINF_SUCCESS;
                     }
 
-                    RTFileClose(hStdIn.u.hFile);
-                }
-#endif
-                if (hEnv != NIL_RTENV)
-                    RTEnvDestroy(hEnv);
-            }
-        }
-        else
-            rc = VERR_FILE_NOT_FOUND;
-
-        if (RT_SUCCESS(rc))
-        {
-            /* Start session thread. */
-            rc = RTThreadCreateF(&pSessionThread->Thread, gstcntlSessionThread,
-                                 pSessionThread /*pvUser*/, 0 /*cbStack*/,
-                                 RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "sess%u", s_uCtrlSessionThread);
-            if (RT_FAILURE(rc))
-            {
-                VBoxServiceError("Creating session thread failed, rc=%Rrc\n", rc);
-            }
-            else
-            {
-                /* Wait for the thread to initialize. */
-                rc = RTThreadUserWait(pSessionThread->Thread, 60 * 1000 /* 60s timeout */);
-                if (   ASMAtomicReadBool(&pSessionThread->fShutdown)
-                    || RT_FAILURE(rc))
-                {
+                    /*
+                     * Bail out.
+                     */
                     VBoxServiceError("Thread for session ID=%RU32 failed to start, rc=%Rrc\n",
                                      pSessionThread->StartupInfo.uSessionID, rc);
-                    if (RT_SUCCESS(rc))
+                    if (RT_SUCCESS_NP(rc))
                         rc = VERR_CANT_CREATE; /** @todo Find a better rc. */
                 }
                 else
-                {
-                    VBoxServiceVerbose(2, "Thread for session ID=%RU32 started\n",
-                                       pSessionThread->StartupInfo.uSessionID);
+                    VBoxServiceError("Creating session thread failed, rc=%Rrc\n", rc);
 
-                    ASMAtomicXchgBool(&pSessionThread->fStarted, true);
-
-                    /* Add session to list. */
-                    /* rc = */ RTListAppend(pList, &pSessionThread->Node);
-                    if (ppSessionThread) /* Return session if wanted. */
-                        *ppSessionThread = pSessionThread;
+                RTProcTerminate(pSessionThread->hProcess);
+                uint32_t cMsWait = 1;
+                while (   RTProcWait(pSessionThread->hProcess, RTPROCWAIT_FLAGS_NOBLOCK, NULL) == VERR_PROCESS_RUNNING
+                       && cMsWait <= 9) /* 1023 ms */
+                {
+                    RTThreadSleep(cMsWait);
+                    cMsWait <<= 1;
                 }
             }
+            RTCritSectDelete(&pSessionThread->CritSect);
         }
-
-        if (RT_FAILURE(rc))
-        {
-            RTMemFree(pSessionThread);
-        }
+        RTMemFree(pSessionThread);
     }
     else
         rc = VERR_NO_MEMORY;
 
-    VBoxServiceVerbose(3, "Forking session thread returned returned rc=%Rrc\n", rc);
+    VBoxServiceVerbose(3, "Spawning session thread returned returned rc=%Rrc\n", rc);
     return rc;
 }
 
@@ -2226,7 +2103,7 @@ int GstCntlSessionThreadWait(PVBOXSERVICECTRLSESSIONTHREAD pThread,
     int rc = VINF_SUCCESS;
 
     /*
-     * The fork should have received the same closing request,
+     * The spawned session process should have received the same closing request,
      * so just wait for the process to close.
      */
     if (ASMAtomicReadBool(&pThread->fStarted))
@@ -2295,36 +2172,25 @@ int GstCntlSessionThreadDestroyAll(PRTLISTANCHOR pList, uint32_t uFlags)
         if (RT_FAILURE(rc))
             VBoxServiceError("Cancelling pending waits failed; rc=%Rrc\n", rc);*/
 
-/** @todo r=bird: Why don't you use RTListForEachSafe here?? */
-    PVBOXSERVICECTRLSESSIONTHREAD pSessionThread = RTListGetFirst(pList, VBOXSERVICECTRLSESSIONTHREAD, Node);
-    while (pSessionThread)
+    PVBOXSERVICECTRLSESSIONTHREAD pSessIt;
+    PVBOXSERVICECTRLSESSIONTHREAD pSessItNext;
+    RTListForEachSafe(pList, pSessIt, pSessItNext, VBOXSERVICECTRLSESSIONTHREAD, Node)
     {
-        PVBOXSERVICECTRLSESSIONTHREAD pSessionThreadNext =
-            RTListGetNext(pList, pSessionThread, VBOXSERVICECTRLSESSIONTHREAD, Node);
-        bool fLast = RTListNodeIsLast(pList, &pSessionThread->Node); /** @todo r=bird: This isn't necessary, pSessionThreadNext will be NULL! */
-
-        int rc2 = GstCntlSessionThreadDestroy(pSessionThread, uFlags);
+        int rc2 = GstCntlSessionThreadDestroy(pSessIt, uFlags);
         if (RT_FAILURE(rc2))
         {
-            VBoxServiceError("Closing session thread failed with rc=%Rrc\n", rc2);
+            VBoxServiceError("Closing session thread '%s' failed with rc=%Rrc\n", RTThreadGetName(pSessIt->Thread), rc2);
             if (RT_SUCCESS(rc))
                 rc = rc2;
             /* Keep going. */
         }
-
-        if (fLast)
-            break;
-
-        pSessionThread = pSessionThreadNext;
     }
 
+    VBoxServiceVerbose(4, "Destroying guest session threads ended with %Rrc\n", rc);
     return rc;
 }
 
-/** @todo r=bird: This isn't a fork in the tranditional unix sense, so please
- * don't confuse any unix guys by using the term.
- * GstCntlSessionChildMain would be a good name.  */
-RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
+RTEXITCODE VBoxServiceControlSessionSpawnInit(int argc, char **argv)
 {
     static const RTGETOPTDEF s_aOptions[] =
     {
@@ -2349,7 +2215,7 @@ RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
                  s_aOptions, RT_ELEMENTS(s_aOptions),
                  1 /*iFirst*/, RTGETOPTINIT_FLAGS_OPTS_FIRST);
 
-    uint32_t uSessionFlags = VBOXSERVICECTRLSESSION_FLAG_FORK;
+    uint32_t uSessionFlags = VBOXSERVICECTRLSESSION_FLAG_SPAWN;
 
     /* Protocol and session ID must be specified explicitly. */
     g_Session.StartupInfo.uProtocol  = UINT32_MAX;
@@ -2426,7 +2292,7 @@ RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
         return RTMsgErrorExit(RTEXITCODE_INIT, "Failed to create log file \"%s\", rc=%Rrc\n",
                               g_szLogFile[0] ? g_szLogFile : "<None>", rc);
 
-    RTEXITCODE rcExit = gstcntlSessionForkWorker(&g_Session);
+    RTEXITCODE rcExit = gstcntlSessionSpawnWorker(&g_Session);
 
     VBoxServiceLogDestroy();
     return rcExit;
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h b/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h
index 31b67db..6851e0c 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h
@@ -71,14 +71,14 @@ typedef struct
     /** Called from the worker thread.
      *
      * @returns VBox status code.
-     * @retval  VINF_SUCCESS if exitting because *pfTerminate was set.
-     * @param   pfTerminate     Pointer to a per service termination flag to check
+     * @retval  VINF_SUCCESS if exitting because *pfShutdown was set.
+     * @param   pfShutdown      Pointer to a per service termination flag to check
      *                          before and after blocking.
      */
-    DECLCALLBACKMEMBER(int, pfnWorker)(bool volatile *pfTerminate);
+    DECLCALLBACKMEMBER(int, pfnWorker)(bool volatile *pfShutdown);
 
     /**
-     * Stop an service.
+     * Stops a service.
      */
     DECLCALLBACKMEMBER(void, pfnStop)(void);
 
@@ -158,7 +158,7 @@ typedef VBOXSERVICEVEPROPCACHEENTRY *PVBOXSERVICEVEPROPCACHEENTRY;
 RT_C_DECLS_BEGIN
 
 extern char        *g_pszProgName;
-extern int          g_cVerbosity;
+extern unsigned     g_cVerbosity;
 extern char         g_szLogFile[RTPATH_MAX + 128];
 extern uint32_t     g_DefaultInterval;
 extern VBOXSERVICE  g_TimeSync;
@@ -182,7 +182,7 @@ extern RTCRITSECT   g_csLog; /* For guest process stdout dumping. */
 
 extern RTEXITCODE               VBoxServiceSyntax(const char *pszFormat, ...);
 extern RTEXITCODE               VBoxServiceError(const char *pszFormat, ...);
-extern void                     VBoxServiceVerbose(int iLevel, const char *pszFormat, ...);
+extern void                     VBoxServiceVerbose(unsigned iLevel, const char *pszFormat, ...);
 extern int                      VBoxServiceArgUInt32(int argc, char **argv, const char *psz, int *pi, uint32_t *pu32,
                                                      uint32_t u32Min, uint32_t u32Max);
 extern int                      VBoxServiceStartServices(void);
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
index c3e52f6..1ff1160 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
@@ -961,45 +961,64 @@ static int vboxserviceVMInfoWriteNetwork(void)
         return RTErrConvertFromWin32(wsaErr);
     }
 
-    INTERFACE_INFO InterfaceList[20] = {0};
-    unsigned long nBytesReturned = 0;
-    if (WSAIoctl(sd,
-                 SIO_GET_INTERFACE_LIST,
-                 0,
-                 0,
-                 &InterfaceList,
-                 sizeof(InterfaceList),
-                 &nBytesReturned,
-                 0,
-                 0) ==  SOCKET_ERROR)
+    INTERFACE_INFO aInterfaces[20] = {0};
+    DWORD cbReturned = 0;
+# ifdef TARGET_NT4
+    /* Workaround for uninitialized variable used in memcpy in GetTcpipInterfaceList
+       (NT4SP1 at least).  It seems to be happy enough with garbages, no failure
+       returns so far, so we just need to prevent it from crashing by filling the
+       stack with valid pointer values prior to the API call. */
+    _asm
+    {
+        mov     edx, edi
+        lea     eax, aInterfaces
+        mov     [esp - 0x1000], eax
+        mov     [esp - 0x2000], eax
+        mov     ecx, 0x2000/4 - 1
+        cld
+        lea     edi, [esp - 0x2000]
+        rep stosd
+        mov     edi, edx
+    }
+# endif
+    if (   WSAIoctl(sd,
+                    SIO_GET_INTERFACE_LIST,
+                    NULL,                /* pvInBuffer */
+                    0,                   /* cbInBuffer */
+                    &aInterfaces[0],     /* pvOutBuffer */
+                    sizeof(aInterfaces), /* cbOutBuffer */
+                    &cbReturned,
+                    NULL,                /* pOverlapped */
+                    NULL)                /* pCompletionRoutine */
+        == SOCKET_ERROR)
     {
         VBoxServiceError("VMInfo/Network: Failed to WSAIoctl() on socket: Error: %d\n", WSAGetLastError());
         if (pAdpInfo)
             RTMemFree(pAdpInfo);
         return RTErrConvertFromWin32(WSAGetLastError());
     }
-    int cIfacesSystem = nBytesReturned / sizeof(INTERFACE_INFO);
+    int cIfacesSystem = cbReturned / sizeof(INTERFACE_INFO);
 
     /** @todo Use GetAdaptersInfo() and GetAdapterAddresses (IPv4 + IPv6) for more information. */
     for (int i = 0; i < cIfacesSystem; ++i)
     {
         sockaddr_in *pAddress;
         u_long nFlags = 0;
-        if (InterfaceList[i].iiFlags & IFF_LOOPBACK) /* Skip loopback device. */
+        if (aInterfaces[i].iiFlags & IFF_LOOPBACK) /* Skip loopback device. */
             continue;
-        nFlags = InterfaceList[i].iiFlags;
-        pAddress = (sockaddr_in *)&(InterfaceList[i].iiAddress);
+        nFlags = aInterfaces[i].iiFlags;
+        pAddress = (sockaddr_in *)&(aInterfaces[i].iiAddress);
         Assert(pAddress);
         char szIp[32];
         RTStrPrintf(szIp, sizeof(szIp), "%s", inet_ntoa(pAddress->sin_addr));
         RTStrPrintf(szPropPath, sizeof(szPropPath), "/VirtualBox/GuestInfo/Net/%RU32/V4/IP", cIfsReported);
         VBoxServicePropCacheUpdate(&g_VMInfoPropCache, szPropPath, "%s", szIp);
 
-        pAddress = (sockaddr_in *) & (InterfaceList[i].iiBroadcastAddress);
+        pAddress = (sockaddr_in *) & (aInterfaces[i].iiBroadcastAddress);
         RTStrPrintf(szPropPath, sizeof(szPropPath), "/VirtualBox/GuestInfo/Net/%RU32/V4/Broadcast", cIfsReported);
         VBoxServicePropCacheUpdate(&g_VMInfoPropCache, szPropPath, "%s", inet_ntoa(pAddress->sin_addr));
 
-        pAddress = (sockaddr_in *)&(InterfaceList[i].iiNetmask);
+        pAddress = (sockaddr_in *)&(aInterfaces[i].iiNetmask);
         RTStrPrintf(szPropPath, sizeof(szPropPath), "/VirtualBox/GuestInfo/Net/%RU32/V4/Netmask", cIfsReported);
         VBoxServicePropCacheUpdate(&g_VMInfoPropCache, szPropPath, "%s", inet_ntoa(pAddress->sin_addr));
 
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py b/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/stub_common.py b/src/VBox/Additions/common/crOpenGL/stub_common.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/linux/installer/vboxadd-service.sh b/src/VBox/Additions/linux/installer/vboxadd-service.sh
index 4087908..fd4675b 100755
--- a/src/VBox/Additions/linux/installer/vboxadd-service.sh
+++ b/src/VBox/Additions/linux/installer/vboxadd-service.sh
@@ -36,7 +36,7 @@ elif [ -f /etc/SuSE-release ]; then
     PIDFILE="/var/run/vboxadd-service"
 elif [ -f /etc/debian_version ]; then
     system=debian
-    PIDFILE="/var/run/vboxadd-service"
+    PIDFILE="/var/run/vboxadd-service.pid"
 elif [ -f /etc/gentoo-release ]; then
     system=gentoo
     PIDFILE="/var/run/vboxadd-service"
@@ -93,7 +93,7 @@ fi
 
 if [ "$system" = "debian" ]; then
     daemon() {
-        start-stop-daemon --start --exec $1 -- $2
+        start-stop-daemon --start --exec $1 -- $2 $3
     }
 
     killproc() {
@@ -120,7 +120,7 @@ if [ "$system" = "gentoo" ]; then
         . /etc/init.d/functions.sh
     fi
     daemon() {
-        start-stop-daemon --start --exec $1 -- $2
+        start-stop-daemon --start --exec $1 -- $2 $3
     }
 
     killproc() {
@@ -146,7 +146,7 @@ fi
 
 if [ "$system" = "slackware" -o "$system" = "other" ]; then
     daemon() {
-        $1 $2
+        $1 $2 $3
     }
 
     killproc() {
@@ -171,7 +171,7 @@ fi
 if [ "$system" = "lfs" ]; then
     . /etc/rc.d/init.d/functions
     daemon() {
-        loadproc $1 $2
+        loadproc $1 $2 $3
     }
 
     fail_msg() {
@@ -212,9 +212,8 @@ start() {
             exit 1
         }
         testbinary
-        daemon $binary > /dev/null
+        daemon $binary --pidfile $PIDFILE > /dev/null
         RETVAL=$?
-        test $RETVAL -eq 0 && echo `pidof VBoxService` > $PIDFILE
         succ_msg
     fi
     return $RETVAL
diff --git a/src/VBox/Additions/linux/lightdm-greeter/vbox-greeter.cpp b/src/VBox/Additions/linux/lightdm-greeter/vbox-greeter.cpp
index 4503d1a..e2893be 100644
--- a/src/VBox/Additions/linux/lightdm-greeter/vbox-greeter.cpp
+++ b/src/VBox/Additions/linux/lightdm-greeter/vbox-greeter.cpp
@@ -842,7 +842,7 @@ static gboolean cb_check_creds(gpointer pvData)
  * @param   enmPhase
  * @param   pfnLog
  */
-static void vboxGreeterLogHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog)
+static DECLCALLBACK(void) vboxGreeterLogHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog)
 {
     /* Some introductory information. */
     static RTTIMESPEC s_TimeSpec;
diff --git a/src/VBox/Devices/Audio/DrvHostDSound.cpp b/src/VBox/Devices/Audio/DrvHostDSound.cpp
index 28286b7..b8d0ff4 100644
--- a/src/VBox/Devices/Audio/DrvHostDSound.cpp
+++ b/src/VBox/Devices/Audio/DrvHostDSound.cpp
@@ -27,6 +27,12 @@
 #include "DrvAudio.h"
 #include "VBoxDD.h"
 
+/* Dynamically load dsound.dll. */
+typedef HRESULT WINAPI FNDIRECTSOUNDENUMERATEW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext);
+typedef FNDIRECTSOUNDENUMERATEW *PFNDIRECTSOUNDENUMERATEW;
+typedef HRESULT WINAPI FNDIRECTSOUNDCAPTUREENUMERATEW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext);
+typedef FNDIRECTSOUNDCAPTUREENUMERATEW *PFNDIRECTSOUNDCAPTUREENUMERATEW;
+
 typedef struct DSOUNDHOSTCFG
 {
     DWORD   cbBufferIn;
@@ -58,7 +64,7 @@ typedef struct DSOUNDSTREAMOUT
     LPDIRECTSOUNDBUFFER8 pDSB;
     DWORD                cbPlayWritePos;
     DWORD                csPlaybackBufferSize;
-    bool                 fReinitPlayPos;
+    bool                 fRestartPlayback;
     PDMAUDIOSTREAMCFG    streamCfg;
 } DSOUNDSTREAMOUT, *PDSOUNDSTREAMOUT;
 
@@ -322,7 +328,7 @@ static int dsoundPlayInterfaceCreate(PDRVHOSTDSOUND pThis, PDSOUNDSTREAMOUT pDSo
                                   IID_IDirectSound8, (void **)&pDSoundStrmOut->pDS);
     if (FAILED(hr))
     {
-        LogRel(("DSound: Error creating DirectSound instance: %Rhrc\n", hr));
+        LogRelMax(s_cMaxRelLogEntries, ("DSound: Error creating DirectSound instance: %Rhrc\n", hr));
     }
     else
     {
@@ -553,6 +559,7 @@ static void dsoundPlayStop(PDRVHOSTDSOUND pThis, PDSOUNDSTREAMOUT pDSoundStrmOut
 
         LogFlowFunc(("Playback stopped\n"));
 
+        /* @todo Wait until all data in the buffer has been played. */
         HRESULT hr = IDirectSoundBuffer8_Stop(pDSoundStrmOut->pDSB);
         if (SUCCEEDED(hr))
         {
@@ -583,16 +590,13 @@ static int dsoundPlayStart(PDSOUNDSTREAMOUT pDSoundStrmOut)
             {
                 dsoundPlayClearSamples(pDSoundStrmOut);
 
-                pDSoundStrmOut->fReinitPlayPos = true;
+                pDSoundStrmOut->fRestartPlayback = true;
 
                 LogFlowFunc(("Playback started\n"));
 
-                HRESULT hr = IDirectSoundBuffer8_Play(pDSoundStrmOut->pDSB, 0, 0, DSBPLAY_LOOPING);
-                if (FAILED(hr))
-                {
-                    LogRelMax(s_cMaxRelLogEntries, ("DSound: Error starting playback: %Rhrc\n", hr));
-                    rc = VERR_NOT_SUPPORTED;
-                }
+                /* The actual IDirectSoundBuffer8_Play call will be made in drvHostDSoundPlayOut,
+                 * because it is necessary to put some samples into the buffer first.
+                 */
             }
         }
     }
@@ -1031,7 +1035,7 @@ static DECLCALLBACK(int) drvHostDSoundInitOut(PPDMIHOSTAUDIO pInterface,
         pDSoundStrmOut->pDS = NULL;
         pDSoundStrmOut->pDSB = NULL;
         pDSoundStrmOut->cbPlayWritePos = 0;
-        pDSoundStrmOut->fReinitPlayPos = true;
+        pDSoundStrmOut->fRestartPlayback = true;
         pDSoundStrmOut->csPlaybackBufferSize = 0;
 
         if (pcSamples)
@@ -1119,15 +1123,16 @@ static DECLCALLBACK(int) drvHostDSoundPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUD
         int cShift = pHstStrmOut->Props.cShift;
         DWORD cbBuffer = pDSoundStrmOut->csPlaybackBufferSize << cShift;
 
-        DWORD cbPlayPos, cbWritePos;
-        HRESULT hr = IDirectSoundBuffer8_GetCurrentPosition(pDSB, &cbPlayPos, &cbWritePos);
+        /* Get the current play position which is used for calculating the free space in the buffer. */
+        DWORD cbPlayPos;
+        HRESULT hr = IDirectSoundBuffer8_GetCurrentPosition(pDSB, &cbPlayPos, NULL);
         if (hr == DSERR_BUFFERLOST)
         {
             rc = dsoundPlayRestore(pDSB);
             if (RT_FAILURE(rc))
                 break;
 
-            hr = IDirectSoundBuffer8_GetCurrentPosition(pDSB, &cbPlayPos, &cbWritePos);
+            hr = IDirectSoundBuffer8_GetCurrentPosition(pDSB, &cbPlayPos, NULL);
             if (hr == DSERR_BUFFERLOST) /* Avoid log flooding if the error is still there. */
                 break;
         }
@@ -1138,26 +1143,14 @@ static DECLCALLBACK(int) drvHostDSoundPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUD
             break;
         }
 
-        DWORD cbFree;
-        DWORD cbPlayWritePos;
-        if (pDSoundStrmOut->fReinitPlayPos)
-        {
-            pDSoundStrmOut->fReinitPlayPos = false;
-
-            pDSoundStrmOut->cbPlayWritePos = cbWritePos;
+        DWORD cbFree = cbBuffer - dsoundRingDistance(pDSoundStrmOut->cbPlayWritePos, cbPlayPos, cbBuffer);
 
-            cbPlayWritePos = pDSoundStrmOut->cbPlayWritePos;
-            cbFree = cbBuffer - dsoundRingDistance(cbWritePos, cbPlayPos, cbBuffer);
-        }
-        else
-        {
-            /* Full buffer? */
-            if (pDSoundStrmOut->cbPlayWritePos == cbPlayPos)
-                break;
-
-            cbPlayWritePos = pDSoundStrmOut->cbPlayWritePos;
-            cbFree         = dsoundRingDistance(cbPlayPos, cbPlayWritePos, cbBuffer);
-        }
+        /* Check for full buffer, do not allow the cbPlayWritePos to catch cbPlayPos during playback,
+         * i.e. always leave a free space for 1 audio sample.
+         */
+        if (cbFree <= (1U << cShift))
+            break;
+        cbFree -= (1U << cShift);
 
         uint32_t csLive = drvAudioHstOutSamplesLive(pHstStrmOut);
         uint32_t cbLive = csLive << cShift;
@@ -1169,13 +1162,13 @@ static DECLCALLBACK(int) drvHostDSoundPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUD
         if (cbLive == 0 || cbLive > cbBuffer)
         {
             LogFlowFunc(("cbLive=%RU32, cbBuffer=%ld, cbPlayWritePos=%ld, cbPlayPos=%ld\n",
-                         cbLive, cbBuffer, cbPlayWritePos, cbPlayPos));
+                         cbLive, cbBuffer, pDSoundStrmOut->cbPlayWritePos, cbPlayPos));
             break;
         }
 
         LPVOID pv1, pv2;
         DWORD cb1, cb2;
-        rc = dsoundLockOutput(pDSB, &pHstStrmOut->Props, cbPlayWritePos, cbLive,
+        rc = dsoundLockOutput(pDSB, &pHstStrmOut->Props, pDSoundStrmOut->cbPlayWritePos, cbLive,
                               &pv1, &pv2, &cb1, &cb2, 0 /* dwFlags */);
         if (RT_FAILURE(rc))
             break;
@@ -1203,12 +1196,12 @@ static DECLCALLBACK(int) drvHostDSoundPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUD
 
         dsoundUnlockOutput(pDSB, pv1, pv2, cb1, cb2);
 
-        pDSoundStrmOut->cbPlayWritePos = (cbPlayWritePos + (cReadTotal << cShift)) % cbBuffer;
+        pDSoundStrmOut->cbPlayWritePos = (pDSoundStrmOut->cbPlayWritePos + (cReadTotal << cShift)) % cbBuffer;
 
-        LogFlowFunc(("%RU32 (%RU32 samples) out of %RU32%s, buffer write pos %ld -> %ld, rc=%Rrc\n",
+        LogFlowFunc(("%RU32 (%RU32 samples) out of %RU32%s, buffer write pos %ld, rc=%Rrc\n",
                      AUDIOMIXBUF_S2B(&pHstStrmOut->MixBuf, cReadTotal), cReadTotal, cbLive,
                      cbLive != AUDIOMIXBUF_S2B(&pHstStrmOut->MixBuf, cReadTotal) ? " !!!": "",
-                     cbPlayWritePos, pDSoundStrmOut->cbPlayWritePos, rc));
+                     pDSoundStrmOut->cbPlayWritePos, rc));
 
         if (cReadTotal)
         {
@@ -1216,6 +1209,20 @@ static DECLCALLBACK(int) drvHostDSoundPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUD
             rc = VINF_SUCCESS; /* Played something. */
         }
 
+        if (pDSoundStrmOut->fRestartPlayback)
+        {
+            /* The playback has been just started.
+             * Some samples of the new sound have been copied to the buffer
+             * and it can start playing.
+             */
+            pDSoundStrmOut->fRestartPlayback = false;
+            HRESULT hr = IDirectSoundBuffer8_Play(pDSoundStrmOut->pDSB, 0, 0, DSBPLAY_LOOPING);
+            if (FAILED(hr))
+            {
+                LogRelMax(s_cMaxRelLogEntries, ("DSound: Error starting playback: %Rhrc\n", hr));
+                rc = VERR_NOT_SUPPORTED;
+            }
+        }
     } while (0);
 
     if (pcSamplesPlayed)
@@ -1232,7 +1239,7 @@ static DECLCALLBACK(int) drvHostDSoundFiniOut(PPDMIHOSTAUDIO pInterface, PPDMAUD
     dsoundPlayClose(pDSoundStrmOut);
 
     pDSoundStrmOut->cbPlayWritePos = 0;
-    pDSoundStrmOut->fReinitPlayPos = true;
+    pDSoundStrmOut->fRestartPlayback = true;
     pDSoundStrmOut->csPlaybackBufferSize = 0;
     RT_ZERO(pDSoundStrmOut->streamCfg);
 
@@ -1486,21 +1493,51 @@ static DECLCALLBACK(int) drvHostDSoundGetConf(PPDMIHOSTAUDIO pInterface, PPDMAUD
     pCfg->cMaxHstStrmsOut = 0;
     pCfg->cMaxHstStrmsIn  = 0;
 
-    DSOUNDENUMCBCTX ctx = { pThis, pCfg };
+    RTLDRMOD hDSound = NULL;
+    int rc = RTLdrLoadSystem("dsound.dll", true /*fNoUnload*/, &hDSound);
+    if (RT_SUCCESS(rc))
+    {
+        PFNDIRECTSOUNDENUMERATEW pfnDirectSoundEnumerateW = NULL;
+        PFNDIRECTSOUNDCAPTUREENUMERATEW pfnDirectSoundCaptureEnumerateW = NULL;
 
-    HRESULT hr = DirectSoundEnumerateW(&dsoundEnumCallback, &ctx);
-    if (FAILED(hr))
-        LogRel(("DSound: Error enumerating host playback devices: %Rhrc\n", hr));
+        rc = RTLdrGetSymbol(hDSound, "DirectSoundEnumerateW", (void**)&pfnDirectSoundEnumerateW);
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTLdrGetSymbol(hDSound, "DirectSoundCaptureEnumerateW", (void**)&pfnDirectSoundCaptureEnumerateW);
+        }
+
+        if (RT_SUCCESS(rc))
+        {
+            DSOUNDENUMCBCTX ctx = { pThis, pCfg };
 
-    LogRel(("DSound: Found %RU32 host playback devices\n", pCfg->cMaxHstStrmsOut));
+            HRESULT hr = pfnDirectSoundEnumerateW(&dsoundEnumCallback, &ctx);
+            if (FAILED(hr))
+                LogRel(("DSound: Error enumerating host playback devices: %Rhrc\n", hr));
+
+            LogRel(("DSound: Found %RU32 host playback devices\n", pCfg->cMaxHstStrmsOut));
+
+            hr = pfnDirectSoundCaptureEnumerateW(&dsoundCaptureEnumCallback, &ctx);
+            if (FAILED(hr))
+                LogRel(("DSound: Error enumerating host capturing devices: %Rhrc\n", hr));
+
+            LogRel(("DSound: Found %RU32 host capturing devices\n", pCfg->cMaxHstStrmsIn));
+        }
+
+        RTLdrClose(hDSound);
+    }
+    else
+    {
+        /* No dsound.dll on this system.  */
+        LogRel(("DSound: could not load dsound.dll %Rrc\n", rc));
+    }
+
+    /* Always return success and at least default values to make the caller happy. */
     if (pCfg->cMaxHstStrmsOut == 0)
+    {
+        LogRel(("DSound: Adjusting the number of host playback devices to 1\n"));
         pCfg->cMaxHstStrmsOut = 1; /* Support at least one stream. */
+    }
 
-    hr = DirectSoundCaptureEnumerateW(&dsoundCaptureEnumCallback, &ctx);
-    if (FAILED(hr))
-        LogRel(("DSound: Error enumerating host capturing devices: %Rhrc\n", hr));
-
-    LogRel(("DSound: Found %RU32 host capturing devices\n", pCfg->cMaxHstStrmsIn));
     if (pCfg->cMaxHstStrmsIn < 2)
     {
         LogRel(("DSound: Adjusting the number of host capturing devices from %RU32 to 2\n", pCfg->cMaxHstStrmsIn));
diff --git a/src/VBox/Devices/Audio/DrvHostNullAudio.cpp b/src/VBox/Devices/Audio/DrvHostNullAudio.cpp
index 9564b49..f5c4a80 100644
--- a/src/VBox/Devices/Audio/DrvHostNullAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvHostNullAudio.cpp
@@ -56,6 +56,8 @@ typedef struct NULLAUDIOSTREAMOUT
     /** Note: Always must come first! */
     PDMAUDIOHSTSTRMOUT hw;
     uint64_t u64TicksLast;
+    uint64_t csPlayBuffer;
+    uint8_t *pu8PlayBuffer;
 } NULLAUDIOSTREAMOUT;
 
 typedef struct NULLAUDIOSTREAMIN
@@ -131,8 +133,17 @@ static DECLCALLBACK(int) drvHostNullAudioInitOut(PPDMIHOSTAUDIO pInterface,
     {
         NULLAUDIOSTREAMOUT *pNullStrmOut = (NULLAUDIOSTREAMOUT *)pHstStrmOut;
         pNullStrmOut->u64TicksLast = 0;
-        if (pcSamples)
-            *pcSamples = _1K;
+        pNullStrmOut->csPlayBuffer = _1K;
+        pNullStrmOut->pu8PlayBuffer = (uint8_t *)RTMemAlloc(_1K << pHstStrmOut->Props.cShift);
+        if (pNullStrmOut->pu8PlayBuffer)
+        {
+            if (pcSamples)
+                *pcSamples = pNullStrmOut->csPlayBuffer;
+        }
+        else
+        {
+            rc = VERR_NO_MEMORY;
+        }
     }
 
     return rc;
@@ -169,10 +180,14 @@ static DECLCALLBACK(int) drvHostNullAudioPlayOut(PPDMIHOSTAUDIO pInterface, PPDM
     if (cSamplesPlayed > csLive)
         cSamplesPlayed = csLive;
 
-    AudioMixBufFinish(&pHstStrmOut->MixBuf, cSamplesPlayed);
+    cSamplesPlayed = RT_MIN(cSamplesPlayed, pNullStrmOut->csPlayBuffer);
+
+    uint32_t csRead = 0;
+    AudioMixBufReadCirc(&pHstStrmOut->MixBuf, pNullStrmOut->pu8PlayBuffer, cSamplesPlayed << pHstStrmOut->Props.cShift, &csRead);
+    AudioMixBufFinish(&pHstStrmOut->MixBuf, csRead);
 
     if (pcSamplesPlayed)
-        *pcSamplesPlayed = cSamplesPlayed;
+        *pcSamplesPlayed = csRead;
 
     return VINF_SUCCESS;
 }
@@ -214,6 +229,8 @@ static DECLCALLBACK(int) drvHostNullAudioFiniIn(PPDMIHOSTAUDIO pInterface, PPDMA
 
 static DECLCALLBACK(int) drvHostNullAudioFiniOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut)
 {
+    NULLAUDIOSTREAMOUT *pNullStrmOut = (NULLAUDIOSTREAMOUT *)pHstStrmOut;
+    RTMemFree(pNullStrmOut->pu8PlayBuffer);
     return VINF_SUCCESS;
 }
 
diff --git a/src/VBox/Devices/EFI/DevEFI.cpp b/src/VBox/Devices/EFI/DevEFI.cpp
index 3c0a1e5..a332de4 100644
--- a/src/VBox/Devices/EFI/DevEFI.cpp
+++ b/src/VBox/Devices/EFI/DevEFI.cpp
@@ -1808,6 +1808,19 @@ static DECLCALLBACK(void) efiReset(PPDMDEVINS pDevIns)
 
 
 /**
+ * @interface_method_impl{PDMDEVREG,pfnPowerOff}
+ */
+static DECLCALLBACK(void) efiPowerOff(PPDMDEVINS pDevIns)
+{
+    PDEVEFI  pThis = PDMINS_2_DATA(pDevIns, PDEVEFI);
+
+    if (pThis->Lun0.pNvramDrv)
+        nvramStore(pThis);
+}
+
+
+
+/**
  * Destruct a device instance.
  *
  * Most VM resources are freed by the VM. This callback is provided so that any non-VM
@@ -1820,8 +1833,6 @@ static DECLCALLBACK(int) efiDestruct(PPDMDEVINS pDevIns)
     PDEVEFI  pThis = PDMINS_2_DATA(pDevIns, PDEVEFI);
     PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns);
 
-    if (pThis->Lun0.pNvramDrv)
-        nvramStore(pThis);
     nvramFlushDeviceVariableList(pThis);
 
     if (pThis->pu8EfiRom)
@@ -2367,7 +2378,7 @@ const PDMDEVREG g_DeviceEFI =
     /* pfnInitComplete. */
     efiInitComplete,
     /* pfnPowerOff */
-    NULL,
+    efiPowerOff,
     /* pfnSoftReset */
     NULL,
     /* u32VersionEnd */
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyUtility/setup.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyUtility/setup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/AutoGen.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/AutoGen.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/BuildEngine.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/BuildEngine.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenC.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenC.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenDepex.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenDepex.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenMake.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenMake.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/StrGather.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/StrGather.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/UniClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/UniClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/BPDG.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/BPDG.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/GenVpd.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/GenVpd.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Database.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Database.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DecClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DecClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Dictionary.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Dictionary.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DscClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DscClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspace.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspace.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspaceBuild.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspaceBuild.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkLogger.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkLogger.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Expression.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Expression.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/FdfClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/FdfClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/FdfParserLite.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/FdfParserLite.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Identification.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Identification.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/InfClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/InfClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/MigrationUtilities.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/MigrationUtilities.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Misc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Misc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Parsing.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Parsing.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/String.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/String.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/TargetTxtClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/TargetTxtClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/ToolDefClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/ToolDefClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/VpdInfoFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/VpdInfoFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/CommonClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/CommonClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/FdfClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/FdfClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/ModuleClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/ModuleClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PackageClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PackageClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PlatformClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PlatformClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CLexer.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CLexer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Check.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Check.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CodeFragment.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CodeFragment.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Configuration.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Configuration.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Database.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Database.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Ecc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Ecc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Exception.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Exception.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/FileProfile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/FileProfile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaDataParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaDataParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/ParserWarning.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/ParserWarning.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/c.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/c.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CLexer.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CLexer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CodeFragment.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CodeFragment.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CodeFragmentCollector.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CodeFragmentCollector.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Database.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Database.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Eot.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Eot.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/EotGlobalData.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/EotGlobalData.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FileProfile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FileProfile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FvImage.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FvImage.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/InfParserLite.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/InfParserLite.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Parser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Parser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/ParserWarning.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/ParserWarning.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Report.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Report.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/c.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/c.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/AprioriSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/AprioriSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Attribute.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Attribute.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Capsule.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Capsule.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CapsuleData.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CapsuleData.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/ComponentStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/ComponentStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CompressSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CompressSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DataSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DataSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DepexSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DepexSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/EfiSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/EfiSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fd.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fd.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FdfParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FdfParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Ffs.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Ffs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsFileStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsFileStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsInfStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsInfStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fv.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fv.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FvImageSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FvImageSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFds.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFds.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GuidSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GuidSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomFileStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomFileStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomInfStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomInfStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptionRom.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptionRom.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Region.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Region.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Rule.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Rule.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleComplexFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleComplexFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleSimpleFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleSimpleFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Section.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Section.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/UiSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/UiSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/VerSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/VerSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Vtf.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Vtf.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/Table.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/Table.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDataModel.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDataModel.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDec.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDec.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDsc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDsc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableEotReport.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableEotReport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFdf.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFdf.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFunction.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFunction.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableIdentifier.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableIdentifier.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableInf.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableInf.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TablePcd.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TablePcd.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableQuery.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableQuery.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableReport.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableReport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/TargetTool/TargetTool.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/TargetTool/TargetTool.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Trim/Trim.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Trim/Trim.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DependencyRules.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DependencyRules.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DistributionPackageClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DistributionPackageClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/IpiDb.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/IpiDb.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/PackageFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/PackageFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenInfFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenInfFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/InstallPkg.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/InstallPkg.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentGenerating.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentGenerating.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentParsing.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentParsing.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Misc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Misc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ParserValidate.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ParserValidate.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Parsing.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Parsing.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/String.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/String.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/Log.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/Log.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/MkPkg.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/MkPkg.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/CommonObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/CommonObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/ModuleObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/ModuleObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/PackageObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/PackageObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/DecObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/DecObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBuildOptionObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBuildOptionObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfCommonObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfCommonObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineCommonObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineCommonObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDepexObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDepexObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfGuidObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfGuidObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfHeaderObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfHeaderObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfLibraryClassesObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfLibraryClassesObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPackagesObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPackagesObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPcdObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPcdObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPpiObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPpiObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfProtocolObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfProtocolObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfSoucesObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfSoucesObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfUserExtensionObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfUserExtensionObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParserMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParserMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBinarySectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBinarySectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDefineSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDefineSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDepexSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDepexSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfLibrarySectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfLibrarySectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPackageSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPackageSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPcdSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPcdSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSourceSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSourceSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignmentMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignmentMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/RmPkg.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/RmPkg.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UPT.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UPT.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentGeneratingUnitTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentGeneratingUnitTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentParsingUnitTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentParsingUnitTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/InfBinarySectionTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/InfBinarySectionTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/CommonXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/CommonXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/GuidProtocolPpiXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/GuidProtocolPpiXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/IniToXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/IniToXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PackageSurfaceAreaXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PackageSurfaceAreaXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PcdXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PcdXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParserMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParserMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/BuildClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/BuildClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaDataTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaDataTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/BuildReport.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/BuildReport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/build.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/build.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/ResetVector/Vtf0/Build.py b/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/ResetVector/Vtf0/Build.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/ResetVector/Vtf0/Tools/FixupForRawSection.py b/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/ResetVector/Vtf0/Tools/FixupForRawSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd
index 6ec17f2..b962910 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd differ
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd
index c935953..987a305 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd differ
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
index e0c22c1..bc9f4cd 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
@@ -6769,7 +6769,7 @@ vesa_pm_end:                                 ; 0xc4514 LB 0x1
 
 section _DATA progbits vstart=0x4600 align=1 ; size=0x371e class=DATA group=DGROUP
 _msg_vga_init:                               ; 0xc4600 LB 0x2e
-    db  'Oracle VM VirtualBox Version 5.0.4 VGA BIOS', 00dh, 00ah, 000h
+    db  'Oracle VM VirtualBox Version 5.0.6 VGA BIOS', 00dh, 00ah, 000h
 _vga_modes:                                  ; 0xc462e LB 0x80
     db  000h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 001h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
     db  002h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 003h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
@@ -7664,7 +7664,7 @@ _vbebios_vendor_name:                        ; 0xc7c73 LB 0x13
 _vbebios_product_name:                       ; 0xc7c86 LB 0x21
     db  'Oracle VM VirtualBox VBE Adapter', 000h
 _vbebios_product_revision:                   ; 0xc7ca7 LB 0x23
-    db  'Oracle VM VirtualBox Version 5.0.4', 000h
+    db  'Oracle VM VirtualBox Version 5.0.6', 000h
 _vbebios_info_string:                        ; 0xc7cca LB 0x2b
     db  'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h
 _no_vbebios_info_string:                     ; 0xc7cf5 LB 0x29
@@ -7721,4 +7721,4 @@ section CONST2 progbits vstart=0x7d1e align=1 ; size=0x0 class=DATA group=DGROUP
     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
-    db  000h, 0bah
+    db  000h, 0b6h
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
index b4d1ee8..b7fcb07 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
@@ -1 +1 @@
-76735991ac7e8ee1bddcc93f264fc028 *VBoxVgaBios.rom
+ba43daca93ecfa79494a91719422e4a2 *VBoxVgaBios.rom
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp b/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
index d666808..247f7e3 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
@@ -534,6 +534,7 @@ static const char *vmsvgaFIFOCmdToString(uint32_t u32Cmd)
 }
 #endif
 
+#ifdef IN_RING3
 /**
  * @interface_method_impl{PDMIDISPLAYPORT::pfnSetViewport}
  */
@@ -542,6 +543,7 @@ DECLCALLBACK(void) vmsvgaPortSetViewport(PPDMIDISPLAYPORT pInterface, uint32_t u
     PVGASTATE pThis = RT_FROM_MEMBER(pInterface, VGASTATE, IPort);
 
     Log(("vmsvgaPortSetViewPort: screen %d (%d,%d)(%d,%d)\n", uScreenId, x, y, cx, cy));
+    VMSVGAVIEWPORT const OldViewport = pThis->svga.viewport;
 
     if (x < pThis->svga.uWidth)
     {
@@ -569,7 +571,16 @@ DECLCALLBACK(void) vmsvgaPortSetViewport(PPDMIDISPLAYPORT pInterface, uint32_t u
         pThis->svga.viewport.yLowWC  = 0;
         pThis->svga.viewport.yHighWC = 0;
     }
+
+# ifdef VBOX_WITH_VMSVGA3D
+    /*
+     * Now inform the 3D backend.
+     */
+    if (pThis->svga.f3DEnabled)
+        vmsvga3dUpdateHostScreenViewport(pThis, uScreenId, &OldViewport);
+# endif
 }
+#endif /* IN_RING3 */
 
 /**
  * Read port register
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.h b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.h
index fe60157..a351aff 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.h
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.h
@@ -42,6 +42,7 @@ VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaDestroyViewAndContext(NativeNSViewRef pVie
 VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewInfo(PCDBGFINFOHLP pHlp, NativeNSViewRef pView);
 VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewSetPosition(NativeNSViewRef pView, NativeNSViewRef pParentView, int x, int y);
 VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewSetSize(NativeNSViewRef pView, int w, int h);
+VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewUpdateViewport(NativeNSViewRef pView);
 VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewMakeCurrentContext(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx);
 VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaSwapBuffers(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx);
 
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.m b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.m
index 627fe57..2433292 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.m
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.m
@@ -117,12 +117,13 @@
 - (id)initWithFrameAndFormat:(NSRect)frame parentView:(NSView*)pparentView pixelFormat:(NSOpenGLPixelFormat *)pFmt;
 - (void)vboxSetPos:(NSPoint)pos;
 - (void)vboxSetSize:(NSSize)size;
+- (void)vboxScheduleCtxUpdate;
 - (void)vboxReshapePerform;
 - (void)vboxReshape;
-#if 0 // doesn't work or isn't needed :/
-- (void)vboxFrameDidChange;
+- (void)vboxBoundsDidChange:(NSNotification *)pNotification;
+- (void)vboxFrameDidChange:(NSNotification *)pNotification;
+- (void)vboxFrameDidChangeGlobal:(NSNotification *)pNotification;
 - (BOOL)postsFrameChangedNotifications;
-#endif
 - (void)vboxRemoveFromSuperviewAndHide;
 - (void)vboxUpdateCtxIfNecessary;
 - (void)vboxClearBackBufferIfNecessary;
@@ -250,19 +251,6 @@
 
                 [pFmt release];
 
-#if 0 // doesn't work or isn't needed :/
-                /*
-                 * Get notifications when we're moved...
-                 */
-                if (pParams->pParentView)
-                {
-                    [[NSNotificationCenter defaultCenter] addObserver:self
-                                                             selector:@selector(vboxFrameDidChange)
-                                                                 name:NSViewFrameDidChangeNotification
-                                                               object:self];
-                }
-#endif
-
                 LogFlow(("OvlView createViewAndContext: returns successfully\n"));
                 return;
             }
@@ -299,6 +287,30 @@
     {
         //self.autoresizingMask = NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin;
         self.autoresizingMask = NSViewNotSizable;
+
+        /*
+         * Get notifications when we're moved or resized and when we're moved 
+         * to a different screen or GPU or when the GL context simply needs updating. 
+         */
+        if (pParentView)
+        {
+            [[NSNotificationCenter defaultCenter] addObserver:self
+                                                     selector:@selector(vboxBoundsDidChange:)
+                                                         name:NSViewBoundsDidChangeNotification
+                                                       object:self];
+            [[NSNotificationCenter defaultCenter] addObserver:self
+                                                     selector:@selector(vboxFrameDidChange:)
+                                                         name:NSViewFrameDidChangeNotification
+                                                       object:self];
+            //[[NSNotificationCenter defaultCenter] addObserver:self
+            //                                         selector:@selector(vboxFrameDidChange:)
+            //                                             name:NSViewDidUpdateTrackingAreasNotification
+            //                                           object:self];
+            [[NSNotificationCenter defaultCenter] addObserver:self
+                                                     selector:@selector(vboxFrameDidChangeGlobal:)
+                                                         name:NSViewGlobalFrameDidChangeNotification
+                                                       object:self];
+        }
     }
     LogFlow(("OvlView(%p) initWithFrameAndFormat: returns %p\n", (void *)self, (void *)self));
     return self;
@@ -344,6 +356,10 @@
     LogFlow(("OvlView(%p) vboxSetSize: returns\n", (void *)self));
 }
 
+- (void)vboxScheduleCtxUpdate
+{
+    m_fUpdateCtx = true;
+}
 
 - (void)vboxUpdateCtxIfNecessary
 {
@@ -453,18 +469,46 @@
     LogFlow(("OvlView(%p) vboxReshape: returns\n", (void *)self));
 }
 
-#if 0 // doesn't work or isn't needed :/
-- (void)vboxFrameDidChange
+/**
+ * This is called when the bounds change.
+ *  
+ * We indicate that the FIFO thread must update the GL context.
+ */
+- (void)vboxBoundsDidChange:(NSNotification *)pNotification
+{
+    LogFlow(("OvlView(%p) vboxBoundsDidChange:\n", (void *)self));
+    self->m_fUpdateCtx = true;
+}
+
+/**
+ * This is called when the frame changes size or position.
+ *  
+ * We indicate that the FIFO thread must update the GL context.
+ */
+- (void)vboxFrameDidChange:(NSNotification *)pNotification
 {
     LogFlow(("OvlView(%p) vboxFrameDidChange:\n", (void *)self));
+    self->m_fUpdateCtx = true;
+}
+
+/** 
+ * This is called when moved to different screen/GPU or/and when the GL context 
+ * needs updating.
+ *  
+ * We indicate that the FIFO thread must update the GL context.
+ */
+- (void)vboxFrameDidChangeGlobal:(NSNotification *)pNotification
+{
+    LogFlow(("OvlView(%p) vboxFrameDidChangeGlobal:\n", (void *)self));
+    self->m_fUpdateCtx = true;
 }
 
+/** This enables the vboxFrameDidChange notification. */
 - (BOOL)postsFrameChangedNotifications
 {
     LogFlow(("OvlView(%p) postsFrameChangedNotifications:\n", (void *)self));
     return YES;
 }
-#endif
 
 /**
  * Removes the view from the parent, if it has one, and makes sure it's hidden.
@@ -492,10 +536,8 @@
             [self removeFromSuperview];
             LogFlow(("OvlView(%p) vboxRemoveFromSuperviewAndHide: calling setHidden\n", (void *)self));
             [self setHidden:YES];
-#if 0 /* doesn't work, or isn't really needed (scroll bar mess). */
             LogFlow(("OvlView(%p) vboxRemoveFromSuperviewAndHide: calling setHidden\n", (void *)self));
             [[NSNotificationCenter defaultCenter] removeObserver:self];
-#endif
         }
         else
         {
@@ -797,6 +839,21 @@ VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewSetPosition(NativeNSViewRef pView, Nat
 }
 
 
+VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewUpdateViewport(NativeNSViewRef pView)
+{
+    LogFlow(("vmsvga3dCocoaViewSetSize: pView=%p\n", (void *)pView));
+    NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
+    VMSVGA3DOverlayView *pOverlayView = (VMSVGA3DOverlayView *)pView;
+
+    /* Possible that we don't actually need to do this (i.e. this API), but right now I'm
+       leaving it to be sure things actually work right when scrolling. */
+    [pOverlayView vboxScheduleCtxUpdate];
+
+    [pPool release];
+    LogFlow(("vmsvga3dCocoaViewSetSize: returns\n"));
+}
+
+
 VMSVGA3DCOCOA_DECL(void) vmsvga3dCocoaViewSetSize(NativeNSViewRef pView, int cx, int cy)
 {
     LogFlow(("vmsvga3dCocoaViewSetSize: pView=%p (%d,%d)\n", (void *)pView, cx, cy));
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
index a0e51d3..d569d54 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
@@ -1080,6 +1080,25 @@ int vmsvga3dTerminate(PVGASTATE pThis)
 }
 
 
+void vmsvga3dUpdateHostScreenViewport(PVGASTATE pThis, uint32_t idScreen, VMSVGAVIEWPORT const *pOldViewport)
+{
+    /** @todo Move the visible framebuffer content here, don't wait for the guest to
+     *        redraw it. */
+
+#ifdef RT_OS_DARWIN
+    PVMSVGA3DSTATE pState = pThis->svga.p3dState;
+    if (   pState
+        && idScreen == 0
+        && pState->SharedCtx.id == VMSVGA3D_SHARED_CTX_ID)
+    {
+        vmsvga3dCocoaViewUpdateViewport(pState->SharedCtx.cocoaView);
+    }
+#else
+    NOREF(pThis); NOREF(idScreen);
+#endif
+}
+
+
 /**
  * Worker for vmsvga3dQueryCaps that figures out supported operations for a
  * given surface format capability.
@@ -2994,6 +3013,11 @@ int vmsvga3dCommandPresent(PVGASTATE pThis, uint32_t sid, uint32_t cRects, SVGA3
          *      Copy.cx   -= cyAdjust = 2;
          *   => Copy = { .yDst = 2, .ySrc = 5, .cy = 2 }
          *
+         * Update: On darwin, it turns out that when we call [NSOpenGLContext updates]
+         *         when the view is resized, moved and otherwise messed with,
+         *         the visible part of the framebuffer is actually the bottom
+         *         one.  It's easy to adjust for this, just have to adjust the
+         *         destination rectangle such that yBottom is zero.
          */
         /* X - no inversion, so kind of simple. */
         if (ClippedRect.x >= DstViewport.x)
@@ -3055,7 +3079,7 @@ int vmsvga3dCommandPresent(PVGASTATE pThis, uint32_t sid, uint32_t cRects, SVGA3
             else
             {
                 /* adjustment #2 */
-                uint32_t cyAdjust = ClippedRect.y + ClippedRect.h - DstViewport.yHighWC;
+                cyAdjust = ClippedRect.y + ClippedRect.h - DstViewport.yHighWC;
                 ClippedRect.srcy += cyAdjust;
                 ClippedRect.h    -= cyAdjust;
             }
@@ -3078,8 +3102,13 @@ int vmsvga3dCommandPresent(PVGASTATE pThis, uint32_t sid, uint32_t cRects, SVGA3
         /* Adjust for viewport. */
         DstRect.xLeft   -= DstViewport.x;
         DstRect.xRight  -= DstViewport.x;
+# ifdef RT_OS_DARWIN /* We actually seeing the bottom of the FB, not the top as on windows and X11. */
+        DstRect.yTop    -= DstRect.yBottom;
+        DstRect.yBottom  = 0;
+# else
         DstRect.yBottom += DstViewport.y;
         DstRect.yTop    += DstViewport.y;
+# endif
 
         Log(("SrcRect: (%d,%d)(%d,%d) DstRect: (%d,%d)(%d,%d)\n",
              SrcRect.xLeft, SrcRect.yBottom, SrcRect.xRight, SrcRect.yTop,
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
index aeb48d8..daa4180 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
@@ -323,6 +323,11 @@ int vmsvga3dTerminate(PVGASTATE pThis)
     return VINF_SUCCESS;
 }
 
+void vmsvga3dUpdateHostScreenViewport(PVGASTATE pThis, uint32_t idScreen, VMSVGAVIEWPORT const *pOldViewport)
+{
+    /** @todo Scroll the screen content without requiring the guest to redraw. */
+    NOREF(pThis); NOREF(idScreen); NOREF(pOldViewport);
+}
 
 static uint32_t vmsvga3dGetSurfaceFormatSupport(PVMSVGA3DSTATE pState3D, uint32_t idx3dCaps, D3DFORMAT format)
 {
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h b/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
index c130c15..1388244 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
@@ -55,6 +55,7 @@ int vmsvga3dLoadExec(PVGASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion, uint32
 int vmsvga3dSaveExec(PVGASTATE pThis, PSSMHANDLE pSSM);
 int vmsvga3dTerminate(PVGASTATE pThis);
 int vmsvga3dReset(PVGASTATE pThis);
+void vmsvga3dUpdateHostScreenViewport(PVGASTATE pThis, uint32_t idScreen, VMSVGAVIEWPORT const *pOldViewport);
 int vmsvga3dQueryCaps(PVGASTATE pThis, uint32_t idx3dCaps, uint32_t *pu32Val);
 
 int vmsvga3dSurfaceDefine(PVGASTATE pThis, uint32_t sid, uint32_t surfaceFlags, SVGA3dSurfaceFormat format, SVGA3dSurfaceFace face[SVGA3D_MAX_SURFACE_FACES], uint32_t multisampleCount, SVGA3dTextureFilter autogenFilter, uint32_t cMipLevels, SVGA3dSize *pMipLevelSize);
diff --git a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
index 228d9df..3cc07e3 100644
--- a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
@@ -2652,7 +2652,7 @@ static DECLCALLBACK(int) vbvaChannelHandler(void *pvHandler, uint16_t u16Channel
 #ifdef VBOX_WITH_VIDEOHWACCEL
         case VBVA_VHWA_CMD:
         {
-            if (cbBuffer < sizeof(VBOXVHWACMD))
+            if (cbBuffer < VBOXVHWACMD_HEADSIZE())
             {
                 rc = VERR_INVALID_PARAMETER;
                 break;
diff --git a/src/VBox/Devices/Graphics/VBoxSVGA3DObjC.def b/src/VBox/Devices/Graphics/VBoxSVGA3DObjC.def
index 19dddbf..ca5378e 100644
--- a/src/VBox/Devices/Graphics/VBoxSVGA3DObjC.def
+++ b/src/VBox/Devices/Graphics/VBoxSVGA3DObjC.def
@@ -23,6 +23,7 @@ EXPORTS
     vmsvga3dCocoaViewInfo
     vmsvga3dCocoaViewSetPosition
     vmsvga3dCocoaViewSetSize
+    vmsvga3dCocoaViewUpdateViewport
     vmsvga3dCocoaViewMakeCurrentContext
     vmsvga3dCocoaSwapBuffers
 
diff --git a/src/VBox/Devices/Graphics/shaderlib/directx.c b/src/VBox/Devices/Graphics/shaderlib/directx.c
index 585ed59..bb0eb46 100644
--- a/src/VBox/Devices/Graphics/shaderlib/directx.c
+++ b/src/VBox/Devices/Graphics/shaderlib/directx.c
@@ -738,7 +738,7 @@ static BOOL match_intel(const struct wined3d_gl_info *gl_info, const char *gl_re
         enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     if (card_vendor == HW_VENDOR_INTEL) return TRUE;
-    if (gl_vendor == HW_VENDOR_INTEL) return TRUE;
+    if (gl_vendor == GL_VENDOR_INTEL) return TRUE;
     return FALSE;
 }
 
diff --git a/src/VBox/Devices/Makefile.kmk b/src/VBox/Devices/Makefile.kmk
index 98aff80..5f0195c 100644
--- a/src/VBox/Devices/Makefile.kmk
+++ b/src/VBox/Devices/Makefile.kmk
@@ -69,9 +69,6 @@ if !defined(VBOX_ONLY_EXTPACKS)         # Goes on almost to the end of the file.
   if defined(VBOX_WITH_XHCI_IMPL) && !defined(VBOX_WITH_EXTPACK_PUEL)
    VBoxDDU_DEFS          += VBOX_WITH_XHCI_IMPL
   endif
-  ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-   VBoxDDU_DEFS.darwin   += VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-  endif
  else
   VBoxDDU_SDKS.win        = ReorderCompilerIncs $(VBOX_WINPSDK)
  endif
@@ -100,9 +97,7 @@ if !defined(VBOX_ONLY_EXTPACKS)         # Goes on almost to the end of the file.
  endif
  VBoxDDU_LDFLAGS.darwin   = -install_name $(VBOX_DYLD_EXECUTABLE_PATH)/VBoxDDU.dylib
  ifdef VBOX_WITH_USB
-  ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
   VBoxDDU_LDFLAGS.darwin += -framework IOKit
-  endif
  endif
 
  VBoxDDU_LDFLAGS.linux    = -Wl,--no-undefined
@@ -322,9 +317,6 @@ if !defined(VBOX_ONLY_EXTPACKS)         # Goes on almost to the end of the file.
   	USB/vrdp/USBProxyDevice-vrdp.cpp
 
   VBoxDD_DEFS.darwin    += VUSB_HAVE_USBPROXY_DEVICE
-  ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-   VBoxDD_DEFS.darwin   += VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-  endif
   VBoxDD_SOURCES.darwin += \
  	USB/USBProxyDevice.cpp \
  	USB/darwin/USBProxyDevice-darwin.cpp
@@ -551,8 +543,6 @@ if !defined(VBOX_ONLY_EXTPACKS)         # Goes on almost to the end of the file.
  ifeq ($(KBUILD_TARGET),win)
   VBoxDD_SOURCES += \
    Audio/DrvHostDSound.cpp
-  VBoxDD_LIBS    += \
-   $(PATH_SDK_$(VBOX_WINDDK)_LIB)/dsound.lib
  endif
 
  ifeq ($(KBUILD_TARGET),linux)
diff --git a/src/VBox/Devices/Network/DrvNAT.cpp b/src/VBox/Devices/Network/DrvNAT.cpp
index 29b2d2d..6f39646 100644
--- a/src/VBox/Devices/Network/DrvNAT.cpp
+++ b/src/VBox/Devices/Network/DrvNAT.cpp
@@ -496,6 +496,7 @@ static DECLCALLBACK(int) drvNATNetworkUp_AllocBuf(PPDMINETWORKUP pInterface, siz
         {
             Log(("drvNATNetowrkUp_AllocBuf: drops over-sized frame (%u bytes), returns VERR_INVALID_PARAMETER\n",
                  cbMin));
+            RTMemFree(pSgBuf);
             return VERR_INVALID_PARAMETER;
         }
 
@@ -517,6 +518,7 @@ static DECLCALLBACK(int) drvNATNetworkUp_AllocBuf(PPDMINETWORKUP pInterface, siz
         {
             Log(("drvNATNetowrkUp_AllocBuf: drops over-sized frame (%u bytes), returns VERR_INVALID_PARAMETER\n",
                  pGso->cbHdrsTotal + pGso->cbMaxSeg));
+            RTMemFree(pSgBuf);
             return VERR_INVALID_PARAMETER;
         }
 
diff --git a/src/VBox/Devices/Network/SrvIntNetR0.cpp b/src/VBox/Devices/Network/SrvIntNetR0.cpp
index d6fa0df..a4c8d8f 100644
--- a/src/VBox/Devices/Network/SrvIntNetR0.cpp
+++ b/src/VBox/Devices/Network/SrvIntNetR0.cpp
@@ -3490,11 +3490,17 @@ static void intnetR0NetworkEditDhcpFromIntNet(PINTNETNETWORK pNetwork, PINTNETSG
                 intnetR0SgWritePart(pSG, (uintptr_t)&pDhcp->bp_flags - (uintptr_t)pIpHdr + sizeof(RTNETETHERHDR), sizeof(uFlags), &uFlags);
 
                 /* Patch UDP checksum */
-                uint32_t uChecksum = (uint32_t)~pUdpHdr->uh_sum + RT_H2BE_U16_C(RTNET_DHCP_FLAG_BROADCAST);
-                while (uChecksum >> 16)
-                    uChecksum = (uChecksum >> 16) + (uChecksum & 0xFFFF);
-                uChecksum = ~uChecksum;
-                intnetR0SgWritePart(pSG, (uintptr_t)&pUdpHdr->uh_sum - (uintptr_t)pIpHdr + sizeof(RTNETETHERHDR), sizeof(pUdpHdr->uh_sum), &uChecksum);
+                if (pUdpHdr->uh_sum != 0)
+                {
+                    uint32_t uChecksum = (uint32_t)~pUdpHdr->uh_sum + RT_H2BE_U16_C(RTNET_DHCP_FLAG_BROADCAST);
+                    while (uChecksum >> 16)
+                        uChecksum = (uChecksum >> 16) + (uChecksum & 0xFFFF);
+                    uChecksum = ~uChecksum;
+                    intnetR0SgWritePart(pSG,
+                                        (uintptr_t)&pUdpHdr->uh_sum - (uintptr_t)pIpHdr + sizeof(RTNETETHERHDR),
+                                        sizeof(pUdpHdr->uh_sum),
+                                        &uChecksum);
+                }
             }
 
 #ifdef RT_OS_DARWIN
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
index e38a008..070c7d5 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
@@ -983,7 +983,7 @@ section CONST progbits vstart=0xb0 align=1 ; size=0xce0 class=DATA group=DGROUP
 
 section CONST2 progbits vstart=0xd90 align=1 ; size=0x3fa class=DATA group=DGROUP
 _bios_cvs_version_string:                    ; 0xf0d90 LB 0x12
-    db  'VirtualBox 5.0.4', 000h, 000h
+    db  'VirtualBox 5.0.6', 000h, 000h
 _bios_prefix_string:                         ; 0xf0da2 LB 0x8
     db  'BIOS: ', 000h, 000h
 _isotag:                                     ; 0xf0daa LB 0x6
@@ -16348,4 +16348,4 @@ dummy_iret:                                  ; 0xfff53 LB 0x9d
     db  'XM'
 cpu_reset:                                   ; 0xffff0 LB 0x10
     jmp far 0f000h:0e05bh                     ; ea 5b e0 00 f0
-    db  030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 085h
+    db  030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 083h
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
index c752487..d4b27bd 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
@@ -1 +1 @@
-f1f88e6a631fdb80686051c812f21d6e *VBoxPcBios.rom
+1ad4d7135e06ee283904de6c6b075665 *VBoxPcBios.rom
diff --git a/src/VBox/Devices/PC/DevACPI.cpp b/src/VBox/Devices/PC/DevACPI.cpp
index 0d8e5e0..eb80739 100644
--- a/src/VBox/Devices/PC/DevACPI.cpp
+++ b/src/VBox/Devices/PC/DevACPI.cpp
@@ -182,7 +182,11 @@ enum
     SYSTEM_INFO_INDEX_SERIAL0_IRQ       = 23,
     SYSTEM_INFO_INDEX_SERIAL1_IOBASE    = 24,
     SYSTEM_INFO_INDEX_SERIAL1_IRQ       = 25,
-    SYSTEM_INFO_INDEX_END               = 26,
+    SYSTEM_INFO_INDEX_PARALLEL0_IOBASE  = 26,
+    SYSTEM_INFO_INDEX_PARALLEL0_IRQ     = 27,
+    SYSTEM_INFO_INDEX_PARALLEL1_IOBASE  = 28,
+    SYSTEM_INFO_INDEX_PARALLEL1_IRQ     = 29,
+    SYSTEM_INFO_INDEX_END               = 30,
     SYSTEM_INFO_INDEX_INVALID           = 0x80,
     SYSTEM_INFO_INDEX_VALID             = 0x200
 };
@@ -312,6 +316,21 @@ typedef struct ACPIState
     RTIOPORT            uSerial0IoPortBase;
     /** Serial 1 IO port base */
     RTIOPORT            uSerial1IoPortBase;
+
+    /** @name Parallel port config bits
+     * @{ */
+    /** Parallel 0 IRQ number */
+    uint8_t             uParallel0Irq;
+    /** Parallel 1 IRQ number */
+    uint8_t             uParallel1Irq;
+    /** Parallel 0 IO port base */
+    RTIOPORT            uParallel0IoPortBase;
+    /** Parallel 1 IO port base */
+    RTIOPORT            uParallel1IoPortBase;
+    /** @} */
+
+    uint32_t            u32Alignment1;
+
     /** ACPI port base interface. */
     PDMIBASE            IBase;
     /** ACPI port interface. */
@@ -321,7 +340,7 @@ typedef struct ACPIState
     PPDMDEVINSR0        pDevInsR0;
     PPDMDEVINSRC        pDevInsRC;
 
-    uint32_t            Alignment1;
+    uint32_t            Alignment2;
     /** Pointer to the driver base interface. */
     R3PTRTYPE(PPDMIBASE) pDrvBase;
     /** Pointer to the driver connector interface. */
@@ -344,7 +363,7 @@ typedef struct ACPIState
     uint8_t             au8OemTabId[8];
     /** ACPI custom OEM Rev */
     uint32_t            u32OemRevision;
-    uint32_t            Alignment2;
+    uint32_t            Alignment3;
 
     /** The custom table binary data. */
     R3PTRTYPE(uint8_t *) pu8CustBin;
@@ -1318,6 +1337,22 @@ PDMBOTHCBDECL(int) acpiR3SysInfoDataRead(PPDMDEVINS pDevIns, void *pvUser, RTIOP
             *pu32 = pThis->uSerial1Irq;
             break;
 
+        case SYSTEM_INFO_INDEX_PARALLEL0_IOBASE:
+            *pu32 = pThis->uParallel0IoPortBase;
+            break;
+
+        case SYSTEM_INFO_INDEX_PARALLEL0_IRQ:
+            *pu32 = pThis->uParallel0Irq;
+            break;
+
+        case SYSTEM_INFO_INDEX_PARALLEL1_IOBASE:
+            *pu32 = pThis->uParallel1IoPortBase;
+            break;
+
+        case SYSTEM_INFO_INDEX_PARALLEL1_IRQ:
+            *pu32 = pThis->uParallel1Irq;
+            break;
+
         case SYSTEM_INFO_INDEX_END:
             /** @todo why isn't this setting any output value?  */
             break;
@@ -3056,6 +3091,10 @@ static DECLCALLBACK(int) acpiR3Construct(PPDMDEVINS pDevIns, int iInstance, PCFG
                               "AcpiCreatorRev\0"
                               "CustomTable\0"
                               "SLICTable\0"
+                              "Parallel0IoPortBase\0"
+                              "Parallel1IoPortBase\0"
+                              "Parallel0Irq\0"
+                              "Parallel1Irq\0"
                               ))
         return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
                                 N_("Configuration error: Invalid config key for ACPI device"));
@@ -3194,6 +3233,30 @@ static DECLCALLBACK(int) acpiR3Construct(PPDMDEVINS pDevIns, int iInstance, PCFG
         return PDMDEV_SET_ERROR(pDevIns, rc,
                                 N_("Configuration error: Failed to read \"Serial1IoPortBase\""));
 
+    /*
+     * Query settings for both parallel ports, if the CFGM keys don't exist pretend that
+     * the corresponding parallel port is not enabled.
+     */
+    rc = CFGMR3QueryU8Def(pCfg, "Parallel0Irq", &pThis->uSerial0Irq, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Parallel0Irq\""));
+
+    rc = CFGMR3QueryU16Def(pCfg, "Parallel0IoPortBase", &pThis->uParallel0IoPortBase, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Parallel0IoPortBase\""));
+
+    rc = CFGMR3QueryU8Def(pCfg, "Parallel1Irq", &pThis->uParallel1Irq, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Parallel1Irq\""));
+
+    rc = CFGMR3QueryU16Def(pCfg, "Parallel1IoPortBase", &pThis->uParallel1IoPortBase, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Parallel1IoPortBase\""));
+
     /* Try to attach the other CPUs */
     for (unsigned i = 1; i < pThis->cCpus; i++)
     {
diff --git a/src/VBox/Devices/PC/vbox.dsl b/src/VBox/Devices/PC/vbox.dsl
index 28cc65c..1c0f5ad 100644
--- a/src/VBox/Devices/PC/vbox.dsl
+++ b/src/VBox/Devices/PC/vbox.dsl
@@ -153,6 +153,10 @@ DefinitionBlock ("DSDT.aml", "DSDT", 1, "VBOX  ", "VBOXBIOS", 2)
         SL0I,  32, // Serial0 IRQ
         SL1B,  32, // Serial1 base IO address  
         SL1I,  32, // Serial1 IRQ
+        PP0B,  32, // Parallel0 base IO address  
+        PP0I,  32, // Parallel0 IRQ
+        PP1B,  32, // Parallel1 base IO address  
+        PP1I,  32, // Parallel1 IRQ
         Offset (0x80),
         ININ, 32,
         Offset (0x200),
@@ -666,22 +670,73 @@ DefinitionBlock ("DSDT.aml", "DSDT", 1, "VBOX  ", "VBOXBIOS", 2)
                     })
                 }
 
-                // Parallel port
-                Device (LPT)
+                // Parallel port 0
+                Device (^LPT0)
                 {
                     Name (_HID, EisaId ("PNP0400"))
+                    Name (_UID, 0x01)
                     Method (_STA, 0, NotSerialized)
                     {
-                        Return (0x0F)
+                        If (LEqual (PP0B, Zero))
+                        {
+                            Return (0x00)
+                        }
+                        Else
+                        {
+                            Return (0x0F)
+                        }
                     }
-                    Name (_CRS, ResourceTemplate ()
+                    Name (CRS, ResourceTemplate ()
+                    {
+                        IO (Decode16, 0x0378, 0x0378, 0x08, 0x08, _Y18)
+                        IRQNoFlags (_Y19) {7}
+                    })
+                    Method (_CRS, 0, NotSerialized)
+                    {
+                        CreateWordField (CRS, \_SB.PCI0.LPT0._Y18._MIN, PMI0)
+                        CreateWordField (CRS, \_SB.PCI0.LPT0._Y18._MAX, PMA0)
+                        CreateWordField (CRS, \_SB.PCI0.LPT0._Y19._INT, PIQ0)
+                        Store (PP0B, PMI0)
+                        Store (PP0B, PMA0)
+                        ShiftLeft (0x01, PP0I, PIQ0)
+                        Return (CRS)
+                    }
+                }
+
+                // Parallel port 1
+                Device (^LPT1)
+                {
+                    Name (_HID, EisaId ("PNP0400"))
+                    Name (_UID, 0x02)
+                    Method (_STA, 0, NotSerialized)
                     {
-                        IO (Decode16, 0x0378, 0x0378, 0x08, 0x08)
-                        IO (Decode16, 0x0778, 0x0778, 0x08, 0x08)
-                        IRQNoFlags () {7}
+                        If (LEqual (PP1B, Zero))
+                        {
+                            Return (0x00)
+                        }
+                        Else
+                        {
+                            Return (0x0F)
+                        }
+                    }
+                    Name (CRS, ResourceTemplate ()
+                    {
+                        IO (Decode16, 0x0278, 0x0278, 0x08, 0x08, _Y20)
+                        IRQNoFlags (_Y21) {5}
                     })
+                    Method (_CRS, 0, NotSerialized)
+                    {
+                        CreateWordField (CRS, \_SB.PCI0.LPT1._Y20._MIN, PMI1)
+                        CreateWordField (CRS, \_SB.PCI0.LPT1._Y20._MAX, PMA1)
+                        CreateWordField (CRS, \_SB.PCI0.LPT1._Y21._INT, PIQ1)
+                        Store (PP1B, PMI1)
+                        Store (PP1B, PMA1)
+                        ShiftLeft (0x01, PP1I, PIQ1)
+                        Return (CRS)
+                    }
                 }
 
+
                 // Serial port 0
                 Device (^SRL0)
                 {
diff --git a/src/VBox/Devices/Parallel/DevParallel.cpp b/src/VBox/Devices/Parallel/DevParallel.cpp
index 8cf0e2f..a510baf 100644
--- a/src/VBox/Devices/Parallel/DevParallel.cpp
+++ b/src/VBox/Devices/Parallel/DevParallel.cpp
@@ -356,16 +356,23 @@ PDMBOTHCBDECL(int) parallelIOPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPOR
 #ifndef IN_RING3
                     return VINF_IOM_R3_IOPORT_WRITE;
 #else
-                    /* Set data direction. */
-                    if (u8 & LPT_CONTROL_ENABLE_BIDIRECT)
-                        rc = pThis->pDrvHostParallelConnector->pfnSetPortDirection(pThis->pDrvHostParallelConnector, false /* fForward */);
+                    if (RT_LIKELY(pThis->pDrvHostParallelConnector))
+                    {
+                        /* Set data direction. */
+                        if (u8 & LPT_CONTROL_ENABLE_BIDIRECT)
+                            rc = pThis->pDrvHostParallelConnector->pfnSetPortDirection(pThis->pDrvHostParallelConnector, false /* fForward */);
+                        else
+                            rc = pThis->pDrvHostParallelConnector->pfnSetPortDirection(pThis->pDrvHostParallelConnector, true /* fForward */);
+                        AssertRC(rc);
+
+                        u8 &= ~LPT_CONTROL_ENABLE_BIDIRECT; /* Clear bit. */
+
+                        rc = pThis->pDrvHostParallelConnector->pfnWriteControl(pThis->pDrvHostParallelConnector, u8);
+                        AssertRC(rc);
+                    }
                     else
-                        rc = pThis->pDrvHostParallelConnector->pfnSetPortDirection(pThis->pDrvHostParallelConnector, true /* fForward */);
-                    AssertRC(rc);
-                    u8 &= ~LPT_CONTROL_ENABLE_BIDIRECT; /* Clear bit. */
+                        u8 &= ~LPT_CONTROL_ENABLE_BIDIRECT; /* Clear bit. */
 
-                    rc = pThis->pDrvHostParallelConnector->pfnWriteControl(pThis->pDrvHostParallelConnector, u8);
-                    AssertRC(rc);
                     pThis->regControl = u8;
 #endif
                 }
@@ -461,11 +468,15 @@ PDMBOTHCBDECL(int) parallelIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT
                 break;
             case 2:
 #ifndef IN_RING3
-                 rc = VINF_IOM_R3_IOPORT_READ;
+                rc = VINF_IOM_R3_IOPORT_READ;
 #else
-                 rc = pThis->pDrvHostParallelConnector->pfnReadControl(pThis->pDrvHostParallelConnector, &pThis->regControl);
-                 AssertRC(rc);
-                 pThis->regControl |= LPT_CONTROL_BIT6 | LPT_CONTROL_BIT7;
+                if (RT_LIKELY(pThis->pDrvHostParallelConnector))
+                {
+                    rc = pThis->pDrvHostParallelConnector->pfnReadControl(pThis->pDrvHostParallelConnector, &pThis->regControl);
+                    AssertRC(rc);
+                    pThis->regControl |= LPT_CONTROL_BIT6 | LPT_CONTROL_BIT7;
+                }
+
                 *pu32 = pThis->regControl;
 #endif
                 break;
@@ -765,6 +776,12 @@ static DECLCALLBACK(int) parallelR3Construct(PPDMDEVINS pDevIns, int iInstance,
     if (RT_SUCCESS(rc))
     {
         pThis->pDrvHostParallelConnector = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIHOSTPARALLELCONNECTOR);
+
+        /* Set compatibility mode */
+        //pThis->pDrvHostParallelConnector->pfnSetMode(pThis->pDrvHostParallelConnector, PDM_PARALLEL_PORT_MODE_COMPAT);
+        /* Get status of control register */
+        pThis->pDrvHostParallelConnector->pfnReadControl(pThis->pDrvHostParallelConnector, &pThis->regControl);
+
         AssertMsgReturn(pThis->pDrvHostParallelConnector,
                         ("Configuration error: instance %d has no host parallel interface!\n", iInstance),
                         VERR_PDM_MISSING_INTERFACE);
@@ -782,11 +799,6 @@ static DECLCALLBACK(int) parallelR3Construct(PPDMDEVINS pDevIns, int iInstance,
                                    N_("Parallel device %d cannot attach to host driver"), iInstance);
     }
 
-    /* Set compatibility mode */
-    //pThis->pDrvHostParallelConnector->pfnSetMode(pThis->pDrvHostParallelConnector, PDM_PARALLEL_PORT_MODE_COMPAT);
-    /* Get status of control register */
-    pThis->pDrvHostParallelConnector->pfnReadControl(pThis->pDrvHostParallelConnector, &pThis->regControl);
-
     return VINF_SUCCESS;
 }
 
@@ -810,7 +822,7 @@ const PDMDEVREG g_DeviceParallelPort =
     /* fClass */
     PDM_DEVREG_CLASS_PARALLEL,
     /* cMaxInstances */
-    1,
+    2,
     /* cbInstance */
     sizeof(PARALLELPORT),
     /* pfnConstruct */
diff --git a/src/VBox/Devices/Serial/DrvHostSerial.cpp b/src/VBox/Devices/Serial/DrvHostSerial.cpp
index 52d3bad..dd73d89 100644
--- a/src/VBox/Devices/Serial/DrvHostSerial.cpp
+++ b/src/VBox/Devices/Serial/DrvHostSerial.cpp
@@ -473,8 +473,7 @@ static DECLCALLBACK(int) drvHostSerialSendThread(PPDMDRVINS pDrvIns, PPDMTHREAD
     while (pThread->enmState == PDMTHREADSTATE_RUNNING)
     {
         int rc = RTSemEventWait(pThis->SendSem, RT_INDEFINITE_WAIT);
-        if (RT_FAILURE(rc))
-            break;
+        AssertRCBreak(rc);
 
         /*
          * Write the character to the host device.
@@ -769,9 +768,20 @@ static DECLCALLBACK(int) drvHostSerialRecvThread(PPDMDRVINS pDrvIns, PPDMTHREAD
             {
                 if (!ReadFile(pThis->hDeviceFile, abBuffer, sizeof(abBuffer), &dwNumberOfBytesTransferred, &pThis->overlappedRecv))
                 {
-                    rcThread = RTErrConvertFromWin32(GetLastError());
-                    LogRel(("HostSerial#%d: Read failed with error %Rrc; terminating the worker thread.\n", pDrvIns->iInstance, rcThread));
-                    break;
+                    dwRet = GetLastError();
+                    if (dwRet == ERROR_IO_PENDING)
+                    {
+                        if (GetOverlappedResult(pThis->hDeviceFile, &pThis->overlappedRecv, &dwNumberOfBytesTransferred, TRUE))
+                            dwRet = NO_ERROR;
+                        else
+                            dwRet = GetLastError();
+                    }
+                    if (dwRet != NO_ERROR)
+                    {
+                        rcThread = RTErrConvertFromWin32(dwRet);
+                        LogRel(("HostSerial#%d: Read failed with error %Rrc; terminating the worker thread.\n", pDrvIns->iInstance, rcThread));
+                        break;
+                    }
                 }
                 cbRemaining = dwNumberOfBytesTransferred;
             }
diff --git a/src/VBox/Devices/Serial/DrvNamedPipe.cpp b/src/VBox/Devices/Serial/DrvNamedPipe.cpp
index 5230830..54a1b28 100644
--- a/src/VBox/Devices/Serial/DrvNamedPipe.cpp
+++ b/src/VBox/Devices/Serial/DrvNamedPipe.cpp
@@ -115,6 +115,15 @@ static DECLCALLBACK(int) drvNamedPipeRead(PPDMISTREAM pInterface, void *pvBuf, s
         {
             DWORD uError = GetLastError();
 
+            if (uError == ERROR_IO_PENDING)
+            {
+                uError = 0;
+
+                /* Wait for incoming bytes. */
+                if (GetOverlappedResult(pThis->NamedPipe, &pThis->OverlappedRead, &cbReallyRead, TRUE) == FALSE)
+                    uError = GetLastError();
+            }
+
             if (   uError == ERROR_PIPE_LISTENING
                 || uError == ERROR_PIPE_NOT_CONNECTED)
             {
@@ -126,15 +135,6 @@ static DECLCALLBACK(int) drvNamedPipeRead(PPDMISTREAM pInterface, void *pvBuf, s
             }
             else
             {
-                if (uError == ERROR_IO_PENDING)
-                {
-                    uError = 0;
-
-                    /* Wait for incoming bytes. */
-                    if (GetOverlappedResult(pThis->NamedPipe, &pThis->OverlappedRead, &cbReallyRead, TRUE) == FALSE)
-                        uError = GetLastError();
-                }
-
                 rc = RTErrConvertFromWin32(uError);
                 Log(("drvNamedPipeRead: ReadFile returned %d (%Rrc)\n", uError, rc));
             }
diff --git a/src/VBox/Devices/Storage/DevAHCI.cpp b/src/VBox/Devices/Storage/DevAHCI.cpp
index fa0c458..d899234 100644
--- a/src/VBox/Devices/Storage/DevAHCI.cpp
+++ b/src/VBox/Devices/Storage/DevAHCI.cpp
@@ -6547,6 +6547,7 @@ static AHCITXDIR ahciProcessCmd(PAHCIPort pAhciPort, PAHCIREQ pAhciReq, uint8_t
         case ATA_SMART:
         case ATA_NV_CACHE:
         case ATA_IDLE:
+        case ATA_TRUSTED_RECEIVE_DMA: /* Windows 8+ */
             pAhciReq->uATARegError = ABRT_ERR;
             pAhciReq->uATARegStatus = ATA_STAT_READY | ATA_STAT_ERR;
             break;
diff --git a/src/VBox/Devices/USB/VUSBDevice.cpp b/src/VBox/Devices/USB/VUSBDevice.cpp
index 3320387..40962ac 100644
--- a/src/VBox/Devices/USB/VUSBDevice.cpp
+++ b/src/VBox/Devices/USB/VUSBDevice.cpp
@@ -137,7 +137,8 @@ void vusbDevMapEndpoint(PVUSBDEV pDev, PCVUSBDESCENDPOINTEX pEndPtDesc)
         Log(("vusb: map input pipe on address %u\n", i8Addr));
         pPipe->in = pEndPtDesc;
 
-#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS) || defined(RT_OS_DARWIN)
+        ///@todo: This is currently utterly broken and causes untold damage.
+#if 0 //defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS) || defined(RT_OS_DARWIN)
         /*
          * For high-speed isochronous input endpoints, spin off a read-ahead buffering thread.
          */
diff --git a/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp b/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp
index fd448aa..86fe495 100644
--- a/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp
+++ b/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp
@@ -1183,7 +1183,6 @@ static DECLCALLBACK(int) usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *
         return VERR_VUSB_DEVICE_NAME_NOT_FOUND;
     }
 
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     /*
      * Call the USBLib init to make sure we're a valid VBoxUSB client.
      * For now we'll ignore failures here and just plunge on, it might still work...
@@ -1191,7 +1190,6 @@ static DECLCALLBACK(int) usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *
     vrc = USBLibInit();
     if (RT_FAILURE(vrc))
         LogRel(("USB: USBLibInit failed - %Rrc\n", vrc));
-#endif
 
     /*
      * Create a plugin interface for the device and query its IOUSBDeviceInterface.
@@ -1329,9 +1327,7 @@ static DECLCALLBACK(int) usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *
         vrc = RTErrConvertFromDarwin(irc);
     }
 
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     USBLibTerm();
-#endif
     return vrc;
 }
 
@@ -1378,10 +1374,6 @@ static DECLCALLBACK(void) usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
     }
 
     IOReturn irc = (*pDevOsX->ppDevI)->ResetDevice(pDevOsX->ppDevI);
-#ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-    if (irc == kIOReturnSuccess)
-        irc = (*pDevOsX->ppDevI)->USBDeviceReEnumerate(pDevOsX->ppDevI, 0);
-#endif
 
     irc = (*pDevOsX->ppDevI)->USBDeviceClose(pDevOsX->ppDevI);
     if (irc != kIOReturnSuccess && irc != kIOReturnNoDevice)
@@ -1408,9 +1400,7 @@ static DECLCALLBACK(void) usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
         RTMemFree(pUrbOsX);
     }
 
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     USBLibTerm();
-#endif
     LogFlow(("usbProxyDarwinClose: returns\n"));
 }
 
diff --git a/src/VBox/Devices/build/VBoxDDUDeps.cpp b/src/VBox/Devices/build/VBoxDDUDeps.cpp
index f053e08..10fb35e 100644
--- a/src/VBox/Devices/build/VBoxDDUDeps.cpp
+++ b/src/VBox/Devices/build/VBoxDDUDeps.cpp
@@ -43,8 +43,7 @@ PFNRT g_apfnVBoxDDUDeps[] =
 # ifdef RT_OS_OS2
     (PFNRT)UsbOpen,
 # endif
-# if (defined(RT_OS_DARWIN) && defined(VBOX_WITH_NEW_USB_CODE_ON_DARWIN)) \
-  || defined(RT_OS_SOLARIS) || defined(RT_OS_WINDOWS) /* PORTME */
+# if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS) || defined(RT_OS_WINDOWS) /* PORTME */
     (PFNRT)USBLibInit,
 # endif
 #endif /* VBOX_WITH_USB */
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/mkdemo.pl b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/mkdemo.pl
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localtcp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localtcp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remotetcp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remotetcp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remoteudp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remoteudp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.localtcpstate.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.localtcpstate.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.remotetcpstate.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.remotetcpstate.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_MACRO_UNDEF.invalidargs.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_MACRO_UNDEF.invalidargs.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_LVAL.rdonly.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_LVAL.rdonly.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_WRITE.usepidmacro.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_WRITE.usepidmacro.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.inval.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.inval.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.pid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.pid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.arg0.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.arg0.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.assign.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.assign.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.basic.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.basic.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.egid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.egid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.euid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.euid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.gid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.gid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pgid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pgid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.ppid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.ppid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.projid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.projid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.quite.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.quite.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.sid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.sid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.taskid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.taskid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.trace.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.trace.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.uid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.uid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithChill.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithChill.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithStop.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithStop.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/usdt/tst.corruptenv.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/usdt/tst.corruptenv.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/lib/libdtrace/common/mkerrtags.sh b/src/VBox/ExtPacks/VBoxDTrace/onnv/lib/libdtrace/common/mkerrtags.sh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VNC/VBoxVNC.cpp b/src/VBox/ExtPacks/VNC/VBoxVNC.cpp
index b46a1a1..e042cef 100644
--- a/src/VBox/ExtPacks/VNC/VBoxVNC.cpp
+++ b/src/VBox/ExtPacks/VNC/VBoxVNC.cpp
@@ -103,8 +103,8 @@ private:
     unsigned char *mScreenBuffer;
     unsigned char *mFrameBuffer;
     uint32_t uClients;
-    static DECLCALLBACK(enum rfbNewClientAction) rfbNewClientEvent(rfbClientPtr cl);
-    static DECLCALLBACK(void) vncMouseEvent(int buttonMask, int x, int y, rfbClientPtr cl);
+    static enum rfbNewClientAction rfbNewClientEvent(rfbClientPtr cl);
+    static void vncMouseEvent(int buttonMask, int x, int y, rfbClientPtr cl);
     static void vncKeyboardEvent(rfbBool down, rfbKeySym keySym, rfbClientPtr cl);
     static void clientGoneHook(rfbClientPtr cl);
 
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageDebugVM.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageDebugVM.cpp
index 9f220cd..4168e4e 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageDebugVM.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageDebugVM.cpp
@@ -210,7 +210,13 @@ static RTEXITCODE handleDebugVM_LogXXXX(HandlerArg *pArgs, IMachineDebugger *pDe
         { "--debug",        DEBUGVM_LOG_DEBUG,   RTGETOPT_REQ_NOTHING },
         { "--release",      DEBUGVM_LOG_RELEASE, RTGETOPT_REQ_NOTHING }
     };
-    int rc = RTGetOptInit(&GetState, pArgs->argc, pArgs->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+    int rc = RTGetOptInit(&GetState, pArgs->argc, pArgs->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2,
+                          /*
+                           * Note: RTGETOPTINIT_FLAGS_NO_STD_OPTS is needed to not get into an infinite hang in the following
+                           *       while-loop when processing log groups starting with "h",
+                           *       e.g. "VBoxManage debugvm <VM Name> log --debug -hex".
+                           */
+                          RTGETOPTINIT_FLAGS_OPTS_FIRST | RTGETOPTINIT_FLAGS_NO_STD_OPTS);
     AssertRCReturn(rc, RTEXITCODE_FAILURE);
 
     while ((rc = RTGetOpt(&GetState, &ValueUnion)) != 0)
@@ -524,10 +530,10 @@ static RTEXITCODE handleDebugVM_Show_LogDbgSettings(IMachineDebugger *pDebugger,
         RTPrintf("Debug logger settings:\n");
 
     com::Bstr bstr;
-    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogDbgFlags)(bstr.asOutParam()), RTEXITCODE_FAILURE);
+    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogDbgGroups)(bstr.asOutParam()), RTEXITCODE_FAILURE);
     handleDebugVM_Show_PrintVar("VBOX_LOG", &bstr, fFlags);
 
-    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogDbgGroups)(bstr.asOutParam()), RTEXITCODE_FAILURE);
+    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogDbgFlags)(bstr.asOutParam()), RTEXITCODE_FAILURE);
     handleDebugVM_Show_PrintVar("VBOX_LOG_FLAGS", &bstr, fFlags);
 
     CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogDbgDestinations)(bstr.asOutParam()), RTEXITCODE_FAILURE);
@@ -548,10 +554,10 @@ static RTEXITCODE handleDebugVM_Show_LogRelSettings(IMachineDebugger *pDebugger,
         RTPrintf("Release logger settings:\n");
 
     com::Bstr bstr;
-    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogRelFlags)(bstr.asOutParam()), RTEXITCODE_FAILURE);
+    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogRelGroups)(bstr.asOutParam()), RTEXITCODE_FAILURE);
     handleDebugVM_Show_PrintVar("VBOX_RELEASE_LOG", &bstr, fFlags);
 
-    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogRelGroups)(bstr.asOutParam()), RTEXITCODE_FAILURE);
+    CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogRelFlags)(bstr.asOutParam()), RTEXITCODE_FAILURE);
     handleDebugVM_Show_PrintVar("VBOX_RELEASE_LOG_FLAGS", &bstr, fFlags);
 
     CHECK_ERROR2I_RET(pDebugger, COMGETTER(LogRelDestinations)(bstr.asOutParam()), RTEXITCODE_FAILURE);
diff --git a/src/VBox/Frontends/VirtualBox/Makefile.kmk b/src/VBox/Frontends/VirtualBox/Makefile.kmk
index 314735e..b38c702 100644
--- a/src/VBox/Frontends/VirtualBox/Makefile.kmk
+++ b/src/VBox/Frontends/VirtualBox/Makefile.kmk
@@ -76,8 +76,16 @@ endif
 # Include Qt project file, we'll use FORMS and TRANSLATIONS in
 # the VirtualBox setup below.
 #
+# This is a bit messy.  We boldly ASSUME that LANGUAGE, IMAGES, FORMS
+# and TRANSLATIONS are all unused by kBuild and the host toolchain.
+#
 SAVED_TEMPLATE := $(TEMPLATE)
 include $(PATH_SUB_CURRENT)/VBoxUI.pro
+TEMPLATE       := $(SAVED_TEMPLATE)
+SAVED_TEMPLATE :=
+LANGUAGE       :=
+IMAGES         :=
+# FORMS and TRANSLATIONS are reset further down.
 
 
 #
@@ -1001,6 +1009,13 @@ $$(VirtualBox_0_OUTDIR)/VirtualBox-icon.rc: $(MAKEFILE_CURRENT) $(VBOX_WINDOWS_I
 endif # win
 
 
+#
+# Unset everything that was loaded from VBoxUI.pro.
+#
+FORMS :=
+TRANSLATIONS :=
+
+
 ifeq ($(KBUILD_TARGET),darwin)
 #
 # Create directories for each approved language or the application
@@ -1113,33 +1128,41 @@ if defined(VBOX_WITH_VIDEOHWACCEL)
  endif
 endif
 
+
 #
 # Testcase for the darwin keyboard routines.
 #
 ifdef VBOX_WITH_TESTCASES
-PROGRAMS.darwin += tstDarwinKeyboard
-tstDarwinKeyboard_NAME = tstDarwinKeyboard
-tstDarwinKeyboard_TEMPLATE = VBOXR3TSTEXE
-tstDarwinKeyboard_DEFS.x86 = USE_HID_FOR_MODIFIERS
-tstDarwinKeyboard_INCS = include
-tstDarwinKeyboard_SOURCES = \
-	src/platform/darwin/tstDarwinKeyboard.cpp \
-	src/platform/darwin/DarwinKeyboard.cpp
-tstDarwinKeyboard_SOURCES.amd64 = \
-	src/platform/darwin/CocoaEventHelper.mm
-tstDarwinKeyboard_LDFLAGS = -framework IOKit -framework Carbon -framework AppKit
-tstDarwinKeyboard_LIBS = \
-	$(LIB_RUNTIME)
+ PROGRAMS.darwin += tstDarwinKeyboard
+ tstDarwinKeyboard_TEMPLATE = VBOXR3TSTEXE
+ tstDarwinKeyboard_DEFS.x86 = USE_HID_FOR_MODIFIERS
+ tstDarwinKeyboard_INCS = include
+ tstDarwinKeyboard_SOURCES = \
+ 	src/platform/darwin/tstDarwinKeyboard.cpp \
+ 	src/platform/darwin/DarwinKeyboard.cpp
+ tstDarwinKeyboard_SOURCES.amd64 = \
+ 	src/platform/darwin/CocoaEventHelper.mm
+ tstDarwinKeyboard_LDFLAGS = -framework IOKit -framework Carbon -framework AppKit
+ tstDarwinKeyboard_LIBS = \
+ 	$(LIB_RUNTIME)
 endif
 
 
-# Unset everything that was loaded from VBoxUI.pro.
-TEMPLATE := $(SAVED_TEMPLATE)
-SAVED_TEMPLATE :=
-LANGUAGE :=
-FORMS :=
-TRANSLATIONS :=
-IMAGES :=
+#
+# Testcase for SSL certificate downloading.
+#
+if defined(VBOX_WITH_TESTCASES) && defined(VBOX_GUI_WITH_NETWORK_MANAGER)
+ PROGRAMS += tstSSLCertDownloads
+ tstSSLCertDownloads_TEMPLATE   = VBOXQT4GUIEXE
+ tstSSLCertDownloads_USES       = qt4
+ tstSSLCertDownloads_QTTOOL     = QT4
+ tstSSLCertDownloads_QT_MODULES = Core Gui Network
+ tstSSLCertDownloads_DEFS = VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
+ tstSSLCertDownloads_INCS = \
+ 	$(VBOX_GUI_INC_DIRS)
+ tstSSLCertDownloads_SOURCES = \
+ 	src/net/tstSSLCertDownloads.cpp
+endif
 
 
 #
diff --git a/src/VBox/Frontends/VirtualBox/images/OSE/about.png b/src/VBox/Frontends/VirtualBox/images/OSE/about.png
index a742d38..dcc8256 100644
Binary files a/src/VBox/Frontends/VirtualBox/images/OSE/about.png and b/src/VBox/Frontends/VirtualBox/images/OSE/about.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/OSE/about_hidpi.png b/src/VBox/Frontends/VirtualBox/images/OSE/about_hidpi.png
index b671a28..707ac3d 100644
Binary files a/src/VBox/Frontends/VirtualBox/images/OSE/about_hidpi.png and b/src/VBox/Frontends/VirtualBox/images/OSE/about_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
index 7809c6e..eedd500 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
@@ -67,12 +67,12 @@
         <translation>Преинсталирането на VirtualBox може да помогне.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Тази грешка означава, че драйверът на ядрото не може да задели достатъчно памет или че някоя адресираща операция е неуспешна.<br/><br/>Има известни проблеми с Linux 2.6.29. Ако сте с такова ядро, моля, редактирайте файла /usr/src/vboxdrv-*/Makefile и задайте <i>VBOX_USE_INSERT_PAGE = 1</i>. След това прекомпилирайте модула на ядрото като изпълните<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup&apo [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Тази грешка означава, че драйверът на ядрото не може да задели достатъчно памет или че някоя адресираща операция е неуспешна.<br/><br/>Има известни проблеми с Linux 2.6.29. Ако сте с такова ядро, моля, редактирайте файла /usr/src/vboxdrv-*/Makefile и задайте <i>VBOX_USE_INSERT_PAGE = 1</i>. След това прекомпилирайте модула на ядрото като изпълните<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'&l [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Драйверът за Linux ядрото на VirtualBox (vboxdrv) не е зареден или има проблем с правата на /dev/vboxdrv. Пренастройте модула на ядрото като изпълните<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>с root права. Потребителите с Ubuntu, Fedora или Mandriva трябва първо да инсталират пакета DKMS. Този пакет следи за промени в Linux ядрото и прекомпилира модула vboxdrv, ако е необходи [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Драйверът за Linux ядрото на VirtualBox (vboxdrv) не е зареден или има проблем с правата на /dev/vboxdrv. Пренастройте модула на ядрото като изпълните<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>с root права. Потребителите с Ubuntu, Fedora или Mandriva трябва първо да инсталират пакета DKMS. Този пакет следи за промени в Linux ядрото и прекомпилира модула vboxdrv, ако е необходимо.< [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -99,16 +99,16 @@
         <translation>Модулите за ядрото на VirtualBox са несъвместими с тази версия на VirtualBox. Изглежда, че инсталацията на VirtualBox е неуспешна. Може да помогне пълно деинсталиране и преинсталиране на VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Модулите за ядрото на VirtualBox са несъвместими с тази версия на VirtualBox. Изглежда, че инсталацията на VirtualBox е неуспешна. Изпълнението на<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>може да реши проблема. Уверете се, че не смесвате OSE версията с PUEL версията на VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Модулите за ядрото на VirtualBox са несъвместими с тази версия на VirtualBox. Изглежда, че инсталацията на VirtualBox е неуспешна. Изпълнението на<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>може да реши проблема. Уверете се, че не смесвате OSE версията с PUEL версията на VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Тази грешка означава, че драйверът на ядрото не може да задели достатъчно памет или че някоя адресираща операция е неуспешна.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Драйверът на VirtualBox за Linux ядрото (vboxdrv) или не е зареден, или има проблем с правата на /dev/vboxdrv. Моля, преинсталирайте модула на ядрото, като изпълните<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>като root. Ако е наличен във вашата дистрибуция, първо трябва да инсталирате DKMS пакета. Този пакет следи за промени в ядрото и прекомпилира модула vboxdrv, ако е необходимо.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Драйверът на VirtualBox за Linux ядрото (vboxdrv) или не е зареден, или има проблем с правата на /dev/vboxdrv. Моля, преинсталирайте модула на ядрото, като изпълните<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>като root. Ако е наличен във вашата дистрибуция, първо трябва да инсталирате DKMS пакета. Този пакет следи за промени в ядрото и прекомпилира модула vboxdrv, ако е необходимо.</translation>
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
index 342f370..55df721 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
@@ -88,12 +88,12 @@
 <context>
     <name>QApplication</name>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Aquest error significa que el controlador del nucli no ha pogut assignar memòria suficient o bé alguna operació de mapejat ha fallat.<br/><br/>Existeixen alguns problemes coneguts amb el nucli Linux 2.6.29. Si esteu executant aquest nucli, editeu el fitxer /usr/src/vboxdrv-*/Makefile i habiliteu <i>VBOX_USE_INSERT_PAGE = 1</i>. Després d'això, torneu a compilar el mòdul executant com a root a una terminal l'ordre < [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Aquest error significa que el controlador del nucli no ha pogut assignar memòria suficient o bé alguna operació de mapejat ha fallat.<br/><br/>Existeixen alguns problemes coneguts amb el nucli Linux 2.6.29. Si esteu executant aquest nucli, editeu el fitxer /usr/src/vboxdrv-*/Makefile i habiliteu <i>VBOX_USE_INSERT_PAGE = 1</i>. Després d'això, torneu a compilar el mòdul executant com a root a una terminal l'ordre < [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">El controlador del nucli del VirtualBox (vboxdrv) no s'ha carregat o existeix un problema de permisos amb /dev/vboxdrv. Torneu a configurar el mòdul del nucli executant com a root a una terminal <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Usuaris d'Ubuntu, Fedora o Mandriva haurien d'instal·lar abans el paquet DKMS. Aquest paquet manté actiu el mòdul quan hi ha [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">El controlador del nucli del VirtualBox (vboxdrv) no s'ha carregat o existeix un problema de permisos amb /dev/vboxdrv. Torneu a configurar el mòdul del nucli executant com a root a una terminal <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Usuaris d'Ubuntu, Fedora o Mandriva haurien d'instal·lar abans el paquet DKMS. Aquest paquet manté actiu el mòdul quan hi ha can [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -140,16 +140,16 @@
         <translation>Els mòduls del nucli del VirtualBox no coincideixen amb aquesta versió del VirtualBox. La instal·lació no s'ha completat. Proveu desinstal·lant i tornant a instal·lar el VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Els mòduls del nucli del VirtualBox no coincideixen amb aquesta versió del VirtualBox. La instal·lació no s'ha completat. Proveu a executar<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> per resoldre el problema. Assegureu-vos que no barrejeu la versió OSE (lliure) amb la versió completa dle VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Els mòduls del nucli del VirtualBox no coincideixen amb aquesta versió del VirtualBox. La instal·lació no s'ha completat. Proveu a executar<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> per resoldre el problema. Assegureu-vos que no barrejeu la versió OSE (lliure) amb la versió completa dle VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Aquest error pot ser degut al fet que el nucli no ha pogut assignar memòria suficient o bé que alguna operació de mapatge ha fallat.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>El mòdul del nucli del VirtualBox (vboxdrv) no s'ha carregat o bé existeix un problema de permisos amb /dev/vboxdrv. Torneu a instal·lar el mòdul del nucli executant<br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> com a root. Si està disponible a la vostra distribució, hauríeu d'instal·lar primer el paquet DKMS. Aquest paquet fa seguiment dels canvis del nucli  i torna a compilar el mòdul  [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>El mòdul del nucli del VirtualBox (vboxdrv) no s'ha carregat o bé existeix un problema de permisos amb /dev/vboxdrv. Torneu a instal·lar el mòdul del nucli executant<br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> com a root. Si està disponible a la vostra distribució, hauríeu d'instal·lar primer el paquet DKMS. Aquest paquet fa seguiment dels canvis del nucli  i torna a compilar el mòdul vbox [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
index e8c2c04..b973d81 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
@@ -93,12 +93,12 @@
 <context>
     <name>QApplication</name>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Este error significa que el controlador del nucli no ha pogut assignar memòria suficient o bé alguna operació de mapejat ha fallat.<br/><br/>Existeixen alguns problemes coneguts amb el nucli Linux 2.6.29. Si esteu executant este nucli, editeu el fitxer /usr/src/vboxdrv-*/Makefile i habiliteu <i>VBOX_USE_INSERT_PAGE = 1</i>. Després d'això, torneu a compilar el mòdul executant com a root a una terminal l'orde <br/&g [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Este error significa que el controlador del nucli no ha pogut assignar memòria suficient o bé alguna operació de mapejat ha fallat.<br/><br/>Existeixen alguns problemes coneguts amb el nucli Linux 2.6.29. Si esteu executant este nucli, editeu el fitxer /usr/src/vboxdrv-*/Makefile i habiliteu <i>VBOX_USE_INSERT_PAGE = 1</i>. Després d'això, torneu a compilar el mòdul executant com a root a una terminal l'orde <br/&g [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">El controlador del nucli del VirtualBox (vboxdrv) no s'ha carregat o existeix un problema de permisos amb /dev/vboxdrv. Torneu a configurar el mòdul del nucli executant com a root a una terminal <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Usuaris d'Ubuntu, Fedora o Mandriva haurien d'instal·lar abans el paquet DKMS. Este paquet manté actiu el mòdul quan hi ha c [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">El controlador del nucli del VirtualBox (vboxdrv) no s'ha carregat o existeix un problema de permisos amb /dev/vboxdrv. Torneu a configurar el mòdul del nucli executant com a root a una terminal <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Usuaris d'Ubuntu, Fedora o Mandriva haurien d'instal·lar abans el paquet DKMS. Este paquet manté actiu el mòdul quan hi ha canvi [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -145,16 +145,16 @@
         <translation>Els mòduls del nucli del VirtualBox no coincideixen amb esta versió del VirtualBox. La instal·lació no s'ha completat. Proveu desinstal·lant i tornant a instal·lar el VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Els mòduls del nucli del VirtualBox no coincideixen amb esta versió del VirtualBox. La instal·lació no s'ha completat. Proveu a executar<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> per resoldre el problema. Assegureu-vos que no barrejeu la versió OSE (lliure) amb la versió completa dle VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Els mòduls del nucli del VirtualBox no coincideixen amb esta versió del VirtualBox. La instal·lació no s'ha completat. Proveu a executar<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> per resoldre el problema. Assegureu-vos que no barrejeu la versió OSE (lliure) amb la versió completa dle VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Este error pot ser degut al fet que el nucli no ha pogut assignar memòria suficient o bé que alguna operació de mapatge ha fallat.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>El mòdul del nucli del VirtualBox (vboxdrv) no s'ha carregat o bé existeix un problema de permisos amb /dev/vboxdrv. Torneu a instal·lar el mòdul del nucli executant<br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> com a root. Si està disponible a la vostra distribució, hauríeu d'instal·lar primer el paquet DKMS. Este paquet fa seguiment dels canvis del nucli  i torna a compilar el mòdul vb [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>El mòdul del nucli del VirtualBox (vboxdrv) no s'ha carregat o bé existeix un problema de permisos amb /dev/vboxdrv. Torneu a instal·lar el mòdul del nucli executant<br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> com a root. Si està disponible a la vostra distribució, hauríeu d'instal·lar primer el paquet DKMS. Este paquet fa seguiment dels canvis del nucli  i torna a compilar el mòdul vboxdr [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
index 4b552b2..2908afd 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
@@ -88,12 +88,12 @@
 <context>
     <name>QApplication</name>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Tato chyba znamená, že ovladač jádra buď nebyl schopen alokovat dostatek paměti nebo selhala operace mapování paměti.<br/><br/>V jádře 2.6.29 jsou tyto problémy známé. Pokud máte jádro této verze, prosím upravte soubor /usr/src/vboxdrv-*/Makefile a povolte <i>VBOX_USE_INSERT_PAGE = 1</i>. Po editaci překompilujte modul jádra zadáním příkazu <br/><br/>  <font color="blue">'/etc/init.d/vboxdrv set [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Tato chyba znamená, že ovladač jádra buď nebyl schopen alokovat dostatek paměti nebo selhala operace mapování paměti.<br/><br/>V jádře 2.6.29 jsou tyto problémy známé. Pokud máte jádro této verze, prosím upravte soubor /usr/src/vboxdrv-*/Makefile a povolte <i>VBOX_USE_INSERT_PAGE = 1</i>. Po editaci překompilujte modul jádra zadáním příkazu <br/><br/>  <font color="blue">'/sbin/rcvboxdrv setup&a [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Ovladač jádra pro VirtualBox (vboxdrv) není buď zaveden, nebo je problém s přístupem na zařízení /dev/vboxdrv. Spusťte znovu modul jádra zadáním příkazu <br/><br/>  <font color="blue">'/etc/init.d/vboxdrv setup'</font><br/><br/> jako uživatel root. Uživatelé distribucí Ubuntu, Fedora nebo Mandriva by měli nainstalovat balíček DKMS. Ten udržuje všechny změny v jádře Linuxu a pokud je potřeba prove [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Ovladač jádra pro VirtualBox (vboxdrv) není buď zaveden, nebo je problém s přístupem na zařízení /dev/vboxdrv. Spusťte znovu modul jádra zadáním příkazu <br/><br/>  <font color="blue">'/sbin/rcvboxdrv setup'</font><br/><br/> jako uživatel root. Uživatelé distribucí Ubuntu, Fedora nebo Mandriva by měli nainstalovat balíček DKMS. Ten udržuje všechny změny v jádře Linuxu a pokud je potřeba provede r [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -140,16 +140,16 @@
         <translation>Modul jádra pro VirtualBox není shodný s verzí aplikace VirtualBox. Pravděpodobně nebyla úspěšně dokončena instalace VirtualBoxu. Většinou pomůže kompletně vše odinstalovat a nainstalovat znovu.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Modul jádra pro VirtualBox není shodný s verzí aplikace VirtualBox. Pravděpodobně nebyla úspěšně dokončena instalace VirtualBoxu. Spuštěním příkazu<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>můžete problém vyřešit. Ujistěte se, že nepoužíváte současně OSE a PUEL verzi aplikace Virtualbox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Modul jádra pro VirtualBox není shodný s verzí aplikace VirtualBox. Pravděpodobně nebyla úspěšně dokončena instalace VirtualBoxu. Spuštěním příkazu<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>můžete problém vyřešit. Ujistěte se, že nepoužíváte současně OSE a PUEL verzi aplikace Virtualbox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Tato chyba znamená, že ovladač jádra nebyl schopen alokovat dostatek paměti nebo selhala operace mapování.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Ovladač jádra pro VirtualBox (vboxdrv) není buď zaveden, nebo je problém s přístupem na zařízení /dev/vboxdrv. Spusťte znovu modul jádra zadáním příkazu <br/><br/>  <font color="blue">'/etc/init.d/vboxdrv setup'</font><br/><br/> jako uživatel root. Uživatelé distribucí Ubuntu, Fedora nebo Mandriva by měli nainstalovat balíček DKMS. Ten udržuje všechny změny v jádře Linuxu a pokud je potřeba provede rekompilaci m [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Ovladač jádra pro VirtualBox (vboxdrv) není buď zaveden, nebo je problém s přístupem na zařízení /dev/vboxdrv. Spusťte znovu modul jádra zadáním příkazu <br/><br/>  <font color="blue">'/sbin/rcvboxdrv setup'</font><br/><br/> jako uživatel root. Uživatelé distribucí Ubuntu, Fedora nebo Mandriva by měli nainstalovat balíček DKMS. Ten udržuje všechny změny v jádře Linuxu a pokud je potřeba provede rekompilaci modul [...]
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
index 55b49c4..1ac2bb9 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
@@ -70,12 +70,12 @@
         <translation>Du bør geninstallere VirtualBox.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Denne fejl skyldes enten at kernemodulet ikke kunne allokere hukommelse nok eller at en adresseoversættelse fejlede.<br/><br/>Der er kendte problemer med Linux 2.6.29. Hvis du bruger denne kerneudgave, så tilret /usr/src/vboxdrv-*/Makefile og sæt <i>VBOX_USE_INSERT_PAGE = 1</i>. Rekompilér derefter kernemodulet ved at køre<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/&gt [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Denne fejl skyldes enten at kernemodulet ikke kunne allokere hukommelse nok eller at en adresseoversættelse fejlede.<br/><br/>Der er kendte problemer med Linux 2.6.29. Hvis du bruger denne kerneudgave, så tilret /usr/src/vboxdrv-*/Makefile og sæt <i>VBOX_USE_INSERT_PAGE = 1</i>. Rekompilér derefter kernemodulet ved at køre<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/>&lt [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">VirtualBox' Linux kernemodul (vboxdrv) er enten ikke indlæst eller der er et problem med rettighederne på /dev/vboxdrv. Geninstaller kernemodulet ved at køre<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>som root. Brugere af Ubuntu, Fedora eller Mandriva bør installere DKMS pakken først. Denne pakke holder styr på Linux kerneændringer og rekompilerer vboxdrv kernemodulet om n [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">VirtualBox' Linux kernemodul (vboxdrv) er enten ikke indlæst eller der er et problem med rettighederne på /dev/vboxdrv. Geninstaller kernemodulet ved at køre<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>som root. Brugere af Ubuntu, Fedora eller Mandriva bør installere DKMS pakken først. Denne pakke holder styr på Linux kerneændringer og rekompilerer vboxdrv kernemodulet om nødve [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -102,16 +102,16 @@
         <translation>De indlæste kernemoduler passer ikke til denne version af VirtualBox. Installationen af VirtualBox er tilsyneladende ikke gået godt. Du bør afinstallere VirtualBox fuldstændigt og geninstallere.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>De indlæste kernemoduler passer ikke til denne version af VirtualBox. Installationen af VirtualBox er tilsyneladende ikke gået godt. Kør<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> for at afhjælpe problemet. Undgå at blande OSE og PUEL versionerne af VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>De indlæste kernemoduler passer ikke til denne version af VirtualBox. Installationen af VirtualBox er tilsyneladende ikke gået godt. Kør<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> for at afhjælpe problemet. Undgå at blande OSE og PUEL versionerne af VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Denne fejl skyldes enten at kernemodulet ikke kunne allokere hukommelse nok eller at en adresseoversættelse fejlede.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>VirtualBox' Linux kernemodul (vboxdrv) er enten ikke indlæst eller der er et problem med rettighederne på /dev/vboxdrv. Geninstaller kernemodulet ved at køre<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>som root. Hvis din distribution understøtter det, bør du installere DKMS pakken først. Denne pakke holder styr på ændringer i Linux-kernen og rekompilerer vboxdrv kernemodulet om nødvendigt. [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>VirtualBox' Linux kernemodul (vboxdrv) er enten ikke indlæst eller der er et problem med rettighederne på /dev/vboxdrv. Geninstaller kernemodulet ved at køre<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>som root. Hvis din distribution understøtter det, bør du installere DKMS pakken først. Denne pakke holder styr på ændringer i Linux-kernen og rekompilerer vboxdrv kernemodulet om nødvendigt.</tr [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
index 8a6113d..c8e733b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
@@ -76,16 +76,16 @@
         <translation>Die VirtualBox-Kernmodule passen nicht zu dieser Version von VirtualBox. Es wird empfohlen, VirtualBox komplett neu zu installieren.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Die VirtualBox-Kernmodule passen nicht zu dieser Version von VirtualBox. Die Installation von VirtualBox war möglicherweise nicht vollständig. Durch Ausführen von <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> sollte dieses Problem behoben werden. Bitte stellen Sie sicher, dass Sie die OSE-Version von VirtualBox nicht mit der PUEL-Version mischen.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Die VirtualBox-Kernmodule passen nicht zu dieser Version von VirtualBox. Die Installation von VirtualBox war möglicherweise nicht vollständig. Durch Ausführen von <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> sollte dieses Problem behoben werden. Bitte stellen Sie sicher, dass Sie die OSE-Version von VirtualBox nicht mit der PUEL-Version mischen.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Diese Fehlermeldung bedeutet, dass der Kerntreiber entweder nicht ausreichend Speicher anfordern konnte oder dass eine Mapping-Operation fehlgeschlagen ist.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Der VirtualBox Kerntreiber für Linux (vboxdrv) ist entweder nicht geladen oder auf das Gerät /dev/vboxdrv konnte nicht zugegriffen werden. Richten Sie das Kernmodul neu ein, indem Sie<br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>mit Root-Rechten ausführen. Falls Sie eine Linux-Distribution von Ubuntu, Fedora oder Mandriva verweden, sollten Sie das Paket DKMS zuerst installieren. Dieses compiliert  [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Der VirtualBox Kerntreiber für Linux (vboxdrv) ist entweder nicht geladen oder auf das Gerät /dev/vboxdrv konnte nicht zugegriffen werden. Richten Sie das Kernmodul neu ein, indem Sie<br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>mit Root-Rechten ausführen. Falls Sie eine Linux-Distribution von Ubuntu, Fedora oder Mandriva verweden, sollten Sie das Paket DKMS zuerst installieren. Dieses compiliert die  [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
index 9589afd..c0fe8aa 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
@@ -96,12 +96,12 @@
 <context>
     <name>QApplication</name>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">El controlador del kernel no pudo asignar suficiente memoria o alguna operación de mapeo falló.<br/><br/>Existen problemas con el kernel Linux 2.6.29. Si usa dicha versión de kernel, edite /usr/src/vboxdrv-*/Makefile y habilite <i>VBOX_USE_INSERT_PAGE = 1</i>. Después, recompile el módulo del kernel ejecutando<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>  [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">El controlador del kernel no pudo asignar suficiente memoria o alguna operación de mapeo falló.<br/><br/>Existen problemas con el kernel Linux 2.6.29. Si usa dicha versión de kernel, edite /usr/src/vboxdrv-*/Makefile y habilite <i>VBOX_USE_INSERT_PAGE = 1</i>. Después, recompile el módulo del kernel ejecutando<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> como [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">El controlador de VirtualBox del kernel Linux (vboxdrv) no se encuentra cargado o existe un problema de permisos con /dev/vboxdrv. Reconfigure el módulo del kernel ejecuntando <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> como usuario root. Los usuarios de Ubuntu, Fedora o Mandriva deberían instalar el paquete DKMS primero. Este paquete monitoriza los cambios en el kernel y reco [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">El controlador de VirtualBox del kernel Linux (vboxdrv) no se encuentra cargado o existe un problema de permisos con /dev/vboxdrv. Reconfigure el módulo del kernel ejecuntando <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> como usuario root. Los usuarios de Ubuntu, Fedora o Mandriva deberían instalar el paquete DKMS primero. Este paquete monitoriza los cambios en el kernel y recompil [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -148,16 +148,16 @@
         <translation>Los módulos del kernel de VirtualBox no son compatibles con esta versión de VirtualBox. La instalación de VirtualBox aparentemente no fue correcta. Desinstalar completamente y reinstalar de nuevo VirtualBox podría solucionar el problema.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Los módulos del kernel de VirtualBox no son compatibles con esta versión de VirtualBox. La instalación de VirtualBox aparentemente no fue correcta. Ejecutar <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> podría solucionar el problema. Asegúrese de no mezclar la versión OSE y la versión PUEL de VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Los módulos del kernel de VirtualBox no son compatibles con esta versión de VirtualBox. La instalación de VirtualBox aparentemente no fue correcta. Ejecutar <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> podría solucionar el problema. Asegúrese de no mezclar la versión OSE y la versión PUEL de VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Este error significa que el controlador del kernel no fue capaz de reservar suficiente memoria o que alguna operación de asignación falló.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>El controlador del núcleo de Linux (vboxdrv) no está cargado o hay un problema de permisos con /dev/vboxdrv. Reinstale el módulo del núcleo ejecutando<br/><br/>  <font color=blue>«/etc/init.d/vboxdrv setup»</font><br/><br/> como root. Si está disponible en su distribución, debería instalar primero el paquete DKMS. Este paquete monitoriza los cambios del núcleo de Linux y recompila el módulo del núcleo si es necesario.    </translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>El controlador del núcleo de Linux (vboxdrv) no está cargado o hay un problema de permisos con /dev/vboxdrv. Reinstale el módulo del núcleo ejecutando<br/><br/>  <font color=blue>«/sbin/rcvboxdrv setup»</font><br/><br/> como root. Si está disponible en su distribución, debería instalar primero el paquete DKMS. Este paquete monitoriza los cambios del núcleo de Linux y recompila el módulo del núcleo si es necesario.    </translation>
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
index 1cb156a..afa6a2d 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
@@ -93,8 +93,8 @@
     </message>
     <message>
         <location line="+7"/>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>VirtualBox kernel moduloak ez datoz bat VirtualBox bertsio honekin. VirtualBox-en ezarpena dirudienez ez da ongi egin. <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> exekutatzeak hau zuzendu dezake. Zihurtatu ez dituzula VirtualBox-en OSE bertsioa eta PUEL bertsioa nahastu.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>VirtualBox kernel moduloak ez datoz bat VirtualBox bertsio honekin. VirtualBox-en ezarpena dirudienez ez da ongi egin. <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> exekutatzeak hau zuzendu dezake. Zihurtatu ez dituzula VirtualBox-en OSE bertsioa eta PUEL bertsioa nahastu.</translation>
     </message>
     <message>
         <location line="-22"/>
@@ -103,8 +103,8 @@
     </message>
     <message>
         <location line="+5"/>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>VirtualBox Linux kernel gidatzailea (vboxdrv) ez dago gertatuta edo baimen arazo bat dago /dev/vboxdrv-rekin. Mesedez ber-ezarri kernel moduloa <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>exekutatuz erro bezala. Zure banaketan eskuragarri badago, lehenik DKMS paketea ezarri behar duzu. Pakete honek Linux kernelaren aldaketak aztarnatzen ditu eta vboxdrv kernel moduloa berbiltzen du beharrezkoa [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>VirtualBox Linux kernel gidatzailea (vboxdrv) ez dago gertatuta edo baimen arazo bat dago /dev/vboxdrv-rekin. Mesedez ber-ezarri kernel moduloa <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>exekutatuz erro bezala. Zure banaketan eskuragarri badago, lehenik DKMS paketea ezarri behar duzu. Pakete honek Linux kernelaren aldaketak aztarnatzen ditu eta vboxdrv kernel moduloa berbiltzen du beharrezkoa bad [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
index 1148114..b8e07a7 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
@@ -76,16 +76,16 @@
         <translation>مدل هسته ويرچوال باکس با این نسخه از مدل هسته ويرچوال باکس تطبیق ندارد. نصب ويرچوال باکس ظاهرا موفقیت آمیز نبوده است. لطفا برنامه را کاملا حذف کرده و مجددا نصب نمایید.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>مدل هسته ويرچوال باکس با این نسخه از ويرچوال باکس تطبیق ندارد. نصب ويرچوال باکس ظاهرا موفقیت آمیز نبوده است. اِجرای راه انداز<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>شاید این را درست کند. مطمئن شوید شما نسخه اُ اِس ای و نسخه پی یو ای اِل ویرچوال باکس را میکس نکرده باشید.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>مدل هسته ويرچوال باکس با این نسخه از ويرچوال باکس تطبیق ندارد. نصب ويرچوال باکس ظاهرا موفقیت آمیز نبوده است. اِجرای راه انداز<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>شاید این را درست کند. مطمئن شوید شما نسخه اُ اِس ای و نسخه پی یو ای اِل ویرچوال باکس را میکس نکرده باشید.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>این خطا این معنی را دارد که هسته درایو قادر به اختصاص حافظه کافی نیست یا برخی از عملکردهای مسیردهی موفق نشده است.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>درایور هسته لینوکس ويرچوال باکس (vboxdrv) بارگیری نشده است یا مشکلی با سطح دسترسی /dev/vboxdrv دارد. لطفا مدل هسته را با اِجرای راه انداز<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>بعنوان ریشه مجددا نصب نمایید. اگر آن در توزیع شما موجود باشد، شما اول باید بسته دی کی اِم اِس را نصب کنید. این بسته تغییرات هسته لینوکس را ردگیری و ذخیره میکند و مدل هسته  vboxdrv در صورت نیاز مجددا کامپایل میکند.</ [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>درایور هسته لینوکس ويرچوال باکس (vboxdrv) بارگیری نشده است یا مشکلی با سطح دسترسی /dev/vboxdrv دارد. لطفا مدل هسته را با اِجرای راه انداز<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>بعنوان ریشه مجددا نصب نمایید. اگر آن در توزیع شما موجود باشد، شما اول باید بسته دی کی اِم اِس را نصب کنید. این بسته تغییرات هسته لینوکس را ردگیری و ذخیره میکند و مدل هسته  vboxdrv در صورت نیاز مجددا کامپایل میکند.</tran [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
index d05e4ac..841e11b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
@@ -77,12 +77,12 @@
 <context>
     <name>QApplication</name>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Tämä virhe tarkoittaa, että ytimen ajuri ei voinut varata tarpeeksi muistia  tai että joku muistin kartoitustoiminto epäonnistui.<br/><br/>Ydintä 2.6.29 käytettäessä on tunnettuja käyttöongelmia. Jos käytät tätä ydintä,  muokkaa tiedostoja /usr/src/vboxdrv-*/Makefile ja aseta arvo <i>VBOX_USE_INSERT_PAGE = 1</i>. Tämän jälkeen sinun täytyy kääntää ytimen moduli uudestaan komennolla <br/><br/>  <font color=blue&gt [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Tämä virhe tarkoittaa, että ytimen ajuri ei voinut varata tarpeeksi muistia  tai että joku muistin kartoitustoiminto epäonnistui.<br/><br/>Ydintä 2.6.29 käytettäessä on tunnettuja käyttöongelmia. Jos käytät tätä ydintä,  muokkaa tiedostoja /usr/src/vboxdrv-*/Makefile ja aseta arvo <i>VBOX_USE_INSERT_PAGE = 1</i>. Tämän jälkeen sinun täytyy kääntää ytimen moduli uudestaan komennolla <br/><br/>  <font color=blue&gt [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">VirtualBoxin Linux-ytimen ajuri (vboxdrv) ei ole joko ladattu tai laitetiedoston /dev/vboxdrv oikeudet ovat väärin. Määrittele ytimen moduulin asetukset uudestaan root-käyttäjänä komennolla <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Ubuntun, fedoran ja mandrivan käyttäjien tulisi ensin asentaa paketti dkms. Tämä paketti pitää kirjaa ytimen muutoksista ja kääntää moduulit autom [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">VirtualBoxin Linux-ytimen ajuri (vboxdrv) ei ole joko ladattu tai laitetiedoston /dev/vboxdrv oikeudet ovat väärin. Määrittele ytimen moduulin asetukset uudestaan root-käyttäjänä komennolla <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Ubuntun, fedoran ja mandrivan käyttäjien tulisi ensin asentaa paketti dkms. Tämä paketti pitää kirjaa ytimen muutoksista ja kääntää moduulit automaatt [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -129,7 +129,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -137,7 +137,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
index 461a7c2..304350f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
@@ -52,8 +52,8 @@
         <translation>Essayez de réinstaller VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Soit le pilote noyau Linux de VirtualBox (vboxdrv) n'est pas en mémoire, soit il y a un problème de permissions avec /dev/vboxdrv. Veuillez réinitialiser le module noyau en exécutant en tant qu'administrateur <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Les utilisateurs des distributions Ubuntu, Fedora et Mandriva devraient installer le paquet DKMS au préalable. Ce paq [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Soit le pilote noyau Linux de VirtualBox (vboxdrv) n'est pas en mémoire, soit il y a un problème de permissions avec /dev/vboxdrv. Veuillez réinitialiser le module noyau en exécutant en tant qu'administrateur <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Les utilisateurs des distributions Ubuntu, Fedora et Mandriva devraient installer le paquet DKMS au préalable. Ce paquet  [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -80,16 +80,16 @@
         <translation>Les modules noyaux VirtualBox ne correspondent pas à la version installée de VirtualBox. L'installation ne paraît pas correcte. Nous vous conseillons de désinstaller complètement VirtualBox et de le réinstaller.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Les modules noyaux VirtualBox ne correspondent pas à la version installée de VirtualBox. L'installation ne paraît pas correcte. Exécuter <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> pourrait résoudre le problème. Faites attention à ne pas mélanger les versions OSE et PUEL de VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Les modules noyaux VirtualBox ne correspondent pas à la version installée de VirtualBox. L'installation ne paraît pas correcte. Exécuter <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> pourrait résoudre le problème. Faites attention à ne pas mélanger les versions OSE et PUEL de VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Cette erreur signifie que le module noyau n'a pas pu allouer suffisamment de mémoire, ou bien qu'une opération de translation a échoué.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Le pilote du noyau Linux de VirtualBox (vboxdrv) n'est soit pas chargé ou il y a un problème de permission sur /dev/vboxdrv. Veuillez réinstaller le module noyau en éxécutant<br><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> en tant qu'administrateur. S'il n'est pas disponible pour votre distribution, vous devriez installer d'abord le paquet DKMS. Ce paquet garde la trace des [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Le pilote du noyau Linux de VirtualBox (vboxdrv) n'est soit pas chargé ou il y a un problème de permission sur /dev/vboxdrv. Veuillez réinstaller le module noyau en éxécutant<br><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> en tant qu'administrateur. S'il n'est pas disponible pour votre distribution, vous devriez installer d'abord le paquet DKMS. Ce paquet garde la trace des cha [...]
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
@@ -7349,7 +7349,7 @@
     <message>
         <source>VirtualBox - Critical Error</source>
         <comment>msg box title</comment>
-        <translation>VirtialBox - Erreur critique</translation>
+        <translation>VirtualBox - Erreur critique</translation>
     </message>
     <message>
         <source>Do not show this message again</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
index b7e2a86..506e257 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
@@ -67,12 +67,12 @@
         <translation>Unha solución podería ser a reinstalación do VirtualBox.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Este erro significa que ao controlador do núcleo lle foi imposíbel asignar a memoria suficiente ou que fallou algunha operación de mapeo.<br/><br/>Existen algúns problemas coa versión do núcleo de Linux 2.6.29. Se está empregando este núcleo edite /usr/src/vboxdrv-*/Makefile e active <i>VBOX_USE_INSERT_PAGE = 1</i>. A continuación, recompile o módulo do núcleo executando<br/><br/>  <font color=blue>'/etc/ [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Este erro significa que ao controlador do núcleo lle foi imposíbel asignar a memoria suficiente ou que fallou algunha operación de mapeo.<br/><br/>Existen algúns problemas coa versión do núcleo de Linux 2.6.29. Se está empregando este núcleo edite /usr/src/vboxdrv-*/Makefile e active <i>VBOX_USE_INSERT_PAGE = 1</i>. A continuación, recompile o módulo do núcleo executando<br/><br/>  <font color=blue>'/sbin [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">O controlador do núcleo Linux de VirtualBox (vboxdrv) non está cargado ou existe un problema cos permisos de /dev/vboxdrv. Reconfigura o módulo do núcleo executando<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>como usuario root. Usuarios de Ubuntu, Fedora ou Mandriva deberían instalar primeiro o paquete DKMS. Este paquete vixía os cambios do núcleo Linux e recompila o módulo do n [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">O controlador do núcleo Linux de VirtualBox (vboxdrv) non está cargado ou existe un problema cos permisos de /dev/vboxdrv. Reconfigura o módulo do núcleo executando<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>como usuario root. Usuarios de Ubuntu, Fedora ou Mandriva deberían instalar primeiro o paquete DKMS. Este paquete vixía os cambios do núcleo Linux e recompila o módulo do núcle [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -99,15 +99,15 @@
         <translation>Os módulos de VirtualBox do núcleo non se axustan a esta versión de VirtualBox. Polo visto a instalación de Virtualbox non foi correcta. Unha solución podería ser desinstalar completamente VirtualBox e a súa reinstalación.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Os módulos de VirtualBox do núcleo non se axustan a esta versión de VirtualBox. Polo visto a instalación de Virtualbox non foi correcta. Ao executar<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>debería arranxarse este problema. Asegúrese de que non mestura a versión OSE e a versión PUEL de VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Os módulos de VirtualBox do núcleo non se axustan a esta versión de VirtualBox. Polo visto a instalación de Virtualbox non foi correcta. Ao executar<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>debería arranxarse este problema. Asegúrese de que non mestura a versión OSE e a versión PUEL de VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
index eee725d..82200ff 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
@@ -108,12 +108,12 @@
         <translation>Talán újra kellene telepítened a VirtualBoxot.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Ez a hiba azt jelenti,hogy a kernel driver nem tud elegendő memóriát foglalni, vagy valamilyen foglalási művelet nem sikerült.<br/><br/> Ez ismert probléma a Linux kernel 2.6.29-es verziójával. Ha ilyen, vagy újabb kernelt futtatsz, a /usr/src/vboxdrv-*/Makefile fájlban engedélyezni kell a <i>VBOX_USE_INSERT_PAGE = 1</i> beállítást. Ezután a kernel modul újrafordítását a <br/><br/>  <font color=blue>'/etc [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Ez a hiba azt jelenti,hogy a kernel driver nem tud elegendő memóriát foglalni, vagy valamilyen foglalási művelet nem sikerült.<br/><br/> Ez ismert probléma a Linux kernel 2.6.29-es verziójával. Ha ilyen, vagy újabb kernelt futtatsz, a /usr/src/vboxdrv-*/Makefile fájlban engedélyezni kell a <i>VBOX_USE_INSERT_PAGE = 1</i> beállítást. Ezután a kernel modul újrafordítását a <br/><br/>  <font color=blue>'/sbi [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">A VirtualBox Linux kernel modulja (vboxdrv) nincs betöltve, vagy jogosultsági problémák léptek fel a /dev/vboxdrv eszközfájlon. Próbáld meg a <font color=blue>'/etc/init.d/vboxdrv setup'</font> futtatásával újrakonfigurálni a kernelmodult root-ként. Ubuntu, Dedora és Mandriva felhasználóknak előbb a DKMS csomagot érdemes feltelepíteniük. Ez a csomag követi a Linux kernel változásait, és újrafordítja a modulokat, ha szükséges. </t [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">A VirtualBox Linux kernel modulja (vboxdrv) nincs betöltve, vagy jogosultsági problémák léptek fel a /dev/vboxdrv eszközfájlon. Próbáld meg a <font color=blue>'/sbin/rcvboxdrv setup'</font> futtatásával újrakonfigurálni a kernelmodult root-ként. Ubuntu, Dedora és Mandriva felhasználóknak előbb a DKMS csomagot érdemes feltelepíteniük. Ez a csomag követi a Linux kernel változásait, és újrafordítja a modulokat, ha szükséges. </translation>
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -140,8 +140,8 @@
         <translation>A VirtualBox kernel modul verziója nem megfelelő ehhez a VirtualBoxhoz. Valószínű, hogy a telepítés nem sikerült, és a program vagy a kernelmodul eltávolítása és újratelepítése segíthet.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>A VirtualBox kernel modul nem megfelelő a VirtualBoxhoz. Valószínű, hogy a telepítés nem volt sikeres, de a <br/><br/>  <font color=blue>/etc/init.d/vboxdrv setup</font><br/><br/>parancs lefuttatása segíthet. Figyelj arra, hogy a VirtualBox OSE és a PUEL verziója nem kompatibilis egymással.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>A VirtualBox kernel modul nem megfelelő a VirtualBoxhoz. Valószínű, hogy a telepítés nem volt sikeres, de a <br/><br/>  <font color=blue>/sbin/rcvboxdrv setup</font><br/><br/>parancs lefuttatása segíthet. Figyelj arra, hogy a VirtualBox OSE és a PUEL verziója nem kompatibilis egymással.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
@@ -149,8 +149,8 @@
         <translation>A kernel driver nem tudott elegendő memóriát lefoglalni, vagy valamilyen memóriaművelet nem sikerült.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>A VirtualBox Linuxos eszközmeghajtója nem tölthető be, vagy jogosultságprobléma van a /dev/vboxdrv eszközfájllal. Kérlek, telepítsd újra a kernel modult a<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>parancs rendszergazdaként történő végrehajtásával. Lehet,  hogy ehhez előbb telepítened kell a megfelelő DKMS csomagot, ha ez elérhető a disztribúciódhoz. Ez a csomag figyeli a Linux kernel változás [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>A VirtualBox Linuxos eszközmeghajtója nem tölthető be, vagy jogosultságprobléma van a /dev/vboxdrv eszközfájllal. Kérlek, telepítsd újra a kernel modult a<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>parancs rendszergazdaként történő végrehajtásával. Lehet,  hogy ehhez előbb telepítened kell a megfelelő DKMS csomagot, ha ez elérhető a disztribúciódhoz. Ez a csomag figyeli a Linux kernel változásait, [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
index d0cb9c9..9364d92 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
@@ -132,16 +132,16 @@
         <translation>Modul kernel VirtualBox tak cocok dengan versi VirtualBox ini. Instalasi VirtualBox sepertinya tak sukses. Silakan coba membongkar seluruhnya dan memasang ulang VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Modul kernel VirtualBox tidak cocok dengan versi VirtualBox ini. Instalasi VirtualBox sepertinya tak sukses. Menjalankan <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>mungkin memperbaiki hal ini. Pastikan bahwa Anda tak mencampur VirtualBox versi OSE dan versi PUEL.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Modul kernel VirtualBox tidak cocok dengan versi VirtualBox ini. Instalasi VirtualBox sepertinya tak sukses. Menjalankan <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>mungkin memperbaiki hal ini. Pastikan bahwa Anda tak mencampur VirtualBox versi OSE dan versi PUEL.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Kesalahan ini berarti driver kernel tak dapat mengalokasikan memori yang cukup atau beberapa operasi pemetaan gagal.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Driver VirtualBox untuk kernel Linux (vboxdrv) mungkin tidak dimuat atau ada masalah ijin dengan /dev/vboxdrv. Silakan pasang ulang modul kernel dengan menjalankan<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>sebagai root. Bila tersedia untuk distribusi Anda, Anda mesti terlebih dahulu memasang paket DKMS. Paket ini mencatat perubahan kernel Linux dan mengkompail ulang modul kernel vboxdrv bila  [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Driver VirtualBox untuk kernel Linux (vboxdrv) mungkin tidak dimuat atau ada masalah ijin dengan /dev/vboxdrv. Silakan pasang ulang modul kernel dengan menjalankan<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>sebagai root. Bila tersedia untuk distribusi Anda, Anda mesti terlebih dahulu memasang paket DKMS. Paket ini mencatat perubahan kernel Linux dan mengkompail ulang modul kernel vboxdrv bila dipe [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
index 63247ba..dbc04b2 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
@@ -132,24 +132,24 @@
         <translation>I moduli del kernel non corrispondono a questa versione di VirtualBox. L'installazione di VirtualBox sembra non essere riuscita. Potrebbe essere d'aiuto la completa disinstallazione e reinstallazione di VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>I moduli del kernel non corrispondono a questa versione di VirtualBox. L'installazione di VirtualBox sembra non essere riuscita. L'esecuzione di <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>potrebbe risolvere il problema. Assicurati di non mischiare la versione OSE con la versione PUEL di VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>I moduli del kernel non corrispondono a questa versione di VirtualBox. L'installazione di VirtualBox sembra non essere riuscita. L'esecuzione di <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>potrebbe risolvere il problema. Assicurati di non mischiare la versione OSE con la versione PUEL di VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Questo errore significa che il driver del kernel non è stato in grado di allocare memoria sufficiente o che alcune operazioni di mappatura non sono riuscite.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Il driver del kernel Linux di VirtualBox (vboxdrv) non è stato caricato o esiste un problema di permessi con /dev/vboxdrv. Installa nuovamente il modulo del kernel eseguendo<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>come root. Se è disponibile nella tua distribuzione, dovresti installare prima il pacchetto DKMS. Questo pacchetto tiene traccia dei cambiamenti del kernel Linux e ricompila il mo [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Il driver del kernel Linux di VirtualBox (vboxdrv) non è stato caricato o esiste un problema di permessi con /dev/vboxdrv. Installa nuovamente il modulo del kernel eseguendo<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>come root. Se è disponibile nella tua distribuzione, dovresti installare prima il pacchetto DKMS. Questo pacchetto tiene traccia dei cambiamenti del kernel Linux e ricompila il modulo [...]
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Questo errore indica che il driver del kernel non è in grado di allocare memoria sufficiente o che l'operazione di mappatura non è riuscita.<br/><br/>Ci sono problemi noti con Linux 2.6.29. Se stai eseguendo questo kernel, modifica /usr/src/vboxdrv-*/Makefile e abilita <i>VBOX_USE_INSERT_PAGE = 1</i>. Ricompila poi il modulo del kernel eseguendo <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Questo errore indica che il driver del kernel non è in grado di allocare memoria sufficiente o che l'operazione di mappatura non è riuscita.<br/><br/>Ci sono problemi noti con Linux 2.6.29. Se stai eseguendo questo kernel, modifica /usr/src/vboxdrv-*/Makefile e abilita <i>VBOX_USE_INSERT_PAGE = 1</i>. Ricompila poi il modulo del kernel eseguendo <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup&apo [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Il driver del kernel Linux di VirtualBox (vboxdrv) potrebbe non essere caricato o potrebbe esserci un problema di permessi con /dev/vboxdrv. Riconfigura il modulo del kernel eseguendo <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>come root. Gli utenti di Ubuntu, Fedora o Mandriva dovrebbero installare prima il pacchetto DKMS. Questo pacchetto tiene traccia delle modifiche del ker [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Il driver del kernel Linux di VirtualBox (vboxdrv) potrebbe non essere caricato o potrebbe esserci un problema di permessi con /dev/vboxdrv. Riconfigura il modulo del kernel eseguendo <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>come root. Gli utenti di Ubuntu, Fedora o Mandriva dovrebbero installare prima il pacchetto DKMS. Questo pacchetto tiene traccia delle modifiche del kernel  [...]
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
index bf4be90..f589582 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
@@ -108,12 +108,12 @@
         <translation>VirtualBoxを再インストールしてください。</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">このエラーは、カーネルドライバーに十分なメモリーを割り当てできないか、またはマッピング操作に失敗したことを意味します。<br/><br/>これはLinux 2.6.29の既知の問題です。このバージョンのカーネルを使用するならば、/usr/src/vboxdrv-*/Makefileを編集し、<i>VBOX_USE_INSERT_PAGE = 1</i>を有効にしてください。その後、root権限で<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>を実行してカーネルモジュールを再コンパイルしてください。</translation>
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">このエラーは、カーネルドライバーに十分なメモリーを割り当てできないか、またはマッピング操作に失敗したことを意味します。<br/><br/>これはLinux 2.6.29の既知の問題です。このバージョンのカーネルを使用するならば、/usr/src/vboxdrv-*/Makefileを編集し、<i>VBOX_USE_INSERT_PAGE = 1</i>を有効にしてください。その後、root権限で<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>を実行してカーネルモジュールを再コンパイルしてください。</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">VirtualBoxのLinuxカーネルドライバー(vboxdrv)はロードされません。または/dev/vboxdrvのパーミッションに問題があります。root権限で<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>を実行してカーネルモジュールを再セットアップしてください。Ubuntu、FedoraまたはMandrivaユーザーは最初にDKMSパッケージをインストールしてください。このパッケージはLinuxカーネルの変更を把握し、必要ならばvboxdrvカーネルモジュールを再コンパイルします。</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">VirtualBoxのLinuxカーネルドライバー(vboxdrv)はロードされません。または/dev/vboxdrvのパーミッションに問題があります。root権限で<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>を実行してカーネルモジュールを再セットアップしてください。Ubuntu、FedoraまたはMandrivaユーザーは最初にDKMSパッケージをインストールしてください。このパッケージはLinuxカーネルの変更を把握し、必要ならばvboxdrvカーネルモジュールを再コンパイルします。</translation>
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -136,16 +136,16 @@
         <translation>カーネルドライバーにアクセスできません</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>VirtualBoxのLinuxカーネルドライバー(vboxdrv)は読み込まれていないか、/dev/vboxdrvのパーミッションに問題があります。root権限で<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>を実行してカーネルモジュールを再インストールしてください。もしディストリビューションにある場合、まずDKMSパッケージをインストールしてください。このパッケージはLinuxカーネルの変更を把握し、必要ならばvboxdrvカーネルモジュールを再コンパイルします。</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>VirtualBoxのLinuxカーネルドライバー(vboxdrv)は読み込まれていないか、/dev/vboxdrvのパーミッションに問題があります。root権限で<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>を実行してカーネルモジュールを再インストールしてください。もしディストリビューションにある場合、まずDKMSパッケージをインストールしてください。このパッケージはLinuxカーネルの変更を把握し、必要ならばvboxdrvカーネルモジュールを再コンパイルします。</translation>
     </message>
     <message>
         <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Please try completely uninstalling and reinstalling VirtualBox.</source>
         <translation>カーネルモジュールのバージョンが適合しません。VirtualBoxのインストールは成功しませんでした。この問題はVirtualBoxを完全にアンインストール後、再インストールすることで解決するかもしれません。</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>カーネルモジュールのバージョンが適合しません。VirtualBoxのインストールは成功しませんでした。</br></br><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>を実行すると、この問題は修正されるでしょう。VirtualBoxのOSEバージョンとPUELバージョンを混在して使用しないでください。</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>カーネルモジュールのバージョンが適合しません。VirtualBoxのインストールは成功しませんでした。</br></br><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>を実行すると、この問題は修正されるでしょう。VirtualBoxのOSEバージョンとPUELバージョンを混在して使用しないでください。</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
index f657d7c..56dbfdc 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
@@ -56,16 +56,16 @@
         <translation>កំហុស​នេះ​មាន​ន័យ​ថា កម្មវិធី​បញ្ជា​ខឺណែល​មិនអាច​បម្រុង​ទុក​សតិ​គ្រប់គ្រាន់​ ឬ​បានបរាជ័យ​ក្នុងកា​រ​ផ្គូផ្គង​មួយ​ចំនួន ។</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">កម្ម​វិធី​ខឺ​ណែល​លីនុច​ VirtualBox (vboxdrv) មិនត្រូវ​បាន​ផ្ទុក​ ឬ​មាន​បញ្ហា​សិទ្ធិ​ជាមួយ​ /dev/vboxdrv ។ សូម​ដំឡើង​ឡើង​វិញ​ម៉ូ​​ឌុល​ខឺ​ណែល​​​ដោយ​ការ​ប្រតិបត្តិ​​ <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv ដំឡើ​ង</font><br/><br/>​ដូច Root ។ អ្នក​ប្រើ​យូប៊ុន​ទូ​ Fedora ឬ​ Mandriva គួរ​តែដំឡើង​កញ្ចប់​ដំបូង​របស់​ DKMS ។ កញ្ចប់​នេះ​​តាម​ដាន​​រក្សា​ទុក​​នៃ​ការ​ផ្លាស់​ប្តូរ​ខឺ​ណែល​លីនុច​ និងចង​​ក្រង​ឡើងវិញ​នៃ​ [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">កម្ម​វិធី​ខឺ​ណែល​លីនុច​ VirtualBox (vboxdrv) មិនត្រូវ​បាន​ផ្ទុក​ ឬ​មាន​បញ្ហា​សិទ្ធិ​ជាមួយ​ /dev/vboxdrv ។ សូម​ដំឡើង​ឡើង​វិញ​ម៉ូ​​ឌុល​ខឺ​ណែល​​​ដោយ​ការ​ប្រតិបត្តិ​​ <br/><br/>  <font color=blue>'/sbin/rcvboxdrv ដំឡើ​ង</font><br/><br/>​ដូច Root ។ អ្នក​ប្រើ​យូប៊ុន​ទូ​ Fedora ឬ​ Mandriva គួរ​តែដំឡើង​កញ្ចប់​ដំបូង​របស់​ DKMS ។ កញ្ចប់​នេះ​​តាម​ដាន​​រក្សា​ទុក​​នៃ​ការ​ផ្លាស់​ប្តូរ​ខឺ​ណែល​លីនុច​ និងចង​​ក្រង​ឡើងវិញ​នៃ​​ម៉ូ [...]
     </message>
     <message>
         <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Please try completely uninstalling and reinstalling VirtualBox.</source>
         <translation>ម៉ូ​ឌុល​ខឺ​ណែល​របស់​ VirtualBox មិន​ផ្គូផ្គង​​កំណែ​របស់​ VirtualBox នេះ​ទេ​ ។ ជាក់​ស្តែង​ការ​ដំឡើង VirtualBox ​​​មិន​ទទួល​បាន​ជោគជ័យ​នោះ​ទេ ។ សូម​ព្យាយាម​លុប​​ ហើយ​​ដំឡើង​ VirtualBox ឡើង​វិញ ។</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>ម៉ូឌុល​ខឺ​ណែល​របស់​ VirtualBox មិន​ផ្គូផ្គង​កំណែ​របស់​ VirtualBox នេះទេ ។ ជាក់​ស្តែង​ការ​ដំឡើង​របស់​ VirtualBox មិន​ទទួល​បាន​ជោគជ័យ​នោះ​ទេ ។ ការ​ប្រតិបត្តិ​<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>នេះ​អាច​ត្រឹមត្រូវ​ ។ សូម​ប្រាកដ​ថា​ អ្នក​មិនបញ្ចូល​កំណែ​ OSE និង​​កំណែ​ PUEL របស់​ VirtualBox ចូល​គ្នា​ឡើយ ។</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>ម៉ូឌុល​ខឺ​ណែល​របស់​ VirtualBox មិន​ផ្គូផ្គង​កំណែ​របស់​ VirtualBox នេះទេ ។ ជាក់​ស្តែង​ការ​ដំឡើង​របស់​ VirtualBox មិន​ទទួល​បាន​ជោគជ័យ​នោះ​ទេ ។ ការ​ប្រតិបត្តិ​<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>នេះ​អាច​ត្រឹមត្រូវ​ ។ សូម​ប្រាកដ​ថា​ អ្នក​មិនបញ្ចូល​កំណែ​ OSE និង​​កំណែ​ PUEL របស់​ VirtualBox ចូល​គ្នា​ឡើយ ។</translation>
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -88,7 +88,7 @@
         <translation>មិន​ស្គាល់​កំហុស​ %2 អំឡុង​ពេល​ដែលការ​ចាប់​ផ្តើមពេលវេលា​រត់​</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
index 63ac702..73ed4ca 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
@@ -67,12 +67,12 @@
         <translation>VirtualBox를 다시 설치하시면 해결될 수도 있습니다.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">VirtualBox 커널 드라이버에서 충분한 메모리를 할당할 수 없었거나, 일부 매핑 동작이 실패한 것 같습니다.<br /><br />리눅스 커널 2.6.29에는 알려진 문제가 있습니다. 리눅스 커널 2.6.29를 사용하신다면, /usr/src/vboxdrv-*/Makefile을 편집하시고, <i>VBOX_USE_INSERT_PAGE = 1</i>을 추가하십시오. 그 다음 루트 권한으로 이 명령어를 내려서 커널 모듈을 다시 컴파일하십시오.<br /><br /><font color=blue>'/etc/init.d/vboxdrv setup'</font><br /><br />.</translation>
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">VirtualBox 커널 드라이버에서 충분한 메모리를 할당할 수 없었거나, 일부 매핑 동작이 실패한 것 같습니다.<br /><br />리눅스 커널 2.6.29에는 알려진 문제가 있습니다. 리눅스 커널 2.6.29를 사용하신다면, /usr/src/vboxdrv-*/Makefile을 편집하시고, <i>VBOX_USE_INSERT_PAGE = 1</i>을 추가하십시오. 그 다음 루트 권한으로 이 명령어를 내려서 커널 모듈을 다시 컴파일하십시오.<br /><br /><font color=blue>'/sbin/rcvboxdrv setup'</font><br /><br />.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">VirtualBox 리눅스 커널 드라이버(vboxdrv)가 불러와지지 않았거나 /dev/vobxdrv에 접근할 수 없습니다. 루트 권한으로 다음 명령어를 실행시켜서 커널 모듈을 다시 설정하십시오.<br /><br /><font color=blue>'/etc/init.d/vboxdrv setup'</font><br /><br />우분투, 페도라, 맨드리바 사용자들께서는 DKMS 패키지를 설치하는 것을 추천합니다. 이 패키지를 사용하면 리눅스 커널이 바뀌었을 때 자동으로 커널 모듈을 다시 컴파일합니다.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">VirtualBox 리눅스 커널 드라이버(vboxdrv)가 불러와지지 않았거나 /dev/vobxdrv에 접근할 수 없습니다. 루트 권한으로 다음 명령어를 실행시켜서 커널 모듈을 다시 설정하십시오.<br /><br /><font color=blue>'/sbin/rcvboxdrv setup'</font><br /><br />우분투, 페도라, 맨드리바 사용자들께서는 DKMS 패키지를 설치하는 것을 추천합니다. 이 패키지를 사용하면 리눅스 커널이 바뀌었을 때 자동으로 커널 모듈을 다시 컴파일합니다.</translation>
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -99,16 +99,16 @@
         <translation>이 버전의 VirtualBox에서는 현재 설치되어 있는 커널 모듈을 사용할 수 없습니다. VirtualBox 설치 과정이 실패했을 수도 있습니다. 완전히 삭제한 다음 다시 설치해 보십시오.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>이 버전의 VirtualBox에서는 현재 설치되어 있는 커널 모듈을 사용할 수 없습니다. VirtualBox 설치 과정이 실패했을 수도 있습니다. <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> 명령을 실행시키면 문제를 해결할 수도 있습니다. VirtualBox OSE 버전과 PUEL 버전을 같이 설치하지 마십시오..</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>이 버전의 VirtualBox에서는 현재 설치되어 있는 커널 모듈을 사용할 수 없습니다. VirtualBox 설치 과정이 실패했을 수도 있습니다. <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> 명령을 실행시키면 문제를 해결할 수도 있습니다. VirtualBox OSE 버전과 PUEL 버전을 같이 설치하지 마십시오..</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
-        <translation>이 버전의 VirtualBox에서는 현재 설치되어 있는 커널 모듈을 사용할 수 없습니다. VirtualBox 설치 과정이 실패했을 수도 있습니다. <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> 명령을 실행시키면 문제를 해결할 수도 있습니다. VirtualBox OSE 버전과 PUEL 버전을 같이 설치하지 마십시오..</translation>
+        <translation>이 버전의 VirtualBox에서는 현재 설치되어 있는 커널 모듈을 사용할 수 없습니다. VirtualBox 설치 과정이 실패했을 수도 있습니다. <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> 명령을 실행시키면 문제를 해결할 수도 있습니다. VirtualBox OSE 버전과 PUEL 버전을 같이 설치하지 마십시오..</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>VirtualBox 리눅스 커널 드라이버(vboxdrv)가 로드되지 않았거나, /dev/vboxdrv 장치 파일에 접근할 수 없습니다. 루트 권한으로 다음 명령을 실행하여 커널 모듈을 다시 설치하십시오:<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> 사용 중인 배포판이 DKMS를 지원한다면 먼저 설치하는 것을 추천합니다. 리눅스 커널 버전 변경을 추적하고 필요한 경우 vboxdrv 커널 모듈을 다시 컴파일합니다.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>VirtualBox 리눅스 커널 드라이버(vboxdrv)가 로드되지 않았거나, /dev/vboxdrv 장치 파일에 접근할 수 없습니다. 루트 권한으로 다음 명령을 실행하여 커널 모듈을 다시 설치하십시오:<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> 사용 중인 배포판이 DKMS를 지원한다면 먼저 설치하는 것을 추천합니다. 리눅스 커널 버전 변경을 추적하고 필요한 경우 vboxdrv 커널 모듈을 다시 컴파일합니다.</translation>
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
index e5bf605..bf060df 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
@@ -52,8 +52,8 @@
         <translation>Bandykite iš naujo įdiegti VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">VirtualBox Linux branduolio modulis (vboxdrv) arba nėra įkeltas, arba nepakanka leidimų dirbti su /dev/vboxdrv. Iš naujo įdiekite branduolio modulį root teisėmis įvykdydami <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Ubuntu, Fedora ir Mandriva platinamųjų paketų naudotojai pirma turi įsidiegti DKMS paketą. Šis paketas seka Linux branduolio pakeitimus ir, jei reikia, perkompiliu [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">VirtualBox Linux branduolio modulis (vboxdrv) arba nėra įkeltas, arba nepakanka leidimų dirbti su /dev/vboxdrv. Iš naujo įdiekite branduolio modulį root teisėmis įvykdydami <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Ubuntu, Fedora ir Mandriva platinamųjų paketų naudotojai pirma turi įsidiegti DKMS paketą. Šis paketas seka Linux branduolio pakeitimus ir, jei reikia, perkompiliuoja  [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -80,16 +80,16 @@
         <translation>VirtualBox branduolio moduliai neatitinka įdiegtos VirtualBox versijos. Tikriausiai VirtualBox nebuvo pilnai įdiegta. Patariame visiškai pašalinti VirtualBox ir įdiegti iš naujo.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>VirtualBox branduolio moduliai neatitinka įdiegtos VirtualBox versijos. Tikriausiai VirtualBox nebuvo pilnai įdiegta. Galbūt administratoriaus teisėmis įvykdžius <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> ši problema išsispręs. Įsitikinkite, kad nenaudojate OSE ir PUEL VirtualBox versijų dalių vienu metu.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>VirtualBox branduolio moduliai neatitinka įdiegtos VirtualBox versijos. Tikriausiai VirtualBox nebuvo pilnai įdiegta. Galbūt administratoriaus teisėmis įvykdžius <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> ši problema išsispręs. Įsitikinkite, kad nenaudojate OSE ir PUEL VirtualBox versijų dalių vienu metu.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Ši klaida reiškia, kad branduolio modulis arba negali išnaudoti pakankamai atminties, arba nepavyko atlikti kai kurių planavimo operacijų.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>VirtualBox Linux branduolio modulis (vboxdrv) arba nėra įkeltas, arba nepakanka leidimų dirbti su /dev/vboxdrv. Iš naujo įdiekite branduolio modulį root teisėmis įvykdydami <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Jei įmanoma pirma turite įsidiegti DKMS paketą. Šis paketas seka Linux branduolio pakeitimus ir, jei reikia, perkompiliuoja vboxdrv branduolio modulį.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>VirtualBox Linux branduolio modulis (vboxdrv) arba nėra įkeltas, arba nepakanka leidimų dirbti su /dev/vboxdrv. Iš naujo įdiekite branduolio modulį root teisėmis įvykdydami <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Jei įmanoma pirma turite įsidiegti DKMS paketą. Šis paketas seka Linux branduolio pakeitimus ir, jei reikia, perkompiliuoja vboxdrv branduolio modulį.</translation>
     </message>
 </context>
 <context>
@@ -7129,7 +7129,7 @@
         <source>VirtualBox - Critical Error</source>
         <comment>msg box title
 </comment>
-        <translation type="obsolete">VirtialBox - lemtinga klaida</translation>
+        <translation type="obsolete">VirtualBox - lemtinga klaida</translation>
     </message>
     <message>
         <source>Do not show this message again</source>
@@ -8009,7 +8009,7 @@
     <message>
         <source>VirtualBox - Critical Error</source>
         <comment>msg box title</comment>
-        <translation>VirtialBox - lemtinga klaida</translation>
+        <translation>VirtualBox - lemtinga klaida</translation>
     </message>
     <message>
         <source>Do not show this message again</source>
@@ -11496,7 +11496,7 @@
     </message>
     <message>
         <source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
-        <translation type="obsolete">Rodo šio pagrindinio kompiuterio IPv4 adresą šiai plokštei, jei palaikomas 
+        <translation type="obsolete">Rodo šio pagrindinio kompiuterio IPv4 adresą šiai plokštei, jei palaikomas
 IPv6.</translation>
     </message>
     <message>
@@ -15039,7 +15039,7 @@ IPv6.</translation>
     <name>VBoxSettingsDialog</name>
     <message>
         <source><i>Select a settings category from the list on the left-hand side and move the mouse over a settings item to get more information</i>.</source>
-        <translation type="obsolete"><i>Iš sąrašo kairėje pusėje pasirinkite nuostatų grupę. Užvedę pelę virš 
+        <translation type="obsolete"><i>Iš sąrašo kairėje pusėje pasirinkite nuostatų grupę. Užvedę pelę virš
 konkrečių nuostatų, matysite paaiškinimus<i>.</translation>
     </message>
     <message>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
index 36cb266..db78022 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
@@ -77,16 +77,16 @@
         <translation>De VirtualBox kernelmodules passen niet bij deze versie van VirtualBox. De installatie van VirtualBox is kennelijk niet goed gelukt. Deïnstalleer VirtualBox eerst volledig en installeer VirtualBox daarna opnieuw.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>De VirtualBox kernelmodules passen niet bij deze versie van VirtualBox. De installatie van VirtualBox is kennelijk niet goed gelukt. Uitvoeren van <br/><br/><font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> zou dit kunnen corrigeren. Controleer of u de OSE versie en de PUEL versie van VirtualBox niet hebt vermengd.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>De VirtualBox kernelmodules passen niet bij deze versie van VirtualBox. De installatie van VirtualBox is kennelijk niet goed gelukt. Uitvoeren van <br/><br/><font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> zou dit kunnen corrigeren. Controleer of u de OSE versie en de PUEL versie van VirtualBox niet hebt vermengd.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Deze fout betekent dat de kerneldriver óf te weinig geheugen kan reserveren óf dat uitvoeren van mapping mislukt is.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>De VirtualBox Linux-kerneldriver (vboxdrv) is niet geladen of er is een permissie-probleem met /dev/vboxdrv. Herinstalleer de kernelmodule door <br/></br>..<font color=blue>'/etc/init.d/vboxdrv setup' </font><br/><br/>als root uit te voeren. Indien in uw distributie aanwezig, installeer dan eerst het DKMS pakket. Dit pakket houdt Linux kernelveranderingen bij en hercompileert indien nodig de vboxdrv-kernelmodule.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>De VirtualBox Linux-kerneldriver (vboxdrv) is niet geladen of er is een permissie-probleem met /dev/vboxdrv. Herinstalleer de kernelmodule door <br/></br>..<font color=blue>'/sbin/rcvboxdrv setup' </font><br/><br/>als root uit te voeren. Indien in uw distributie aanwezig, installeer dan eerst het DKMS pakket. Dit pakket houdt Linux kernelveranderingen bij en hercompileert indien nodig de vboxdrv-kernelmodule.</translation>
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
index 8fc9ede..435d7a0 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
@@ -108,12 +108,12 @@
         <translation>Być może pomocna będzie ponowna instalacja VirtualBox.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Ten błąd oznacza, że sterownik jądra systemu (vboxdrv) nie był w stanie przydzielić wystarczającej ilości pamięci lub nie powiodła się operacja mapowania.<br/><br/>Występują pewne znane problemy w systemach typu Linux 2.6.29. Jeśli używany jest taki właśnie kernel, należy zmienić plik /usr/src/vboxdrv-*/Makefile i włączyć <i>VBOX_USE_INSERT_PAGE = 1</i>. Następnie należy przekompilować moduł kernela, wydając polecenie<br/&gt [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Ten błąd oznacza, że sterownik jądra systemu (vboxdrv) nie był w stanie przydzielić wystarczającej ilości pamięci lub nie powiodła się operacja mapowania.<br/><br/>Występują pewne znane problemy w systemach typu Linux 2.6.29. Jeśli używany jest taki właśnie kernel, należy zmienić plik /usr/src/vboxdrv-*/Makefile i włączyć <i>VBOX_USE_INSERT_PAGE = 1</i>. Następnie należy przekompilować moduł kernela, wydając polecenie<br/&gt [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Sterownik VirtualBox dla jądra systemu Linux (vboxdrv) nie jest załadowany lub występuje problem z uprawnieniami dla /dev/vboxdrv. Należy ponownie przygotować moduł kernela, wydając polecenie<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>jako administrator. Użytkownicy systemów Ubuntu, Fedora i Mandriva powinni najpierw zainstalować pakiet DKMS. Pakiet ten śledzi zmiany kernela Li [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Sterownik VirtualBox dla jądra systemu Linux (vboxdrv) nie jest załadowany lub występuje problem z uprawnieniami dla /dev/vboxdrv. Należy ponownie przygotować moduł kernela, wydając polecenie<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>jako administrator. Użytkownicy systemów Ubuntu, Fedora i Mandriva powinni najpierw zainstalować pakiet DKMS. Pakiet ten śledzi zmiany kernela Linux  [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -140,15 +140,15 @@
         <translation>Moduły jądra systemu nie odpowiadają tej wersji VirtualBox. Prawdopodobnie nie powiodła się instalacja oprogramowania. Proszę spróbować całkowicie odinstalować i ponownie zainstalować VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Moduły jądra systemu nie odpowiadają tej wersji VirtualBox. Prawdopodobnie nie powiodła się instalacja oprogramowania. Wywołanie<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>może pomóc rozwiązać ten problem. Proszę także pamiętać, aby nie mieszać ze sobą wersji OSE oraz PUEL programu VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Moduły jądra systemu nie odpowiadają tej wersji VirtualBox. Prawdopodobnie nie powiodła się instalacja oprogramowania. Wywołanie<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>może pomóc rozwiązać ten problem. Proszę także pamiętać, aby nie mieszać ze sobą wersji OSE oraz PUEL programu VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Ten błąd oznacza, że sterownik jądra systemu nie był w stanie przydzielić odpowiedniej ilości pamięci lub nie powiodła się operacja mapowania.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
index 90481b5..8985657 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
@@ -108,8 +108,8 @@
         <translation>Reinstalar o VirtualBox poderá ajudar.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">O controlador (vboxdrv) kernel Linux  do VirtualBox ou não está carregado, ou existe algum problema de permissões com /dev/vboxdrv. Por favor reinstall o módulo kernel ao executar como administrador <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Os utilizadores Ubuntu, Fedora ou Mandriva devem instalar primeiro o pacote DKMS. Este pacote mantém as alterações do kernel Linux actu [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">O controlador (vboxdrv) kernel Linux  do VirtualBox ou não está carregado, ou existe algum problema de permissões com /dev/vboxdrv. Por favor reinstall o módulo kernel ao executar como administrador <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Os utilizadores Ubuntu, Fedora ou Mandriva devem instalar primeiro o pacote DKMS. Este pacote mantém as alterações do kernel Linux actualiz [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -136,15 +136,15 @@
         <translation>Os módulos kernel do VirtualBox não correspondem a esta versão do VirtualBox. A instalação do VirtualBox aparentemente falhou. Por favor tente desinstalar completamente e reinstalar o VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Os módulos kernel do VirtualBox não correspondem a esta versão do VirtualBox. A instalação do VirtualBox aparentemente falhou. Pode corrigir isto ao executar <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Certifique-se que não mistura as versões OSE e a versão PUEL do VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Os módulos kernel do VirtualBox não correspondem a esta versão do VirtualBox. A instalação do VirtualBox aparentemente falhou. Pode corrigir isto ao executar <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Certifique-se que não mistura as versões OSE e a versão PUEL do VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Este erro significa que o controlador kernel não conseguiu alocar memória suficiente ou que falhou alfuma operação de mapeação.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
index a72c1a5..81f324b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
@@ -108,12 +108,12 @@
         <translation>Sugerimos que o VirtualBox seja reinstalado.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Este erro significa que o driver do kernel não pôde alocar memória suficiente, ou que uma operação de mapeamento de memória falhou.<br/><br/>Existem problemas conhecidos com o kernel Linux2.6.29. Se você está utilizando esta versão de kernel, edite o arquivo /usr/src/vboxdrv-*/Makefile e habilite a opção <i>VBOX_USE_INSERT_PAGE = 1</i>. Em seguida, recompile o módulo do kernel executando o comando<br/><br/>  <fon [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Este erro significa que o driver do kernel não pôde alocar memória suficiente, ou que uma operação de mapeamento de memória falhou.<br/><br/>Existem problemas conhecidos com o kernel Linux2.6.29. Se você está utilizando esta versão de kernel, edite o arquivo /usr/src/vboxdrv-*/Makefile e habilite a opção <i>VBOX_USE_INSERT_PAGE = 1</i>. Em seguida, recompile o módulo do kernel executando o comando<br/><br/>  <fon [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">O driver de kernel para Linux do VirtualBox (vboxdrv) não está carregado, ou existe um problema de permissões no arquivo /dev/vboxdrv. Compile novamente o módulo de kernel executando o comando<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>como root. Usuários de Ubuntu, Fedora ou Mandriva devem instalar o pacote DKMS primeiro. Este pacote monitora as mudanças no kernel Linux e reco [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">O driver de kernel para Linux do VirtualBox (vboxdrv) não está carregado, ou existe um problema de permissões no arquivo /dev/vboxdrv. Compile novamente o módulo de kernel executando o comando<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>como root. Usuários de Ubuntu, Fedora ou Mandriva devem instalar o pacote DKMS primeiro. Este pacote monitora as mudanças no kernel Linux e recompil [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -140,16 +140,16 @@
         <translation>Os módulos de kernel para o VirtualBox que estão carregados não servem para esta versão do VirtualBox. Aparentemente, a instalação do VirtualBox não foi completada corretamente. É recomendado que o VirtualBox seja completamente removido e instalado novamente.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Os módulos de kernel para o VirtualBox que estão carregados não servem para esta versão do VirtualBox. Aparentemente, a instalação do VirtualBox não foi completada corretamente. Execute <br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>para resolver este problema. Certifique-se de que não esteja misturando componentes da versão OSE com a versão PUEL do VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Os módulos de kernel para o VirtualBox que estão carregados não servem para esta versão do VirtualBox. Aparentemente, a instalação do VirtualBox não foi completada corretamente. Execute <br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>para resolver este problema. Certifique-se de que não esteja misturando componentes da versão OSE com a versão PUEL do VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Este erro indica que o driver de kernel não pode alocar memória suficiente ou que uma operação de mapeamento falhou.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>O driver de kernel do VirtualBox (vboxdrv) não está carregado ou existe um problema de permissão no dispositivo /dev/vboxdrv. Reinstale o módulo de kernel executando o comando<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>como  root. Se a sua distribuição dispuser do serviço DKMS, instale-o antes. O serviço DKMS detecta mudanças no kernel do Linux e recompila o módulo de kernel  'vboxdrv&apo [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>O driver de kernel do VirtualBox (vboxdrv) não está carregado ou existe um problema de permissão no dispositivo /dev/vboxdrv. Reinstale o módulo de kernel executando o comando<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>como  root. Se a sua distribuição dispuser do serviço DKMS, instale-o antes. O serviço DKMS detecta mudanças no kernel do Linux e recompila o módulo de kernel  'vboxdrv' s [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
index d12fa6a..56e374e 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
@@ -116,8 +116,8 @@
         <translation>Reinstalarea VirtualBox ar putea ajuta.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Fie Driverul de nucleu Linux al VirtualBox (vboxdrv) nu este încărcat fie există o problemă cu permisiunile pe /dev/vboxdrv. Vă rugăm reinstalați modulul kernel executând <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> ca root. Utilizatorii de Ubuntu, Fedora sau Mandriva ar trebui să instaleze pachetul DKMS mai întâi. Acest pachet urmărește schimbările nucleului și recompilează mo [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Fie Driverul de nucleu Linux al VirtualBox (vboxdrv) nu este încărcat fie există o problemă cu permisiunile pe /dev/vboxdrv. Vă rugăm reinstalați modulul kernel executând <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> ca root. Utilizatorii de Ubuntu, Fedora sau Mandriva ar trebui să instaleze pachetul DKMS mai întâi. Acest pachet urmărește schimbările nucleului și recompilează modulu [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -144,7 +144,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -152,7 +152,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
index 096a920..d2f1812 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
@@ -67,12 +67,12 @@
         <translation>Попробуйте выполнить повторную установку приложения VirtualBox.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Данная ошибка означает, что либо драйвер ядра не смог выделить достаточное количество памяти, либо операция выделения памяти завершилась неудачно.<br/><br/>Подобные проблемы присутствуют в ядре Linux 2.6.29. Если Вы используете ядро данной версии, пожалуйста отредактируйте /usr/src/vboxdrv-*/Makefile, добавив <i>VBOX_USE_INSERT_PAGE = 1</i>. После этого пересоберите ядро запуском<br/><br/>  <font color=blue>&a [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Данная ошибка означает, что либо драйвер ядра не смог выделить достаточное количество памяти, либо операция выделения памяти завершилась неудачно.<br/><br/>Подобные проблемы присутствуют в ядре Linux 2.6.29. Если Вы используете ядро данной версии, пожалуйста отредактируйте /usr/src/vboxdrv-*/Makefile, добавив <i>VBOX_USE_INSERT_PAGE = 1</i>. После этого пересоберите ядро запуском<br/><br/>  <font color=blue>&a [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Драйвер ядра VirtualBox ОС Linux (vboxdrv) вероятно не загружен, либо присутствуют проблемы с правами доступа к /dev/vboxdrv. Переконфигурируйте модуль ядра запуском<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>от имени администратора. Пользователям Ubuntu, Fedora или Mandriva следует сперва установить пакет DKMS. Этот пакет отслеживает изменения ядра Linux и пересобирает модуль  [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Драйвер ядра VirtualBox ОС Linux (vboxdrv) вероятно не загружен, либо присутствуют проблемы с правами доступа к /dev/vboxdrv. Переконфигурируйте модуль ядра запуском<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>от имени администратора. Пользователям Ubuntu, Fedora или Mandriva следует сперва установить пакет DKMS. Этот пакет отслеживает изменения ядра Linux и пересобирает модуль ядра [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -99,16 +99,16 @@
         <translation>Модуль ядра VirtualBox не совместим с текущей версией приложения. Возможно установка VirtualBox не была завершена или прошла некорректно. Попробуйте полностью удалить VirtualBox и установить заново.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Модуль ядра VirtualBox не совместим с текущей версией приложения. Возможно установка VirtualBox не была завершена или прошла некорректно. Запуск<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>должен исправить данную проблему. Убедитесь в том, что не используете платную (PUEL) и бесплатную (OSE) версии VirtualBox одновременно.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Модуль ядра VirtualBox не совместим с текущей версией приложения. Возможно установка VirtualBox не была завершена или прошла некорректно. Запуск<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>должен исправить данную проблему. Убедитесь в том, что не используете платную (PUEL) и бесплатную (OSE) версии VirtualBox одновременно.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Данная ошибка означает, что либо драйвер ядра не смог выделить достаточное количество памяти, либо некая операция с памятью неудачно завершена.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Драйвер ядра VirtualBox (vboxdrv) не загружен, либо присутствует проблема с доступом к /dev/vboxdrv. Пожалуйста переустановите драйвер, выполнив <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> от имени администратора. Учтите, что сперва Вам необходимо установить пакет DKMS, если он доступен Вашему дистрибутиву операционной системы. Этот пакет автоматически отслеживает изменения драйверов Linux и  [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Драйвер ядра VirtualBox (vboxdrv) не загружен, либо присутствует проблема с доступом к /dev/vboxdrv. Пожалуйста переустановите драйвер, выполнив <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> от имени администратора. Учтите, что сперва Вам необходимо установить пакет DKMS, если он доступен Вашему дистрибутиву операционной системы. Этот пакет автоматически отслеживает изменения драйверов Linux и обно [...]
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
index f3f8b8d..1610efa 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
@@ -104,12 +104,12 @@
         <translation>Možno pomôže preinštalovanie VirtualBoxu.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Táto chyba znamená, že kernelový ovládač buď nebol schopný alokovať dostatok pamäte alebo že nejaká operácia mapovania zlyhala.<br/><br/>Sú známe problémy s Linuxom 2.6.29. Ak používate toto jadro, prosím upravte /usr/src/vboxdrv-*/Makefile a povoľte <i>VBOX_USE_INSERT_PAGE = 1</i>. Potom rekompilujte kernelový modul spustením <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><b [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Táto chyba znamená, že kernelový ovládač buď nebol schopný alokovať dostatok pamäte alebo že nejaká operácia mapovania zlyhala.<br/><br/>Sú známe problémy s Linuxom 2.6.29. Ak používate toto jadro, prosím upravte /usr/src/vboxdrv-*/Makefile a povoľte <i>VBOX_USE_INSERT_PAGE = 1</i>. Potom rekompilujte kernelový modul spustením <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&g [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Ovládač Linuxového jadra pre VirtualBox (vboxdrv) buď nie je načítaný alebo je problém s právami na /dev/vboxdrv. Prosím, preinštalujte modul jadra spustením<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>ako užívateľ root. Užívatelia Ubuntu, Fedory alebo Mandrivy by mali najprv nainštalovať balíček DKMS. Tento balíček sleduje zmeny Linuxového jadra a prekompiluje modul jadra vboxd [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Ovládač Linuxového jadra pre VirtualBox (vboxdrv) buď nie je načítaný alebo je problém s právami na /dev/vboxdrv. Prosím, preinštalujte modul jadra spustením<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>ako užívateľ root. Užívatelia Ubuntu, Fedory alebo Mandrivy by mali najprv nainštalovať balíček DKMS. Tento balíček sleduje zmeny Linuxového jadra a prekompiluje modul jadra vboxdrv,  [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -136,15 +136,15 @@
         <translation>Jaderné moduly VirtualBoxu nezodpovedajú tejto verzii VirtualBoxu. Inštalácia VirtualBoxu bola podľa všetkého neúspešná. Skúste VirtualBoxu odinštalovať a znovu nainštalovať.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Moduly jadra VirtualBoxu nekorešpondujú s touto verziou VirtualBoxu. Inštalácia VirtualBoxu pravdepodobne nebola úspešná. Spustenie<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>by to malo napraviť. Uistite sa, že nemiešate OSE verziu a PUEL verziu VirtualBoxu.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Moduly jadra VirtualBoxu nekorešpondujú s touto verziou VirtualBoxu. Inštalácia VirtualBoxu pravdepodobne nebola úspešná. Spustenie<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>by to malo napraviť. Uistite sa, že nemiešate OSE verziu a PUEL verziu VirtualBoxu.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Táto chyba znamená, že ovládač jadra nebol schopný alokovať dostatok pamäte alebo zlyhala operácia mapovania.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
index 3b50e04..e857e1d 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
@@ -67,12 +67,12 @@
         <translation>Поново инсталирати VirtualBox.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Грешка пошто драјвер језгра није могао да допуни меморију или је имало грешке у мапирању.<br/><br/>Ово су познате грешке са Linux 2.6.29. Ако користите то језгро, уредити /usr/src/vboxdrv-*/Makefile и упалити <i>VBOX_USE_INSERT_PAGE = 1</i>. После тога, поново компулујте језгро са <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>као root.</translation>
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Грешка пошто драјвер језгра није могао да допуни меморију или је имало грешке у мапирању.<br/><br/>Ово су познате грешке са Linux 2.6.29. Ако користите то језгро, уредити /usr/src/vboxdrv-*/Makefile и упалити <i>VBOX_USE_INSERT_PAGE = 1</i>. После тога, поново компулујте језгро са <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>као root.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">VirtualBox Linux kernel driver (vboxdrv) или није учитан или нема довољно права са /dev/vboxdrv. Поново инсталирати модул са<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>као root. Корисници Ubuntu, Fedora или Mandriva требају да прво инсталирају DKMS пакет. Пакет компилује vboxdrv ако потребно према промене језгра.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">VirtualBox Linux kernel driver (vboxdrv) или није учитан или нема довољно права са /dev/vboxdrv. Поново инсталирати модул са<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>као root. Корисници Ubuntu, Fedora или Mandriva требају да прво инсталирају DKMS пакет. Пакет компилује vboxdrv ако потребно према промене језгра.</translation>
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -95,8 +95,8 @@
         <translation>Кернел VirtualBox-а није исти као у овој верзији. Можда је инсталација програма погрешна. Може помоћи да се уклони и поново инсталира програм.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Кернел VirtualBox-а није исти као у овој верзији. Можда је инсталација програма погрешна. Покретање<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>требало би да поправи проблем. Проверите да не промешате верзију OSE и PUEL „VirtualBox-а“.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Кернел VirtualBox-а није исти као у овој верзији. Можда је инсталација програма погрешна. Покретање<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>требало би да поправи проблем. Проверите да не промешате верзију OSE и PUEL „VirtualBox-а“.</translation>
     </message>
     <message>
         <source>Kernel driver not accessible</source>
@@ -107,7 +107,7 @@
         <translation>Грешка знаћи да или кернел ноије успео да алоцира довољно меморије или да је нека мапажа погрешна.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
index a7df915..66db8f3 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
@@ -82,12 +82,12 @@
         <translation>Det kan hjälpa att installera om VirtualBox.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Detta fel betyder att kärndrivrutinen antingen inte kunde allokera tillräckligt mycket minne eller att någon mappningsåtgärd misslyckades.<br/><br/>Det finns kända problem med Linux 2.6.29. Om du kör en sådan kärna så redigera /usr/src/vboxdrv-*/Makefile och aktivera <i>VBOX_USE_INSERT_PAGE = 1</i>. Kompilera sedan om kärnmodulen genom att köra<br/><br/>  <font color=blue>"/etc/init.d/vboxdrv setup"& [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Detta fel betyder att kärndrivrutinen antingen inte kunde allokera tillräckligt mycket minne eller att någon mappningsåtgärd misslyckades.<br/><br/>Det finns kända problem med Linux 2.6.29. Om du kör en sådan kärna så redigera /usr/src/vboxdrv-*/Makefile och aktivera <i>VBOX_USE_INSERT_PAGE = 1</i>. Kompilera sedan om kärnmodulen genom att köra<br/><br/>  <font color=blue>"/sbin/rcvboxdrv setup"</ [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Linux-kärndrivrutinen för VirtualBox (vboxdrv) är antingen inte inläst eller så finns det ett behörighetsproblem med /dev/vboxdrv. Konfigurera om kärnmodulen genom att köra<br/><br/>  <font color=blue>"/etc/init.d/vboxdrv setup"</font><br/><br/> som root. Användare med Ubuntu, Fedora eller Mandriva bör installera DKMS-paketett först. Detta paket håller koll på ändringar i Linux-kärnan och kompilerar om kär [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Linux-kärndrivrutinen för VirtualBox (vboxdrv) är antingen inte inläst eller så finns det ett behörighetsproblem med /dev/vboxdrv. Konfigurera om kärnmodulen genom att köra<br/><br/>  <font color=blue>"/sbin/rcvboxdrv setup"</font><br/><br/> som root. Användare med Ubuntu, Fedora eller Mandriva bör installera DKMS-paketett först. Detta paket håller koll på ändringar i Linux-kärnan och kompilerar om kärnmod [...]
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -114,16 +114,16 @@
         <translation>VirtualBox kärnmoduler passar inte denna version av VirtualBox. Installationen av VirtualBox lyckades inte. Det kan hjälpa att helt avinstallera och sedan återinstallera VirtualBox.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>VirtualBox kärnmoduler passar inte denna version av VirtualBox. Installationen av VirtualBox lyckades inte. Kör kommandot<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>vilket bör rätta till problemet. Försäkra dig om att du inte blandar OSE-versionen och PUEL-versionen av VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>VirtualBox kärnmoduler passar inte denna version av VirtualBox. Installationen av VirtualBox lyckades inte. Kör kommandot<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>vilket bör rätta till problemet. Försäkra dig om att du inte blandar OSE-versionen och PUEL-versionen av VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Detta fel betyder att kärndrivrutinen inte kunde allokera tillräckligt mycket minne eller att någon mappningsåtgärd misslyckades.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Linux-kärndrivrutinen för VirtualBox (vboxdrv) är antingen inte inläst eller så finns det ett behörighetsproblem med /dev/vboxdrv. Installera om kärnmodulen genom att köra<br/><br/>  <font color=blue>"/etc/init.d/vboxdrv setup"</font><br/><br/> som root. Om den finns tillgänglig för din distribution så bör du installera DKMS-paketet först. Detta paket håller koll på ändringar i Linux-kärnan och kompilerar om kärnmodulen v [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Linux-kärndrivrutinen för VirtualBox (vboxdrv) är antingen inte inläst eller så finns det ett behörighetsproblem med /dev/vboxdrv. Installera om kärnmodulen genom att köra<br/><br/>  <font color=blue>"/sbin/rcvboxdrv setup"</font><br/><br/> som root. Om den finns tillgänglig för din distribution så bör du installera DKMS-paketet först. Detta paket håller koll på ändringar i Linux-kärnan och kompilerar om kärnmodulen vboxd [...]
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
index ab08429..8c6489c 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
@@ -132,16 +132,16 @@
         <translation>VirtualBox kernel modülleri VirtualBox'ın bu sürümüyle uyuşmuyor. VirtualBox'ın kurulumu görünüşe göre başarılı olmadı. Lütfen VirtualBox'ı tamamen kaldırmayı ve yeniden yüklemeyi deneyin.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>VirtualBox kernel modülleri VirtualBox'ın bu sürümüyle uyuşmuyor. VirtualBox'ın kurulumu görünüşe göre başarılı olmadı. <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> dosyasını çalıştırmak bunu düzeltebilir. VirtualBox'ın OSE ve PUEL sürümlerini karıştırmadığınızdan emin olun.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>VirtualBox kernel modülleri VirtualBox'ın bu sürümüyle uyuşmuyor. VirtualBox'ın kurulumu görünüşe göre başarılı olmadı. <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> dosyasını çalıştırmak bunu düzeltebilir. VirtualBox'ın OSE ve PUEL sürümlerini karıştırmadığınızdan emin olun.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>Bu hata kernel sürücüsünün ya yeterli bellek ayıramadığını ya da bazı planlama işleminin başarısız olduğu anlamına gelir.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>VirtualBox Linux kernel sürücüsü (vboxdrv) ya yüklenemiyor ya da /dev/vboxdrv ile ilgili izin sorunu var. Lütfen root olarak <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/> dosyasını çalıştırıp kernel modülünü yeniden yükleyin. Eğer dağıtımınızda mevcutsa, önce DKMS paketini yüklemelisiniz. Bu paket Linux kernel değişikliklerinin izini tutar ve eğer gerekirse vboxdrv kernel modülünü yeniden derle [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>VirtualBox Linux kernel sürücüsü (vboxdrv) ya yüklenemiyor ya da /dev/vboxdrv ile ilgili izin sorunu var. Lütfen root olarak <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/> dosyasını çalıştırıp kernel modülünü yeniden yükleyin. Eğer dağıtımınızda mevcutsa, önce DKMS paketini yüklemelisiniz. Bu paket Linux kernel değişikliklerinin izini tutar ve eğer gerekirse vboxdrv kernel modülünü yeniden derler.</ [...]
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
index 19eb138..e0a7691 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
@@ -67,20 +67,20 @@
         <translation>Будь ласка, перевстановіть VirtualBox.</translation>
     </message>
     <message>
-        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br [...]
-        <translation type="obsolete">Ця помилка означає, що драйвер ядра не зміг виділити достатньо пам'яті або не вдалось виконати відображення деякої операції.<br/><br/>Це відомі проблеми з версією ядра 2.6.29. Якщо ви запускаєте саме це ядро, будь ласка, редагуйте  /usr/src/vboxdrv-*/Makefile і ввімкніть <i>VBOX_USE_INSERT_PAGE = 1</i>. Після чого, перекомпілюйте модуль ядра, виконавши з-під адміністратора<br/><br/>  <font color=blue>&apo [...]
+        <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.<br/><br/>There are known problems with Linux 2.6.29. If you are running such a kernel, please edit /usr/src/vboxdrv-*/Makefile and enable <i>VBOX_USE_INSERT_PAGE = 1</i>. After that, re-compile the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/&gt [...]
+        <translation type="obsolete">Ця помилка означає, що драйвер ядра не зміг виділити достатньо пам'яті або не вдалось виконати відображення деякої операції.<br/><br/>Це відомі проблеми з версією ядра 2.6.29. Якщо ви запускаєте саме це ядро, будь ласка, редагуйте  /usr/src/vboxdrv-*/Makefile і ввімкніть <i>VBOX_USE_INSERT_PAGE = 1</i>. Після чого, перекомпілюйте модуль ядра, виконавши з-під адміністратора<br/><br/>  <font color=blue>&apo [...]
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">Драйвер ядра VirtualBox (vboxdrv) або не завантажений, або має проблеми з правами доступу /dev/vboxdrv. Перевстановіть модуль ядра, виконавши з-під адміністратора<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>. Користувачі Ubuntu, Fedora або Mandriva слід спочатку встановити DKMS. Цей пакунок утримує доріжку змін і перекомпіляцій модуля ядра vboxdrv, якщо це необхідно.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">Драйвер ядра VirtualBox (vboxdrv) або не завантажений, або має проблеми з правами доступу /dev/vboxdrv. Перевстановіть модуль ядра, виконавши з-під адміністратора<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>. Користувачі Ubuntu, Fedora або Mandriva слід спочатку встановити DKMS. Цей пакунок утримує доріжку змін і перекомпіляцій модуля ядра vboxdrv, якщо це необхідно.</translation>
     </message>
     <message>
         <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Please try completely uninstalling and reinstalling VirtualBox.</source>
         <translation>Модуль ядра VirtualBox не придатний для цієї версії VirtualBox. Напевно, встановлення VirtualBox закінчилось невдало. Вилучення і повторне встановлення може допомогти.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>Модуль ядра VirtualBox не придатний для цієї версії VirtualBox. Напевно, встановлення VirtualBox закінчилось невдало. Здійснення<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>має виправити цю проблему. Переконайтесь, що ви не змішували версію OSE та PUEL.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>Модуль ядра VirtualBox не придатний для цієї версії VirtualBox. Напевно, встановлення VirtualBox закінчилось невдало. Здійснення<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>має виправити цю проблему. Переконайтесь, що ви не змішували версію OSE та PUEL.</translation>
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -107,8 +107,8 @@
         <translation>Ця помилка означає, що драйвер ядра не має достатньо пам'яті або помилка певної операції відображення.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>Драйвер ядра VirtualBox для Linux (vboxdrv) або не завантажено, або проблема з доступом до /dev/vboxdrv. Перевстановіть модуль ядра, виконавши<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>з-під адміністратора, якщо це можливо у вашому дистрибутиві, споачтку слід установити пакунок DKMS. Цей пакунок слідкує за змінами у ядрі й перезбирує модуль ядра vboxdrv, якщо в цьому є потреба.</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>Драйвер ядра VirtualBox для Linux (vboxdrv) або не завантажено, або проблема з доступом до /dev/vboxdrv. Перевстановіть модуль ядра, виконавши<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>з-під адміністратора, якщо це можливо у вашому дистрибутиві, споачтку слід установити пакунок DKMS. Цей пакунок слідкує за змінами у ядрі й перезбирує модуль ядра vboxdrv, якщо в цьому є потреба.</translation>
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
index a03d3c1..52aea5b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
@@ -76,7 +76,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -84,7 +84,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
index 9d729c0..53d845f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
@@ -52,8 +52,8 @@
         <translation>重新安装VirtualBox可能解决该问题。</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
-        <translation type="obsolete">VirtualBox Linux 内核驱动程序 (vboxdrv) 没有加载,或 /dev/vboxdrv 有权限问题。请以 root 权限执行<br/><br/><font color=blue>“/etc/init.d/vboxdrv setup”</font><br/><br/>,以便重新安装核心模块。Ubuntu、Fedora 或 Mandriva 的用户应该首先安装 DKMS 软件包。此程序包跟踪 Linux 内核的更改,并在必要时重新编译 vboxdrv 内核模块。</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.</source>
+        <translation type="obsolete">VirtualBox Linux 内核驱动程序 (vboxdrv) 没有加载,或 /dev/vboxdrv 有权限问题。请以 root 权限执行<br/><br/><font color=blue>“/sbin/rcvboxdrv setup”</font><br/><br/>,以便重新安装核心模块。Ubuntu、Fedora 或 Mandriva 的用户应该首先安装 DKMS 软件包。此程序包跟踪 Linux 内核的更改,并在必要时重新编译 vboxdrv 内核模块。</translation>
     </message>
     <message>
         <source>Make sure the kernel module has been loaded successfully.</source>
@@ -80,16 +80,16 @@
         <translation>现有的内核模块与当前版本的VirtualBox不匹配。因此导致安装失败,请试着完全卸载VirtualBox后,再重新安装一次.</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>现有的内核模块与当前版本的VirtualBox不匹配。因此导致安装失败。可尝试执行 <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>以修复该问题。并确认你没有混合OSE和PUEL版本的VirtualBox.</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>现有的内核模块与当前版本的VirtualBox不匹配。因此导致安装失败。可尝试执行 <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>以修复该问题。并确认你没有混合OSE和PUEL版本的VirtualBox.</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>该错误意味着当前的内核驱动模块无法分配足够的内存或某些映射操作失败.</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>VirtualBox Linux 内核驱动程序 (vboxdrv) 没有加载,或 /dev/vboxdrv 有权限问题。请以 root 权限执行<br/><br/><font color=blue>“/etc/init.d/vboxdrv setup”</font><br/><br/>,以便重新安装内核模块。如果你所用的发行版bs有DKMS软件包,你应该首先安装之。此程序包跟踪 Linux 内核的更改,并在必要时重新编译 vboxdrv 内核模块。</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>VirtualBox Linux 内核驱动程序 (vboxdrv) 没有加载,或 /dev/vboxdrv 有权限问题。请以 root 权限执行<br/><br/><font color=blue>“/sbin/rcvboxdrv setup”</font><br/><br/>,以便重新安装内核模块。如果你所用的发行版bs有DKMS软件包,你应该首先安装之。此程序包跟踪 Linux 内核的更改,并在必要时重新编译 vboxdrv 内核模块。</translation>
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
index c175dad..6a766a7 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
@@ -76,16 +76,16 @@
         <translation>VirtualBox 核心模組不符合這個 VirtualBox 的版本。 顯然 VirtualBox 的安裝不成功。 請嘗試完整解除安裝並重新安裝 VirtualBox。</translation>
     </message>
     <message>
-        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
-        <translation>VirtualBox 核心模組不符合這個 VirtualBox 的版本。 顯然 VirtualBox 的安裝不成功。 執行<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>應能修正問題。 請確認您未混合 VirtualBox 的 OSE 版本與 PUEL 版本。</translation>
+        <source>The VirtualBox kernel modules do not match this version of VirtualBox. The installation of VirtualBox was apparently not successful. Executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>may correct this. Make sure that you do not mix the OSE version and the PUEL version of VirtualBox.</source>
+        <translation>VirtualBox 核心模組不符合這個 VirtualBox 的版本。 顯然 VirtualBox 的安裝不成功。 執行<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>應能修正問題。 請確認您未混合 VirtualBox 的 OSE 版本與 PUEL 版本。</translation>
     </message>
     <message>
         <source>This error means that the kernel driver was either not able to allocate enough memory or that some mapping operation failed.</source>
         <translation>這個錯誤代表核心驅動程式無法配置足夠的記憶體或某些對應操作失敗。</translation>
     </message>
     <message>
-        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
-        <translation>未載入 VirtualBox Linux 核心驅動程式 (vboxdrv) 或是 /dev/vboxdrv 的權限問題。 請以 root 執行 <br/><br/>  <font color=blue>'/etc/init.d/vboxdrv setup' 來重新安裝核心模組。 如果在您的發行中可以使用,您應先安裝 DKMS 套件。 這個套件保留 Linux 核心變更的追蹤並在需要時重新編譯 vboxdrv 核心模組。</translation>
+        <source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary. [...]
+        <translation>未載入 VirtualBox Linux 核心驅動程式 (vboxdrv) 或是 /dev/vboxdrv 的權限問題。 請以 root 執行 <br/><br/>  <font color=blue>'/sbin/rcvboxdrv setup' 來重新安裝核心模組。 如果在您的發行中可以使用,您應先安裝 DKMS 套件。 這個套件保留 Linux 核心變更的追蹤並在需要時重新編譯 vboxdrv 核心模組。</translation>
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.cpp b/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.cpp
index 9cb6065..c9beb94 100644
--- a/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.cpp
@@ -470,8 +470,8 @@ void UIVMLogViewer::refresh()
     bool isAnyLogPresent = false;
 
     const CSystemProperties &sys = vboxGlobal().virtualBox().GetSystemProperties();
-    int cMaxLogs = sys.GetLogHistoryCount();
-    for (int i=0; i <= cMaxLogs; ++i)
+    unsigned cMaxLogs = sys.GetLogHistoryCount() + 1 /*VBox.log*/ + 1 /*VBoxHardening.log*/; /** @todo Add api for getting total possible log count! */
+    for (unsigned i = 0; i < cMaxLogs; ++i)
     {
         /* Query the log file name for index i: */
         QString strFileName = m_machine.QueryLogFilename(i);
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.cpp b/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.cpp
index 6c314ab..94c2aad 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -19,26 +19,74 @@
 # include <precomp.h>
 #else  /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
-/* Global includes */
+/* Qt includes: */
 # include <QDir>
+# include <QDialogButtonBox>
 # include <QEvent>
+# include <QLabel>
 # include <QPainter>
-# include <iprt/path.h>
-# include <VBox/version.h> /* VBOX_VENDOR */
+# include <QPushButton>
 
-/* Local includes */
-# include "VBoxAboutDlg.h"
-# include "VBoxGlobal.h"
+/* GUI includes: */
 # include "UIConverter.h"
 # include "UIExtraDataManager.h"
 # include "UIIconPool.h"
+# include "VBoxAboutDlg.h"
+# include "VBoxGlobal.h"
 
-#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+/* Other VBox includes: */
+# include <iprt/path.h>
+# include <VBox/version.h> /* VBOX_VENDOR */
 
+#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
 VBoxAboutDlg::VBoxAboutDlg(QWidget *pParent, const QString &strVersion)
-    : QIWithRetranslateUI2<QIDialog>(pParent, Qt::CustomizeWindowHint | Qt::WindowTitleHint)
+    : QIWithRetranslateUI2<QIDialog>(pParent)
     , m_strVersion(strVersion)
+    , m_pLabel(0)
+{
+    /* Prepare: */
+    prepare();
+}
+
+bool VBoxAboutDlg::event(QEvent *pEvent)
+{
+    /* Set fixed-size for dialog: */
+    if (pEvent->type() == QEvent::Polish)
+        setFixedSize(m_size);
+    /* Call to base-class: */
+    return QIDialog::event(pEvent);
+}
+
+void VBoxAboutDlg::paintEvent(QPaintEvent* /* pEvent */)
+{
+    QPainter painter(this);
+    /* Draw About-VirtualBox background image: */
+    painter.drawPixmap(0, 0, m_pixmap);
+}
+
+void VBoxAboutDlg::retranslateUi()
+{
+    setWindowTitle(tr("VirtualBox - About"));
+    const QString strAboutText = tr("VirtualBox Graphical User Interface");
+#ifdef VBOX_BLEEDING_EDGE
+    const QString strVersionText = "EXPERIMENTAL build %1 - " + QString(VBOX_BLEEDING_EDGE);
+#else /* !VBOX_BLEEDING_EDGE */
+    const QString strVersionText = tr("Version %1");
+#endif /* !VBOX_BLEEDING_EDGE */
+#if VBOX_OSE
+    m_strAboutText = strAboutText + " " + strVersionText.arg(m_strVersion) + "\n" +
+                     QString("%1 2004-" VBOX_C_YEAR " " VBOX_VENDOR).arg(QChar(0xa9));
+#else /* !VBOX_OSE */
+    m_strAboutText = strAboutText + "\n" + strVersionText.arg(m_strVersion);
+#endif /* !VBOX_OSE */
+    m_strAboutText = m_strAboutText + "\n" + QString("Copyright %1 %2 %3 and/or its affiliates. All rights reserved.")
+                                                     .arg(QChar(0xa9)).arg(VBOX_C_YEAR).arg(VBOX_VENDOR);
+    AssertPtrReturnVoid(m_pLabel);
+    m_pLabel->setText(m_strAboutText);
+}
+
+void VBoxAboutDlg::prepare()
 {
     /* Delete dialog on close: */
     setAttribute(Qt::WA_DeleteOnClose);
@@ -47,7 +95,7 @@ VBoxAboutDlg::VBoxAboutDlg(QWidget *pParent, const QString &strVersion)
     QString strPath(":/about.png");
 
     /* Branding: Use a custom about splash picture if set: */
-    QString strSplash = vboxGlobal().brandingGetKey("UI/AboutSplash");
+    const QString strSplash = vboxGlobal().brandingGetKey("UI/AboutSplash");
     if (vboxGlobal().brandingIsActive() && !strSplash.isEmpty())
     {
         char szExecPath[1024];
@@ -58,67 +106,70 @@ VBoxAboutDlg::VBoxAboutDlg(QWidget *pParent, const QString &strVersion)
     }
 
     /* Load image: */
-    QIcon icon = UIIconPool::iconSet(strPath);
+    const QIcon icon = UIIconPool::iconSet(strPath);
     m_size = icon.availableSizes().first();
     m_pixmap = icon.pixmap(m_size);
 
+    /* Prepare main-layout: */
+    prepareMainLayout();
+
     /* Translate: */
     retranslateUi();
 }
 
-bool VBoxAboutDlg::event(QEvent *pEvent)
+void VBoxAboutDlg::prepareMainLayout()
 {
-    if (pEvent->type() == QEvent::Polish)
-        setFixedSize(m_size);
-    if (pEvent->type() == QEvent::WindowDeactivate)
-        close();
-    return QIDialog::event(pEvent);
-}
+    /* Create main-layout: */
+    m_pMainLayout = new QVBoxLayout(this);
+    AssertPtrReturnVoid(m_pMainLayout);
+    {
+        /* Prepare label: */
+        prepareLabel();
 
-void VBoxAboutDlg::paintEvent(QPaintEvent* /* pEvent */)
-{
-    QPainter painter(this);
-    painter.drawPixmap(0, 0, m_pixmap);
-    painter.setFont(font());
-
-    /* Branding: Set a different text color (because splash also could be white),
-                 otherwise use white as default color: */
-    QString strColor = vboxGlobal().brandingGetKey("UI/AboutTextColor");
-    if (!strColor.isEmpty())
-        painter.setPen(QColor(strColor).name());
-    else
-        painter.setPen(Qt::black);
-#if VBOX_OSE
-    painter.drawText(QRect(0, 400, 600, 32),
-                     Qt::AlignCenter | Qt::AlignVCenter | Qt::TextWordWrap,
-                     m_strAboutText);
-#else /* VBOX_OSE */
-    painter.drawText(QRect(271, 370, 360, 72),
-                     Qt::AlignLeft | Qt::AlignBottom | Qt::TextWordWrap,
-                     m_strAboutText);
-#endif /* VBOX_OSE */
+        /* Prepare close-button: */
+        prepareCloseButton();
+    }
 }
 
-void VBoxAboutDlg::mouseReleaseEvent(QMouseEvent* /* pEvent */)
+void VBoxAboutDlg::prepareLabel()
 {
-    /* Close the dialog on mouse button release: */
-    close();
+    /* Create label for version text: */
+    m_pLabel = new QLabel;
+    AssertPtrReturnVoid(m_pLabel);
+    {
+        /* Prepare label for version text: */
+        QPalette palette;
+        /* Branding: Set a different text color (because splash also could be white),
+         * otherwise use white as default color: */
+        const QString strColor = vboxGlobal().brandingGetKey("UI/AboutTextColor");
+        if (!strColor.isEmpty())
+            palette.setColor(QPalette::WindowText, QColor(strColor).name());
+        else
+            palette.setColor(QPalette::WindowText, Qt::black);
+        m_pLabel->setPalette(palette);
+        m_pLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
+        m_pLabel->setFont(font());
+
+        /* Add label to the main-layout: */
+        m_pMainLayout->addWidget(m_pLabel);
+        m_pMainLayout->setAlignment(m_pLabel, Qt::AlignRight | Qt::AlignBottom);
+    }
 }
 
-void VBoxAboutDlg::retranslateUi()
+void VBoxAboutDlg::prepareCloseButton()
 {
-    setWindowTitle(tr("VirtualBox - About"));
-    QString strAboutText =  tr("VirtualBox Graphical User Interface");
-#ifdef VBOX_BLEEDING_EDGE
-    QString strVersionText = "EXPERIMENTAL build %1 - " + QString(VBOX_BLEEDING_EDGE);
-#else
-    QString strVersionText = tr("Version %1");
-#endif
-#if VBOX_OSE
-    m_strAboutText = strAboutText + " " + strVersionText.arg(m_strVersion) + "\n" +
-                     QString("%1 2004-" VBOX_C_YEAR " " VBOX_VENDOR).arg(QChar(0xa9));
-#else /* VBOX_OSE */
-    m_strAboutText = strAboutText + "\n" + strVersionText.arg(m_strVersion);
-#endif /* VBOX_OSE */
+    /* Create button-box: */
+    QDialogButtonBox *pButtonBox = new QDialogButtonBox;
+    AssertPtrReturnVoid(pButtonBox);
+    {
+        /* Create close-button: */
+        QPushButton *pCloseButton = pButtonBox->addButton(QDialogButtonBox::Close);
+        AssertPtrReturnVoid(pCloseButton);
+        /* Prepare close-button: */
+        connect(pButtonBox, SIGNAL(rejected()), this, SLOT(reject()));
+
+        /* Add button-box to the main-layout: */
+        m_pMainLayout->addWidget(pButtonBox);
+    }
 }
 
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h b/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h
index e7fa18d..52fc8e5 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -15,47 +15,76 @@
  * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
  */
 
-#ifndef __VBoxAboutDlg_h__
-#define __VBoxAboutDlg_h__
+#ifndef ___VBoxAboutDlg_h___
+#define ___VBoxAboutDlg_h___
 
-/* Global includes */
+/* Qt includes: */
 #include <QPixmap>
 
-/* Local includes */
-#include "QIWithRetranslateUI.h"
+/* GUI includes: */
 #include "QIDialog.h"
+#include "QIWithRetranslateUI.h"
 
-/* Forward declarations */
+/* Forward declarations: */
 class QEvent;
+class QLabel;
+class QVBoxLayout;
 
-/* VBox about dialog */
-class VBoxAboutDlg: public QIWithRetranslateUI2<QIDialog>
+/** QIDialog extension
+  * used to show the About-VirtualBox dialog. */
+class VBoxAboutDlg : public QIWithRetranslateUI2<QIDialog>
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    VBoxAboutDlg(QWidget* pParent, const QString &strVersion);
+    /** Constructs dialog passing @a pParent to the QWidget base-class constructor.
+      * @param strVersion is used to specify the version number of VirtualBox. */
+    VBoxAboutDlg(QWidget *pParent, const QString &strVersion);
 
 protected:
 
-    /* Event handlers: */
+    /** Handles any Qt @a pEvent. */
     bool event(QEvent *pEvent);
+
+    /** Handles Qt paint @a pEvent. */
     void paintEvent(QPaintEvent *pEvent);
-    void mouseReleaseEvent(QMouseEvent *pEvent);
 
-    /* Language stuff: */
+    /** Handles translation event. */
     void retranslateUi();
 
 private:
 
-    /* Variables: */
+    /** Prepares About-VirtualBox dialog. */
+    void prepare();
+
+    /** Prepares main-layout. */
+    void prepareMainLayout();
+
+    /** Prepares label. */
+    void prepareLabel();
+
+    /** Prepares close-button. */
+    void prepareCloseButton();
+
+    /** Holds the About-VirtualBox text. */
     QString m_strAboutText;
+
+    /** Holds the VirtualBox version number. */
     QString m_strVersion;
+
+    /** Holds the About-VirtualBox image. */
     QPixmap m_pixmap;
+
+    /** Holds the About-VirtualBox dialog size. */
     QSize   m_size;
+
+    /** Holds the instance of label we create for About-VirtualBox text. */
+    QLabel *m_pLabel;
+
+    /** Holds the instance of main-layout we create. */
+    QVBoxLayout *m_pMainLayout;
 };
 
-#endif /* __VBoxAboutDlg_h__ */
+#endif /* !___VBoxAboutDlg_h___ */
 
diff --git a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h
index a455080..6ddcc7f 100644
--- a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h
+++ b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h
@@ -158,6 +158,7 @@ template<> QString toString(const DetailsElementType &detailsElementType);
 template<> DetailsElementType fromString<DetailsElementType>(const QString &strDetailsElementType);
 template<> QString toInternalString(const DetailsElementType &detailsElementType);
 template<> DetailsElementType fromInternalString<DetailsElementType>(const QString &strDetailsElementType);
+template<> QIcon toIcon(const DetailsElementType &detailsElementType);
 template<> QString toInternalString(const PreviewUpdateIntervalType &previewUpdateIntervalType);
 template<> PreviewUpdateIntervalType fromInternalString<PreviewUpdateIntervalType>(const QString &strPreviewUpdateIntervalType);
 template<> int toInternalInteger(const PreviewUpdateIntervalType &previewUpdateIntervalType);
diff --git a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
index 9838d3c..04941e4 100644
--- a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
@@ -976,6 +976,35 @@ template<> DetailsElementType fromInternalString<DetailsElementType>(const QStri
     return values.at(keys.indexOf(QRegExp(strDetailsElementType, Qt::CaseInsensitive)));
 }
 
+/* QIcon <= DetailsElementType: */
+template<> QIcon toIcon(const DetailsElementType &detailsElementType)
+{
+    switch (detailsElementType)
+    {
+        case DetailsElementType_General:     return UIIconPool::iconSet(":/machine_16px.png");
+        case DetailsElementType_Preview:     return UIIconPool::iconSet(":/machine_16px.png");
+        case DetailsElementType_System:      return UIIconPool::iconSet(":/chipset_16px.png");
+        case DetailsElementType_Display:     return UIIconPool::iconSet(":/vrdp_16px.png");
+        case DetailsElementType_Storage:     return UIIconPool::iconSet(":/hd_16px.png");
+        case DetailsElementType_Audio:       return UIIconPool::iconSet(":/sound_16px.png");
+        case DetailsElementType_Network:     return UIIconPool::iconSet(":/nw_16px.png");
+        case DetailsElementType_Serial:      return UIIconPool::iconSet(":/serial_port_16px.png");
+#ifdef VBOX_WITH_PARALLEL_PORTS
+        case DetailsElementType_Parallel:    return UIIconPool::iconSet(":/parallel_port_16px.png");
+#endif /* VBOX_WITH_PARALLEL_PORTS */
+        case DetailsElementType_USB:         return UIIconPool::iconSet(":/usb_16px.png");
+        case DetailsElementType_SF:          return UIIconPool::iconSet(":/sf_16px.png");
+        case DetailsElementType_UI:          return UIIconPool::iconSet(":/interface_16px.png");
+        case DetailsElementType_Description: return UIIconPool::iconSet(":/description_16px.png");
+        default:
+        {
+            AssertMsgFailed(("No icon for details element type=%d", detailsElementType));
+            break;
+        }
+    }
+    return QIcon();
+}
+
 /* QString <= PreviewUpdateIntervalType: */
 template<> QString toInternalString(const PreviewUpdateIntervalType &previewUpdateIntervalType)
 {
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp
index 13e9ccf..20d5405 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -256,10 +256,34 @@ void QIMessageBox::prepare()
             }
             /* Add button-box into main-layout: */
             pMainLayout->addWidget(m_pButtonBox);
+
+            /* Prepare focus. It is important to prepare focus after adding button-box to the layout as
+             * parenting the button-box to the QDialog changes default button focus by Qt: */
+            prepareFocus();
         }
     }
 }
 
+void QIMessageBox::prepareFocus()
+{
+    /* Configure default button and focus: */
+    if (m_pButton1 && (m_iButton1 & AlertButtonOption_Default))
+    {
+        m_pButton1->setDefault(true);
+        m_pButton1->setFocus();
+    }
+    if (m_pButton2 && (m_iButton2 & AlertButtonOption_Default))
+    {
+        m_pButton2->setDefault(true);
+        m_pButton2->setFocus();
+    }
+    if (m_pButton3 && (m_iButton3 & AlertButtonOption_Default))
+    {
+        m_pButton3->setDefault(true);
+        m_pButton3->setFocus();
+    }
+}
+
 QPushButton* QIMessageBox::createButton(int iButton)
 {
     /* Not for AlertButton_NoButton: */
@@ -284,12 +308,6 @@ QPushButton* QIMessageBox::createButton(int iButton)
     /* Create push-button: */
     QPushButton *pButton = m_pButtonBox->addButton(strText, role);
 
-    /* Configure <default> button: */
-    if (iButton & AlertButtonOption_Default)
-    {
-        pButton->setDefault(true);
-        pButton->setFocus();
-    }
     /* Configure <escape> button: */
     if (iButton & AlertButtonOption_Escape)
         m_iButtonEsc = iButton & AlertButtonMask;
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h
index f155a20..71210d7 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,12 +25,12 @@
 #include "QIDialog.h"
 
 /* Forward declarations: */
-class QLabel;
-class QILabel;
-class QPushButton;
 class QCheckBox;
 class QIArrowSplitter;
 class QIDialogButtonBox;
+class QILabel;
+class QLabel;
+class QPushButton;
 
 /** Button types. */
 enum AlertButton
@@ -122,9 +122,12 @@ private slots:
 
 private:
 
-    /** Prepare routine. */
+    /** Prepares message-box. */
     void prepare();
 
+    /** Prepares focus. */
+    void prepareFocus();
+
     /** Push-button factory. */
     QPushButton* createButton(int iButton);
 
@@ -182,3 +185,4 @@ private:
 };
 
 #endif /* !___QIMessageBox_h___ */
+
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
index 2021d34..ae9facf 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
@@ -462,9 +462,14 @@ protected:
         return QString("Close");
     }
 
-    QKeySequence defaultShortcut(UIActionPoolType) const
+    QKeySequence defaultShortcut(UIActionPoolType actionPoolType) const
     {
-        return QKeySequence("Q");
+        switch (actionPoolType)
+        {
+            case UIActionPoolType_Selector: break;
+            case UIActionPoolType_Runtime: return QKeySequence("Q");
+        }
+        return QKeySequence();
     }
 
     void retranslateUi()
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
index 966d585..91c0223 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
@@ -95,12 +95,14 @@ using namespace UIDefs /* if header included */;
 /** Mac OS X: Known OS releases. */
 enum MacOSXRelease
 {
-    MacOSXRelease_Unknown,
+    MacOSXRelease_Old,
     MacOSXRelease_SnowLeopard,
     MacOSXRelease_Lion,
     MacOSXRelease_MountainLion,
     MacOSXRelease_Mavericks,
-    MacOSXRelease_Yosemite
+    MacOSXRelease_Yosemite,
+    MacOSXRelease_ElCapitan,
+    MacOSXRelease_New,
 };
 #endif /* Q_WS_MAC */
 
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
index d0048cd..d9e91c6 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
@@ -43,6 +43,7 @@
 # include "CKeyboardLedsChangedEvent.h"
 # include "CStateChangedEvent.h"
 # include "CNetworkAdapterChangedEvent.h"
+# include "CStorageDeviceChangedEvent.h"
 # include "CMediumChangedEvent.h"
 # include "CUSBDevice.h"
 # include "CUSBDeviceStateChangedEvent.h"
@@ -186,6 +187,12 @@ STDMETHODIMP UIMainEventListener::HandleEvent(VBoxEventType_T /* type */, IEvent
             emit sigNetworkAdapterChange(es.GetNetworkAdapter());
             break;
         }
+        case KVBoxEventType_OnStorageDeviceChanged:
+        {
+            CStorageDeviceChangedEvent es(pEvent);
+            emit sigStorageDeviceChange(es.GetStorageDevice(), es.GetRemoved(), es.GetSilent());
+            break;
+        }
         case KVBoxEventType_OnMediumChanged:
         {
             CMediumChangedEvent es(pEvent);
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
index 937992c..ccdd38b 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
@@ -84,6 +84,8 @@ signals:
     void sigAdditionsChange();
     /** Notifies about network @a adapter state change. */
     void sigNetworkAdapterChange(CNetworkAdapter adapter);
+    /** Notifies about storage device change for @a attachment, which was @a fRemoved and it was @a fSilent for guest. */
+    void sigStorageDeviceChange(CMediumAttachment attachment, bool fRemoved, bool fSilent);
     /** Notifies about storage medium @a attachment state change. */
     void sigMediumChange(CMediumAttachment attachment);
     /** Notifies about VRDE device state change. */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
index d70e9f6..e39d8f1 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
@@ -216,16 +216,26 @@ bool UIMessageCenter::questionBinary(QWidget *pParent, MessageType type,
                                      const QString &strMessage,
                                      const char *pcszAutoConfirmId /* = 0*/,
                                      const QString &strOkButtonText /* = QString()*/,
-                                     const QString &strCancelButtonText /* = QString()*/) const
+                                     const QString &strCancelButtonText /* = QString()*/,
+                                     bool fDefaultFocusForOk /* = true*/) const
 {
-    return (question(pParent, type, strMessage, pcszAutoConfirmId,
-                     AlertButton_Ok | AlertButtonOption_Default,
-                     AlertButton_Cancel | AlertButtonOption_Escape,
-                     0 /* third button */,
-                     strOkButtonText,
-                     strCancelButtonText,
-                     QString() /* third button */) &
-            AlertButtonMask) == AlertButton_Ok;
+    return fDefaultFocusForOk ?
+           ((question(pParent, type, strMessage, pcszAutoConfirmId,
+                      AlertButton_Ok | AlertButtonOption_Default,
+                      AlertButton_Cancel | AlertButtonOption_Escape,
+                      0 /* third button */,
+                      strOkButtonText,
+                      strCancelButtonText,
+                      QString() /* third button */) &
+             AlertButtonMask) == AlertButton_Ok) :
+           ((question(pParent, type, strMessage, pcszAutoConfirmId,
+                      AlertButton_Ok,
+                      AlertButton_Cancel | AlertButtonOption_Default | AlertButtonOption_Escape,
+                      0 /* third button */,
+                      strOkButtonText,
+                      strCancelButtonText,
+                      QString() /* third button */) &
+             AlertButtonMask) == AlertButton_Ok);
 }
 
 int UIMessageCenter::questionTrinary(QWidget *pParent, MessageType type,
@@ -599,7 +609,9 @@ bool UIMessageCenter::confirmMachineItemRemoval(const QStringList &names) const
                              "<p><b>%1</b></p><p>Do you wish to proceed?</p>")
                              .arg(names.join(", ")),
                           0 /* auto-confirm id */,
-                          tr("Remove"));
+                          tr("Remove") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 int UIMessageCenter::confirmMachineRemoval(const QList<CMachine> &machines) const
@@ -669,16 +681,16 @@ int UIMessageCenter::confirmMachineRemoval(const QList<CMachine> &machines) cons
            message(0, MessageType_Question,
                    strText, QString(),
                    0 /* auto-confirm id */,
-                   AlertButton_Ok | AlertButtonOption_Default,
-                   AlertButton_Cancel | AlertButtonOption_Escape,
+                   AlertButton_Ok,
+                   AlertButton_Cancel | AlertButtonOption_Default | AlertButtonOption_Escape,
                    0,
                    tr("Remove")) :
            message(0, MessageType_Question,
                    strText, QString(),
                    0 /* auto-confirm id */,
                    AlertButton_Choice1,
-                   AlertButton_Choice2 | AlertButtonOption_Default,
-                   AlertButton_Cancel | AlertButtonOption_Escape,
+                   AlertButton_Choice2,
+                   AlertButton_Cancel | AlertButtonOption_Default | AlertButtonOption_Escape,
                    tr("Delete all files"),
                    tr("Remove only"));
 }
@@ -830,8 +842,8 @@ int UIMessageCenter::confirmSnapshotRestoring(const QString &strSnapshotName, bo
                                 .arg(strSnapshotName),
                              tr("Create a snapshot of the current machine state"),
                              !gEDataManager->messagesWithInvertedOption().contains("confirmSnapshotRestoring"),
-                             AlertButton_Ok | AlertButtonOption_Default,
-                             AlertButton_Cancel | AlertButtonOption_Escape,
+                             AlertButton_Ok,
+                             AlertButton_Cancel | AlertButtonOption_Default | AlertButtonOption_Escape,
                              0 /* 3rd button */,
                              tr("Restore"), tr("Cancel"), QString() /* 3rd button text */) :
            message(0, MessageType_Question,
@@ -839,8 +851,8 @@ int UIMessageCenter::confirmSnapshotRestoring(const QString &strSnapshotName, bo
                       .arg(strSnapshotName),
                    QString() /* details */,
                    0 /* auto-confirm id */,
-                   AlertButton_Ok | AlertButtonOption_Default,
-                   AlertButton_Cancel | AlertButtonOption_Escape,
+                   AlertButton_Ok,
+                   AlertButton_Cancel | AlertButtonOption_Default | AlertButtonOption_Escape,
                    0 /* 3rd button */,
                    tr("Restore"), tr("Cancel"), QString() /* 3rd button text */);
 }
@@ -854,7 +866,9 @@ bool UIMessageCenter::confirmSnapshotRemoval(const QString &strSnapshotName) con
                              "</p>Are you sure you want to delete the selected snapshot <b>%1</b>?</p>")
                              .arg(strSnapshotName),
                           0 /* auto-confirm id */,
-                          tr("Delete"));
+                          tr("Delete") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 bool UIMessageCenter::warnAboutSnapshotRemovalFreeSpace(const QString &strSnapshotName,
@@ -869,7 +883,9 @@ bool UIMessageCenter::warnAboutSnapshotRemovalFreeSpace(const QString &strSnapsh
                               "the snapshot at your own risk.</p>")
                               .arg(strSnapshotName, strTargetImageName, strTargetImageMaxSize, strTargetFileSystemFree),
                           0 /* auto-confirm id */,
-                          tr("Delete"));
+                          tr("Delete") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 void UIMessageCenter::cannotTakeSnapshot(const CMachine &machine, const QString &strMachineName, QWidget *pParent /* = 0*/) const
@@ -940,7 +956,9 @@ bool UIMessageCenter::confirmNATNetworkRemoval(const QString &strName, QWidget *
                              "type.</p>")
                              .arg(strName),
                           0 /* auto-confirm id */,
-                          tr("Remove"));
+                          tr("Remove") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 bool UIMessageCenter::confirmHostOnlyInterfaceRemoval(const QString &strName, QWidget *pParent /* = 0*/) const
@@ -956,7 +974,9 @@ bool UIMessageCenter::confirmHostOnlyInterfaceRemoval(const QString &strName, QW
                              "name or a different adapter attachment type.</p>")
                              .arg(strName),
                           0 /* auto-confirm id */,
-                          tr("Remove"));
+                          tr("Remove") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 void UIMessageCenter::cannotCreateNATNetwork(const CVirtualBox &vbox, QWidget *pParent /* = 0*/)
@@ -1104,7 +1124,9 @@ int UIMessageCenter::confirmRemovingOfLastDVDDevice(QWidget *pParent /* = 0*/) c
                              "<p>You will not be able to insert any optical disks or ISO images "
                              "or install the Guest Additions without it!</p>"),
                           0 /* auto-confirm id */,
-                          tr("&Remove", "medium"));
+                          tr("&Remove", "medium") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 void UIMessageCenter::cannotAttachDevice(const CMachine &machine, UIMediumType type,
@@ -1183,7 +1205,11 @@ bool UIMessageCenter::confirmCancelingPortForwardingDialog(QWidget *pParent /* =
 {
     return questionBinary(pParent, MessageType_Question,
                           tr("<p>There are unsaved changes in the port forwarding configuration.</p>"
-                             "<p>If you proceed your changes will be discarded.</p>"));
+                             "<p>If you proceed your changes will be discarded.</p>"),
+                          0 /* auto-confirm id */,
+                          QString() /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 void UIMessageCenter::cannotCreateSharedFolder(const CMachine &machine, const QString &strName, const QString &strPath, QWidget *pParent /* = 0*/)
@@ -1310,8 +1336,10 @@ bool UIMessageCenter::confirmMediumRemoval(const UIMedium &medium, QWidget *pPar
     /* Show the question: */
     return questionBinary(pParent, MessageType_Question,
                           strMessage.arg(medium.location()),
-                          "confirmMediumRemoval" /* auto-confirm id */,
-                          tr("Remove", "medium"));
+                          0 /* auto-confirm id */,
+                          tr("Remove", "medium") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 int UIMessageCenter::confirmDeleteHardDiskStorage(const QString &strLocation, QWidget *pParent /* = 0*/) const
@@ -2296,7 +2324,9 @@ bool UIMessageCenter::confirmRemoveExtensionPack(const QString &strPackName, QWi
                              "<p>Are you sure you want to proceed?</p>")
                              .arg(strPackName),
                           0 /* auto-confirm id */,
-                          tr("&Remove"));
+                          tr("&Remove") /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 void UIMessageCenter::cannotOpenExtPack(const QString &strFilename, const CExtPackManager &extPackManager, QWidget *pParent /* = 0*/) const
@@ -2402,7 +2432,11 @@ bool UIMessageCenter::confirmOverridingFile(const QString &strPath, QWidget *pPa
                           tr("A file named <b>%1</b> already exists. "
                              "Are you sure you want to replace it?<br /><br />"
                              "Replacing it will overwrite its contents.")
-                             .arg(strPath));
+                             .arg(strPath),
+                          0 /* auto-confirm id */,
+                          QString() /* ok button text */,
+                          QString() /* cancel button text */,
+                          false /* ok button by default? */);
 }
 
 bool UIMessageCenter::confirmOverridingFiles(const QVector<QString> &strPaths, QWidget *pParent /* = 0*/) const
@@ -2415,7 +2449,11 @@ bool UIMessageCenter::confirmOverridingFiles(const QVector<QString> &strPaths, Q
                               tr("The following files already exist:<br /><br />%1<br /><br />"
                                  "Are you sure you want to replace them? "
                                  "Replacing them will overwrite their contents.")
-                                 .arg(QStringList(strPaths.toList()).join("<br />")));
+                                 .arg(QStringList(strPaths.toList()).join("<br />")),
+                              0 /* auto-confirm id */,
+                              QString() /* ok button text */,
+                              QString() /* cancel button text */,
+                              false /* ok button by default? */);
     else
         return true;
 }
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
index ecb34fd..f422afa 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
@@ -120,7 +120,8 @@ public:
                         const QString &strMessage,
                         const char *pcszAutoConfirmId = 0,
                         const QString &strOkButtonText = QString(),
-                        const QString &strCancelButtonText = QString()) const;
+                        const QString &strCancelButtonText = QString(),
+                        bool fDefaultFocusForOk = true) const;
 
     /* API: Wrapper to 'question' function,
      * Question providing three buttons (Yes, No and Cancel by default): */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp
index 48a8871..75d3161 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp
@@ -186,8 +186,12 @@ void UIShortcutPool::sltReloadSelectorShortcuts()
     foreach (const QString &strShortcutKey, shortcutKeyList)
         if (strShortcutKey.startsWith(GUI_Input_SelectorShortcuts))
             m_shortcuts.remove(strShortcutKey);
+
+    /* Load selector defaults: */
+    loadDefaultsFor(GUI_Input_SelectorShortcuts);
     /* Load selector overrides: */
     loadOverridesFor(GUI_Input_SelectorShortcuts);
+
     /* Notify selector shortcuts reloaded: */
     emit sigSelectorShortcutsReloaded();
 }
@@ -199,8 +203,12 @@ void UIShortcutPool::sltReloadMachineShortcuts()
     foreach (const QString &strShortcutKey, shortcutKeyList)
         if (strShortcutKey.startsWith(GUI_Input_MachineShortcuts))
             m_shortcuts.remove(strShortcutKey);
+
+    /* Load machine defaults: */
+    loadDefaultsFor(GUI_Input_MachineShortcuts);
     /* Load machine overrides: */
     loadOverridesFor(GUI_Input_MachineShortcuts);
+
     /* Notify machine shortcuts reloaded: */
     emit sigMachineShortcutsReloaded();
 }
@@ -245,10 +253,27 @@ void UIShortcutPool::retranslateUi()
 
 void UIShortcutPool::loadDefaults()
 {
-    /* Default shortcut for the Runtime Popup Menu invokation: */
-    m_shortcuts.insert(m_sstrShortcutKeyTemplateRuntime.arg("PopupMenu"),
-                       UIShortcut(QApplication::translate("UIActionPool", "Popup Menu"),
-                                  QString("Home"), QString("Home")));
+    /* Load selector defaults: */
+    loadDefaultsFor(GUI_Input_SelectorShortcuts);
+    /* Load machine defaults: */
+    loadDefaultsFor(GUI_Input_MachineShortcuts);
+}
+
+void UIShortcutPool::loadDefaultsFor(const QString &strPoolExtraDataID)
+{
+    /* Default shortcuts for Selector UI: */
+    if (strPoolExtraDataID == GUI_Input_SelectorShortcuts)
+    {
+        /* Nothing for now.. */
+    }
+    /* Default shortcuts for Runtime UI: */
+    else if (strPoolExtraDataID == GUI_Input_MachineShortcuts)
+    {
+        /* Default shortcut for the Runtime Popup Menu: */
+        m_shortcuts.insert(m_sstrShortcutKeyTemplateRuntime.arg("PopupMenu"),
+                           UIShortcut(QApplication::translate("UIActionPool", "Popup Menu"),
+                                      QString("Home"), QString("Home")));
+    }
 }
 
 void UIShortcutPool::loadOverrides()
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
index a2af3f5..61016b4 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
@@ -122,6 +122,7 @@ private:
 
     /* Helpers: Shortcuts stuff: */
     void loadDefaults();
+    void loadDefaultsFor(const QString &strPoolExtraDataID);
     void loadOverrides();
     void loadOverridesFor(const QString &strPoolExtraDataID);
     void saveOverrides();
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.cpp
index 51d500f..5cde361 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.cpp
@@ -1,10 +1,10 @@
 /* $Id: UIThreadPool.cpp $ */
 /** @file
- * VBox Qt GUI - UIThreadPool and UITask class implementation.
+ * VBox Qt GUI - UIThreadPool and UITask classes implementation.
  */
 
 /*
- * Copyright (C) 2013 Oracle Corporation
+ * Copyright (C) 2013-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -32,96 +32,147 @@
 
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
-
-/**
- * COM capable worker thread for the UIThreadPool.
- */
+/** QThread extension used as worker-thread.
+  * Capable of executing COM-related tasks. */
 class UIThreadWorker : public QThread
 {
     Q_OBJECT;
 
 signals:
 
-    /* Notifier: Worker stuff: */
+    /** Notifies listeners about @a pWorker finished. */
     void sigFinished(UIThreadWorker *pWorker);
 
 public:
 
-    /* Constructor: */
+    /** Constructs worker-thread for parent worker-thread @a pPool.
+      * @param iIndex defines worker-thread index within the worker-thread pool registry. */
     UIThreadWorker(UIThreadPool *pPool, int iIndex);
 
-    int getIndex() const { return m_iIndex; }
+    /** Returns worker-thread index within the worker-thread pool registry. */
+    int index() const { return m_iIndex; }
 
-    /** Disables sigFinished. For optimizing pool termination. */
-    void setNoFinishedSignal()
-    {
-        m_fNoFinishedSignal = true;
-    }
+    /** Disables sigFinished signal, for optimizing worker-thread pool termination. */
+    void setNoFinishedSignal() { m_fNoFinishedSignal = true; }
 
 private:
 
-    /* Helper: Worker stuff: */
+    /** Contains the worker-thread body. */
     void run();
 
-    /* Variables: General stuff: */
+    /** Holds the worker-thread pool reference. */
     UIThreadPool *m_pPool;
 
-    /** The index into UIThreadPool::m_workers. */
+    /** Holds the worker-thread index within the worker-thread pool registry. */
     int m_iIndex;
-    /** Indicates whether sigFinished should be emitted or not. */
+
+    /** Holds whether sigFinished signal should be emitted or not. */
     bool m_fNoFinishedSignal;
 };
 
-
 UIThreadPool::UIThreadPool(ulong cMaxWorkers /* = 3 */, ulong cMsWorkerIdleTimeout /* = 5000 */)
-    : m_workers(cMaxWorkers)
-    , m_cMsIdleTimeout(cMsWorkerIdleTimeout)
+    : m_cMsIdleTimeout(cMsWorkerIdleTimeout)
+    , m_workers(cMaxWorkers)
     , m_cWorkers(0)
     , m_cIdleWorkers(0)
-    , m_fTerminating(false) /* termination status */
+    , m_fTerminating(false)
 {
 }
 
 UIThreadPool::~UIThreadPool()
 {
-    /* Set termination status and alert all idle worker threads: */
+    /* Set termination status: */
     setTerminating();
 
-    m_everythingLocker.lock(); /* paranoia */
+    /* Lock initially: */
+    m_everythingLocker.lock();
 
     /* Cleanup all the workers: */
     for (int idxWorker = 0; idxWorker < m_workers.size(); ++idxWorker)
     {
-        UIThreadWorker *pWorker = m_workers[idxWorker];
-        m_workers[idxWorker] = NULL;
+        /* Acquire the worker: */
+        UIThreadWorker *pWorker = m_workers.at(idxWorker);
+        /* Remove it from the registry: */
+        m_workers[idxWorker] = 0;
 
-        /* Clean up the worker, if there was one. */
+        /* Clean up the worker, if there was one: */
         if (pWorker)
         {
-            m_cWorkers--;
+            /* Decrease the number of workers: */
+            --m_cWorkers;
+            /* Unlock temporary to let the worker finish: */
             m_everythingLocker.unlock();
-
+            /* Wait for the worker to finish: */
             pWorker->wait();
-
+            /* Lock again: */
             m_everythingLocker.lock();
+            /* Delete the worker finally: */
             delete pWorker;
         }
     }
 
+    /* Cleanup all the tasks: */
+    qDeleteAll(m_pendingTasks);
+    qDeleteAll(m_executingTasks);
+    m_pendingTasks.clear();
+    m_executingTasks.clear();
+
+    /* Unlock finally: */
+    m_everythingLocker.unlock();
+}
+
+bool UIThreadPool::isTerminating() const
+{
+    /* Lock initially: */
+    m_everythingLocker.lock();
+
+    /* Acquire termination-flag: */
+    bool fTerminating = m_fTerminating;
+
+    /* Unlock finally: */
+    m_everythingLocker.unlock();
+
+    /* Return termination-flag: */
+    return fTerminating;
+}
+
+void UIThreadPool::setTerminating()
+{
+    /* Lock initially: */
+    m_everythingLocker.lock();
+
+    /* Assign termination-flag: */
+    m_fTerminating = true;
+
+    /* Tell all threads to NOT queue any termination signals: */
+    for (int idxWorker = 0; idxWorker < m_workers.size(); ++idxWorker)
+    {
+        UIThreadWorker *pWorker = m_workers.at(idxWorker);
+        if (pWorker)
+            pWorker->setNoFinishedSignal();
+    }
+
+    /* Wake up all idle worker threads: */
+    m_taskCondition.wakeAll();
+
+    /* Unlock finally: */
     m_everythingLocker.unlock();
 }
 
 void UIThreadPool::enqueueTask(UITask *pTask)
 {
-    Assert(!isTerminating());
+    /* Do nothing if terminating: */
+    AssertReturnVoid(!isTerminating());
 
     /* Prepare task: */
-    connect(pTask, SIGNAL(sigComplete(UITask*)), this, SLOT(sltHandleTaskComplete(UITask*)), Qt::QueuedConnection);
+    connect(pTask, SIGNAL(sigComplete(UITask*)),
+            this, SLOT(sltHandleTaskComplete(UITask*)), Qt::QueuedConnection);
 
+    /* Lock initially: */
     m_everythingLocker.lock();
 
-    /* Put the task onto the queue: */
-    m_tasks.enqueue(pTask);
+    /* Put the task into the queue: */
+    m_pendingTasks.enqueue(pTask);
 
     /* Wake up an idle worker if we got one: */
     if (m_cIdleWorkers > 0)
@@ -134,105 +185,80 @@ void UIThreadPool::enqueueTask(UITask *pTask)
         /* Find free slot: */
         int idxFirstUnused = m_workers.size();
         while (idxFirstUnused-- > 0)
-            if (m_workers[idxFirstUnused] == NULL)
+            if (m_workers.at(idxFirstUnused) == 0)
             {
                 /* Prepare the new worker: */
                 UIThreadWorker *pWorker = new UIThreadWorker(this, idxFirstUnused);
-                connect(pWorker, SIGNAL(sigFinished(UIThreadWorker*)), this,
-                        SLOT(sltHandleWorkerFinished(UIThreadWorker*)), Qt::QueuedConnection);
+                connect(pWorker, SIGNAL(sigFinished(UIThreadWorker*)),
+                        this, SLOT(sltHandleWorkerFinished(UIThreadWorker*)), Qt::QueuedConnection);
                 m_workers[idxFirstUnused] = pWorker;
-                m_cWorkers++;
+                ++m_cWorkers;
 
                 /* And start it: */
                 pWorker->start();
                 break;
             }
     }
-    /* else: wait for some worker to complete whatever it's busy with and jump to it. */
-
-    m_everythingLocker.unlock();
-}
-
-/**
- * Checks if the thread pool is terminating.
- *
- * @returns @c true if terminating, @c false if not.
- * @note    Do NOT call this while owning the thread pool mutex!
- */
-bool UIThreadPool::isTerminating() const
-{
-    /* Acquire termination-flag: */
-    m_everythingLocker.lock();
-    bool fTerminating = m_fTerminating;
-    m_everythingLocker.unlock();
-
-    return fTerminating;
-}
-
-void UIThreadPool::setTerminating()
-{
-    m_everythingLocker.lock();
-
-    /* Indicate that we're terminating: */
-    m_fTerminating = true;
-
-    /* Tell all threads to NOT queue any termination signals: */
-    for (int idxWorker = 0; idxWorker < m_workers.size(); ++idxWorker)
-    {
-        UIThreadWorker *pWorker = m_workers[idxWorker];
-        if (pWorker)
-            pWorker->setNoFinishedSignal();
-    }
-
-    /* Wake up all idle worker threads: */
-    m_taskCondition.wakeAll();
+    /* else: wait for some worker to complete
+     * whatever it's busy with and jump to it. */
 
+    /* Unlock finally: */
     m_everythingLocker.unlock();
 }
 
 UITask* UIThreadPool::dequeueTask(UIThreadWorker *pWorker)
 {
-    /* Dequeue a task, watching out for terminations.
-     * For opimal efficiency in enqueueTask() we keep count of idle threads.
-     * If the wait times out, we'll return NULL and terminate the thread. */
+    /* Lock initially: */
     m_everythingLocker.lock();
 
+    /* Dequeue a task, watching out for terminations.
+     * For optimal efficiency in enqueueTask() we keep count of idle threads.
+     * If the wait times out, we'll return 0 and terminate the thread. */
     bool fIdleTimedOut = false;
     while (!m_fTerminating)
     {
-        Assert(m_workers[pWorker->getIndex()] == pWorker); /* paranoia */
+        /* Make sure that worker has proper index: */
+        Assert(m_workers.at(pWorker->index()) == pWorker);
 
         /* Dequeue task if there is one: */
-        if (!m_tasks.isEmpty())
+        if (!m_pendingTasks.isEmpty())
         {
-            UITask *pTask = m_tasks.dequeue();
+            UITask *pTask = m_pendingTasks.dequeue();
             if (pTask)
             {
+                /* Put into the set of executing tasks: */
+                m_executingTasks << pTask;
+
+                /* Unlock finally: */
                 m_everythingLocker.unlock();
+
+                /* Return dequeued task: */
                 return pTask;
             }
         }
 
         /* If we timed out already, then quit the worker thread. To prevent a
-           race between enqueueTask and the queue removal of the thread from
-           the workers vector, we remove it here already. (This does not apply
-           to the termination scenario.) */
+         * race between enqueueTask and the queue removal of the thread from
+         * the workers vector, we remove it here already. (This does not apply
+         * to the termination scenario.) */
         if (fIdleTimedOut)
         {
-            m_workers[pWorker->getIndex()] = NULL;
-            m_cWorkers--;
+            m_workers[pWorker->index()] = 0;
+            --m_cWorkers;
             break;
         }
 
-        /* Wait for a task or timeout.*/
-        m_cIdleWorkers++;
+        /* Wait for a task or timeout: */
+        ++m_cIdleWorkers;
         fIdleTimedOut = !m_taskCondition.wait(&m_everythingLocker, m_cMsIdleTimeout);
-        m_cIdleWorkers--;
+        --m_cIdleWorkers;
     }
 
+    /* Unlock finally: */
     m_everythingLocker.unlock();
 
-    return NULL;
+    /* Return 0 by default: */
+    return 0;
 }
 
 void UIThreadPool::sltHandleTaskComplete(UITask *pTask)
@@ -241,39 +267,39 @@ void UIThreadPool::sltHandleTaskComplete(UITask *pTask)
     if (isTerminating())
         return;
 
-    /* Notify listener: */
+    /* Notify listeners: */
     emit sigTaskComplete(pTask);
+
+    /* Lock initially: */
+    m_everythingLocker.lock();
+
+    /* Delete task finally: */
+    if (   !m_executingTasks.contains(pTask)
+        || !m_executingTasks.remove(pTask))
+        AssertMsgFailed(("Unable to find or remove complete task!"));
+    delete pTask;
+
+    /* Unlock finally: */
+    m_everythingLocker.unlock();
 }
 
 void UIThreadPool::sltHandleWorkerFinished(UIThreadWorker *pWorker)
 {
     /* Wait for the thread to finish completely, then delete the thread
-       object. We have already removed the thread from the workers vector.
-       Note! We don't want to use 'this' here, in case it's invalid. */
+     * object. We have already removed the thread from the workers vector.
+     * Note! We don't want to use 'this' here, in case it's invalid. */
     pWorker->wait();
     delete pWorker;
 }
 
-
-UITask::UITask(const QVariant &data)
-    : m_data(data)
-{
-}
-
-const QVariant& UITask::data() const
-{
-    return m_data;
-}
-
 void UITask::start()
 {
     /* Run task: */
     run();
-    /* Notify listener: */
+    /* Notify listeners: */
     emit sigComplete(this);
 }
 
-
 UIThreadWorker::UIThreadWorker(UIThreadPool *pPool, int iIndex)
     : m_pPool(pPool)
     , m_iIndex(iIndex)
@@ -286,11 +312,12 @@ void UIThreadWorker::run()
     /* Initialize COM: */
     COMBase::InitializeCOM(false);
 
-    /* Try get a task from the pool queue. */
+    /* Try get a task from the pool queue: */
     while (UITask *pTask = m_pPool->dequeueTask(this))
     {
         /* Process the task if we are not terminating.
-         * Please take into account tasks are cleared by their creator. */
+         * Please take into account tasks are cleared by the UIThreadPool
+         * after all listeners notified about task is complete and handled it. */
         if (!m_pPool->isTerminating())
             pTask->start();
     }
@@ -298,12 +325,11 @@ void UIThreadWorker::run()
     /* Cleanup COM: */
     COMBase::CleanupCOM();
 
-    /* Queue a signal to for the pool to do thread cleanup, unless the pool is
+    /* Queue a signal for the pool to do thread cleanup, unless the pool is
        already terminating and doesn't need the signal. */
     if (!m_fNoFinishedSignal)
         emit sigFinished(this);
 }
 
-
 #include "UIThreadPool.moc"
 
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h
index 77d2ca5..7bb217d 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h
@@ -1,10 +1,10 @@
 /* $Id: UIThreadPool.h $ */
 /** @file
- * VBox Qt GUI - UIThreadPool and UITask class declaration.
+ * VBox Qt GUI - UIThreadPool and UITask classes declaration.
  */
 
 /*
- * Copyright (C) 2013 Oracle Corporation
+ * Copyright (C) 2013-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -22,6 +22,7 @@
 #include <QObject>
 #include <QMutex>
 #include <QQueue>
+#include <QSet>
 #include <QVariant>
 #include <QVector>
 #include <QWaitCondition>
@@ -30,111 +31,124 @@
 class UIThreadWorker;
 class UITask;
 
-/* Worker-thread pool prototype.
- * Schedules COM-related GUI tasks to multiple worker-threads. */
+/** QObject extension used as worker-thread pool.
+  * Schedules COM-related GUI tasks to multiple worker-threads. */
 class UIThreadPool : public QObject
 {
     Q_OBJECT;
 
 signals:
 
-    /* Notifier: Task-queue stuff: */
+    /** Notifies listeners about @a pTask complete. */
     void sigTaskComplete(UITask *pTask);
 
 public:
 
-    /* Constructor/destructor: */
+    /** Constructs worker-thread pool.
+      * @param cMaxWorkers          defines the maximum amount of worker-threads.
+      * @param cMsWorkerIdleTimeout defines the maximum amount of time (in ms) which
+      *                             pool will wait for the worker-thread on cleanup. */
     UIThreadPool(ulong cMaxWorkers = 3, ulong cMsWorkerIdleTimeout = 5000);
+    /** Destructs worker-thread pool. */
     ~UIThreadPool();
 
-    /* API: Task-queue stuff: */
-    void enqueueTask(UITask *pTask);
-
-    /* API: Termination stuff: */
+    /** Returns whether the 'termination sequence' is started. */
     bool isTerminating() const;
+    /** Defines that the 'termination sequence' is started. */
     void setTerminating();
 
-protected:
-
-    /* Protected API: Worker-thread stuff: */
+    /** Enqueues @a pTask into the task-queue. */
+    void enqueueTask(UITask *pTask);
+    /** Returns dequeued top-most task from the task-queue.
+      * @remarks Called by the @a pWorker passed as a hint. */
     UITask* dequeueTask(UIThreadWorker *pWorker);
 
 private slots:
 
-    /* Handler: Task-queue stuff: */
+    /** Handles @a pTask complete signal. */
     void sltHandleTaskComplete(UITask *pTask);
 
-    /* Handler: Worker stuff: */
+    /** Handles @a pWorker finished signal. */
     void sltHandleWorkerFinished(UIThreadWorker *pWorker);
 
 private:
 
-    /** @name Worker thread related variables.
+    /** @name Worker-thread stuff.
      * @{ */
-    QVector<UIThreadWorker*> m_workers;
-    /** Milliseconds  */
-    const ulong m_cMsIdleTimeout;
-    /** The number of worker threads.
-     * @remarks We cannot use the vector size since it may contain NULL pointers. */
-    int m_cWorkers;
-    /** The number of idle worker threads. */
-    int m_cIdleWorkers;
-    /** Set by the destructor to indicate that all worker threads should
-     *  terminate ASAP. */
-    bool m_fTerminating;
+        /** Holds the maximum amount of time (in ms) which
+          * pool will wait for the worker-thread on cleanup. */
+        const ulong m_cMsIdleTimeout;
+        /** Holds the vector of worker-threads. */
+        QVector<UIThreadWorker*> m_workers;
+        /** Holds the number of worker-threads.
+          * @remarks We cannot use the vector size since it may contain 0 pointers. */
+        int m_cWorkers;
+        /** Holds the number of idle worker-threads. */
+        int m_cIdleWorkers;
+        /** Holds whether the 'termination sequence' is started
+          * and all worker-threads should terminate ASAP. */
+        bool m_fTerminating;
     /** @} */
 
-    /** @name Task related variables
+    /** @name Task stuff
      * @{ */
-    /** Queue (FIFO) of pending tasks. */
-    QQueue<UITask*> m_tasks;
-    /** Condition variable that gets signalled when queuing a new task and there are
-     * idle worker threads around.
-     *
-     * Idle threads sits in dequeueTask waiting for this. Thus on thermination
-     * setTerminating() will do a broadcast signal to wake up all workers (after
-     * setting m_fTerminating of course). */
-    QWaitCondition m_taskCondition;
+        /** Holds the queue of pending tasks. */
+        QQueue<UITask*> m_pendingTasks;
+        /** Holds the set of executing tasks. */
+        QSet<UITask*> m_executingTasks;
+        /** Holds the condition variable that gets signalled when
+          * queuing a new task and there are idle worker threads around.
+          * @remarks Idle threads sits in dequeueTask waiting for this.
+          *          Thus on thermination, setTerminating() will send a
+          *          broadcast signal to wake up all workers (after
+          *          setting m_fTerminating of course). */
+        QWaitCondition m_taskCondition;
     /** @} */
 
-
-    /** This mutex is used with the m_taskCondition condition and protects m_tasks,
-     *  m_fTerminating and m_workers. */
+    /** Holds the guard mutex object protecting
+      * all the inter-thread variables. */
     mutable QMutex m_everythingLocker;
-
-    /* Friends: */
-    friend class UIThreadWorker;
 };
 
-/* GUI task interface.
- * Describes executable task to be used with UIThreadPool object. */
+/** QObject extension used as worker-thread task interface.
+  * Describes task to be executed by the UIThreadWorker object. */
 class UITask : public QObject
 {
     Q_OBJECT;
 
 signals:
 
-    /* Notifier: Task stuff: */
+    /** Notifies listeners about @a pTask complete. */
     void sigComplete(UITask *pTask);
 
 public:
 
-    /* Constructor: */
-    UITask(const QVariant &data);
+    /** Task types. */
+    enum Type
+    {
+        Type_MediumEnumeration = 1,
+        Type_DetailsPopulation = 2,
+    };
+
+    /** Constructs the task of passed @a type. */
+    UITask(UITask::Type type) : m_type(type) {}
 
-    /* API: Data stuff: */
-    const QVariant& data() const;
+    /** Returns the type of the task. */
+    UITask::Type type() const { return m_type; }
 
-    /* API: Run stuff: */
+    /** Starts the task. */
     void start();
 
 protected:
 
-    /* Helper: Run stuff: */
+    /** Contains the abstract task body.
+      * @remarks To be reimplemented in sub-class. */
     virtual void run() = 0;
 
-    /* Variable: Data stuff: */
-    QVariant m_data;
+private:
+
+    /** Holds the type of the task. */
+    const UITask::Type m_type;
 };
 
 #endif /* !___UIThreadPool_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
index dbab6c0..acc4946 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
@@ -58,6 +58,7 @@
 # include "QIMessageBox.h"
 # include "QIDialogButtonBox.h"
 # include "UIIconPool.h"
+# include "UIThreadPool.h"
 # include "UIShortcutPool.h"
 # include "UIExtraDataManager.h"
 # include "QIFileDialog.h"
@@ -230,6 +231,9 @@ void VBoxGlobal::destroy()
 
 VBoxGlobal::VBoxGlobal()
     : mValid (false)
+#ifdef Q_WS_MAC
+    , m_osRelease(MacOSXRelease_Old)
+#endif /* Q_WS_MAC */
     , m_fVBoxSVCAvailable(true)
     , mSelectorWnd (NULL)
     , m_fSeparateProcess(false)
@@ -254,6 +258,7 @@ VBoxGlobal::VBoxGlobal()
     , m3DAvailable(-1)
     , mSettingsPwSet(false)
     , m_pIconPool(0)
+    , m_pThreadPool(0)
 {
     /* Assign instance: */
     m_spInstance = this;
@@ -311,31 +316,30 @@ bool VBoxGlobal::isBeta() const
 }
 
 #ifdef Q_WS_MAC
-/** Returns #MacOSXRelease determined using <i>uname</i> call. */
-MacOSXRelease VBoxGlobal::osRelease()
+/* static */
+MacOSXRelease VBoxGlobal::determineOsRelease()
 {
     /* Prepare 'utsname' struct: */
     utsname info;
     if (uname(&info) != -1)
     {
-        /* Parse known .release types: */
-            if (QString(info.release).startsWith("14."))
-                return MacOSXRelease_Yosemite;
-        else
-            if (QString(info.release).startsWith("13."))
-                return MacOSXRelease_Mavericks;
-        else
-            if (QString(info.release).startsWith("12."))
-                return MacOSXRelease_MountainLion;
-        else
-            if (QString(info.release).startsWith("11."))
-                return MacOSXRelease_Lion;
-        else
-            if (QString(info.release).startsWith("10."))
-                return MacOSXRelease_SnowLeopard;
+        /* Compose map of known releases: */
+        QMap<int, MacOSXRelease> release;
+        release[10] = MacOSXRelease_SnowLeopard;
+        release[11] = MacOSXRelease_Lion;
+        release[12] = MacOSXRelease_MountainLion;
+        release[13] = MacOSXRelease_Mavericks;
+        release[14] = MacOSXRelease_Yosemite;
+        release[15] = MacOSXRelease_ElCapitan;
+
+        /* Cut the major release index of the string we have, s.a. 'man uname': */
+        const int iRelease = QString(info.release).section('.', 0, 0).toInt();
+
+        /* Return release if determined, return 'New' if version more recent than latest, return 'Old' otherwise: */
+        return release.value(iRelease, iRelease > release.keys().last() ? MacOSXRelease_New : MacOSXRelease_Old);
     }
-    /* Unknown by default: */
-    return MacOSXRelease_Unknown;
+    /* Return 'Old' by default: */
+    return MacOSXRelease_Old;
 }
 #endif /* Q_WS_MAC */
 
@@ -4009,6 +4013,11 @@ void VBoxGlobal::prepare()
     /* Make sure QApplication cleanup us on exit: */
     connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(cleanup()));
 
+#ifdef Q_WS_MAC
+    /* Determine OS release early: */
+    m_osRelease = determineOsRelease();
+#endif /* Q_WS_MAC */
+
     /* Create message-center: */
     UIMessageCenter::create();
     /* Create popup-center: */
@@ -4057,6 +4066,9 @@ void VBoxGlobal::prepare()
     connect(gVBoxEvents, SIGNAL(sigVBoxSVCAvailabilityChange(bool)),
             this, SLOT(sltHandleVBoxSVCAvailabilityChange(bool)));
 
+    /* Prepare thread-pool instance: */
+    m_pThreadPool = new UIThreadPool(3 /* worker count */, 5000 /* worker timeout */);
+
     /* create default non-null global settings */
     gset = VBoxGlobalSettings (false);
 
@@ -4451,6 +4463,9 @@ void VBoxGlobal::cleanup()
     /* Destroy whatever this converter stuff is: */
     UIConverter::cleanup();
 
+    /* Cleanup thread-pool: */
+    delete m_pThreadPool;
+    m_pThreadPool = 0;
     /* Cleanup general icon-pool: */
     delete m_pIconPool;
     m_pIconPool = 0;
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
index ce66dc5..fbb9733 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
@@ -64,6 +64,7 @@ class QSpinBox;
 class UIMediumEnumerator;
 class UIMedium;
 class UIIconPoolGeneral;
+class UIThreadPool;
 #ifdef Q_WS_X11
 class UIDesktopWidgetWatchdog;
 #endif /* Q_WS_X11 */
@@ -119,7 +120,10 @@ public:
     bool isSeparateProcess() const { return m_fSeparateProcess; }
 
 #ifdef Q_WS_MAC
-    static MacOSXRelease osRelease();
+    /** Mac OS X: Returns #MacOSXRelease determined using <i>uname</i> call. */
+    static MacOSXRelease determineOsRelease();
+    /** Mac OS X: Returns #MacOSXRelease determined during VBoxGlobal prepare routine. */
+    MacOSXRelease osRelease() const { return m_osRelease; }
 #endif /* Q_WS_MAC */
 
     /** Try to acquire COM cleanup protection token for reading. */
@@ -139,6 +143,9 @@ public:
     /** Returns the VBoxSVC availability value. */
     bool isVBoxSVCAvailable() const { return m_fVBoxSVCAvailable; }
 
+    /** Returns the thread-pool instance. */
+    UIThreadPool* threadPool() const { return m_pThreadPool; }
+
     /** @name Host-screen geometry stuff
       * @{ */
         /** Returns the number of host-screens currently available on the system. */
@@ -517,6 +524,11 @@ private:
 
     bool mValid;
 
+#ifdef Q_WS_MAC
+    /** Mac OS X: Holds the #MacOSXRelease determined using <i>uname</i> call. */
+    MacOSXRelease m_osRelease;
+#endif /* Q_WS_MAC */
+
     /** COM cleanup protection token. */
     QReadWriteLock m_comCleanupProtectionToken;
 
@@ -637,6 +649,8 @@ private:
 
     /** General icon-pool. */
     UIIconPoolGeneral *m_pIconPool;
+    /** Holds the thread-pool instance. */
+    UIThreadPool *m_pThreadPool;
 
     /* API: Instance stuff: */
     static bool m_sfCleanupInProgress;
diff --git a/src/VBox/Frontends/VirtualBox/src/main.cpp b/src/VBox/Frontends/VirtualBox/src/main.cpp
index b9631e5..094b84c 100644
--- a/src/VBox/Frontends/VirtualBox/src/main.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/main.cpp
@@ -82,7 +82,7 @@ QString g_QStrHintLinuxNoDriver = QApplication::tr(
   "The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or "
   "there is a permission problem with /dev/vboxdrv. Please reinstall the kernel "
   "module by executing<br/><br/>"
-  "  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>"
+  "  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>"
   "as root. If it is available in your distribution, you should install the "
   "DKMS package first. This package keeps track of Linux kernel changes and "
   "recompiles the vboxdrv kernel module if necessary."
@@ -99,7 +99,7 @@ QString g_QStrHintLinuxWrongDriverVersion = QApplication::tr(
   "The VirtualBox kernel modules do not match this version of "
   "VirtualBox. The installation of VirtualBox was apparently not "
   "successful. Executing<br/><br/>"
-  "  <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>"
+  "  <font color=blue>'/sbin/rcvboxdrv setup'</font><br/><br/>"
   "may correct this. Make sure that you do not mix the "
   "OSE version and the PUEL version of VirtualBox."
   );
@@ -353,10 +353,11 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char ** /*envp*/)
 
 #ifdef Q_WS_MAC
         /* Font fixes: */
-        switch (VBoxGlobal::osRelease())
+        switch (VBoxGlobal::determineOsRelease())
         {
             case MacOSXRelease_Mavericks: QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); break;
             case MacOSXRelease_Yosemite:  QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Helvetica Neue"); break;
+            case MacOSXRelease_ElCapitan: QFont::insertSubstitution(".SF NS Text", "Helvetica Neue"); break;
             default: break;
         }
 # ifdef QT_MAC_USE_COCOA
@@ -724,9 +725,6 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
             break;
     }
 
-    strText += "</html>";
-
-
 # ifdef RT_OS_LINUX
     /*
      * We have to to make sure that we display the error-message
@@ -735,15 +733,15 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
     sleep(2);
 # endif
 
-    /*
-     * Create the message box and show it.
-     */
-    QString strTitle = QApplication::tr("VirtualBox - Error In %1").arg(pszWhere);
-    QIMessageBox msgBox(strTitle, strText, AlertIconType_Critical, AlertButton_Ok | AlertButtonOption_Default);
+    /* Update strText with strDetails: */
     if (!strDetails.isEmpty())
-        msgBox.setDetailsText(strDetails);
+        strText += QString("<br><br>%1").arg(strDetails);
+
+    /* Close the <html> scope: */
+    strText += "</html>";
 
-    msgBox.exec();
+    /* Create and show the error message-box: */
+    QMessageBox::critical(0, QApplication::tr("VirtualBox - Error In %1").arg(pszWhere), strText);
 
     qFatal("%s", strText.toUtf8().constData());
 }
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
index 9f7ebcf..9480c88 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2013 Oracle Corporation
+ * Copyright (C) 2013-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -37,40 +37,38 @@
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
 
-
-/* GUI task prototype: Medium enumeration.
- * Extends UITask interface to be executed by the UIThreadWorker. */
+/** UITask extension used for medium enumeration purposes. */
 class UITaskMediumEnumeration : public UITask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
+    /** Constructs @a medium enumeration task. */
     UITaskMediumEnumeration(const UIMedium &medium)
-        : UITask(QVariant::fromValue(medium))
-    {}
+        : UITask(UITask::Type_MediumEnumeration)
+    {
+        /* Store medium as property: */
+        setProperty("medium", QVariant::fromValue(medium));
+    }
 
 private:
 
-    /* Helper: Run stuff: */
-    void run();
+    /** Contains medium enumeration task body. */
+    void run()
+    {
+        /* Get medium: */
+        UIMedium medium = property("medium").value<UIMedium>();
+        /* Enumerate it: */
+        medium.blockAndQueryState();
+        /* Put it back: */
+        setProperty("medium", QVariant::fromValue(medium));
+    }
 };
 
-void UITaskMediumEnumeration::run()
-{
-    /* Get medium: */
-    UIMedium medium = m_data.value<UIMedium>();
-    /* Enumerate it: */
-    medium.blockAndQueryState();
-    /* Put medium back: */
-    m_data = QVariant::fromValue(medium);
-}
 
-
-UIMediumEnumerator::UIMediumEnumerator(ulong uWorkerCount /* = 3*/, ulong uWorkerTimeout /* = 5000*/)
-    : m_pThreadPool(0)
-    , m_fMediumEnumerationInProgress(false)
+UIMediumEnumerator::UIMediumEnumerator()
+    : m_fMediumEnumerationInProgress(false)
 {
     /* Allow UIMedium to be used in inter-thread signals: */
     qRegisterMetaType<UIMedium>();
@@ -83,20 +81,8 @@ UIMediumEnumerator::UIMediumEnumerator(ulong uWorkerCount /* = 3*/, ulong uWorke
     connect(gVBoxEvents, SIGNAL(sigSnapshotRestore(QString, QString)), this, SLOT(sltHandleSnapshotDeleted(QString, QString)));
     connect(gVBoxEvents, SIGNAL(sigMachineRegistered(QString, bool)), this, SLOT(sltHandleMachineRegistration(QString, bool)));
 
-    /* Prepare thread-pool: */
-    m_pThreadPool = new UIThreadPool(uWorkerCount, uWorkerTimeout);
-    connect(m_pThreadPool, SIGNAL(sigTaskComplete(UITask*)), this, SLOT(sltHandleMediumEnumerationTaskComplete(UITask*)));
-}
-
-UIMediumEnumerator::~UIMediumEnumerator()
-{
-    /* Delete thread-pool: */
-    delete m_pThreadPool;
-    m_pThreadPool = 0;
-
-    /* Delete all the tasks: */
-    while (!m_tasks.isEmpty())
-        delete m_tasks.takeFirst();
+    /* Listen for global thread-pool: */
+    connect(vboxGlobal().threadPool(), SIGNAL(sigTaskComplete(UITask*)), this, SLOT(sltHandleMediumEnumerationTaskComplete(UITask*)));
 }
 
 QList<QString> UIMediumEnumerator::mediumIDs() const
@@ -280,16 +266,17 @@ void UIMediumEnumerator::sltHandleSnapshotDeleted(QString strMachineID, QString
 void UIMediumEnumerator::sltHandleMediumEnumerationTaskComplete(UITask *pTask)
 {
     /* Make sure that is one of our tasks: */
-    int iIndexOfTask = m_tasks.indexOf(pTask);
-    AssertReturnVoid(iIndexOfTask != -1);
+    if (pTask->type() != UITask::Type_MediumEnumeration)
+        return;
+    AssertReturnVoid(m_tasks.contains(pTask));
 
     /* Get enumerated UIMedium: */
-    const UIMedium uimedium = pTask->data().value<UIMedium>();
+    const UIMedium uimedium = pTask->property("medium").value<UIMedium>();
     const QString strUIMediumKey = uimedium.key();
     LogRel2(("GUI: UIMediumEnumerator: Medium with key={%s} enumerated\n", strUIMediumKey.toAscii().constData()));
 
-    /* Delete task: */
-    delete m_tasks.takeAt(iIndexOfTask);
+    /* Remove task from internal set: */
+    m_tasks.remove(pTask);
 
     /* Make sure such UIMedium still exists: */
     AssertReturnVoid(m_mediums.contains(strUIMediumKey));
@@ -345,10 +332,10 @@ void UIMediumEnumerator::createMediumEnumerationTask(const UIMedium &medium)
 {
     /* Prepare medium-enumeration task: */
     UITask *pTask = new UITaskMediumEnumeration(medium);
-    /* Append to internal list: */
-    m_tasks.append(pTask);
-    /* Post into thread-pool: */
-    m_pThreadPool->enqueueTask(pTask);
+    /* Append to internal set: */
+    m_tasks << pTask;
+    /* Post into global thread-pool: */
+    vboxGlobal().threadPool()->enqueueTask(pTask);
 }
 
 void UIMediumEnumerator::addNullMediumToMap(UIMediumMap &mediums)
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
index 483cbf5..e307a9f 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
@@ -20,6 +20,7 @@
 
 /* Qt includes: */
 #include <QObject>
+#include <QSet>
 
 /* GUI includes: */
 #include "UIMedium.h"
@@ -50,9 +51,8 @@ signals:
 
 public:
 
-    /* Constructor/destructor: */
-    UIMediumEnumerator(ulong uWorkerCount = 3, ulong uWorkerTimeout = 5000);
-    ~UIMediumEnumerator();
+    /** Constructs medium-enumerator object. */
+    UIMediumEnumerator();
 
     /* API: Medium-access stuff: */
     QList<QString> mediumIDs() const;
@@ -93,9 +93,8 @@ private:
     void recacheFromActualUsage(const CMediumMap &currentCMediums, const QStringList &currentCMediumIDs);
 
     /* Variables: */
-    UIThreadPool *m_pThreadPool;
     bool m_fMediumEnumerationInProgress;
-    QList<UITask*> m_tasks;
+    QSet<UITask*> m_tasks;
     UIMediumMap m_mediums;
 };
 
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp b/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
index d18b95c..6fefe4a 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
@@ -24,12 +24,17 @@
 # include <QFile>
 # include <QThread>
 # include <QRegExp>
+# include <QVector>
 
 /* GUI includes: */
 # include "UINetworkReply.h"
 # include "UINetworkManager.h"
-# include "VBoxGlobal.h"
-# include "VBoxUtils.h"
+# ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
+#  include "VBoxGlobal.h"
+#  include "VBoxUtils.h"
+# else
+#  include <VBox/log.h>
+# endif
 
 /* Other VBox includes; */
 # include <iprt/initterm.h>
@@ -42,6 +47,7 @@
 #include <iprt/http.h>
 #include <iprt/path.h>
 #include <iprt/sha.h>
+#include <iprt/string.h>
 #include <iprt/zip.h>
 
 
@@ -50,7 +56,9 @@
  */
 class UINetworkReplyPrivateThread : public QThread
 {
+#ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
     Q_OBJECT;
+#endif
 
 public:
 
@@ -82,17 +90,9 @@ private:
     /* Helper: Main thread runner: */
     void run();
 
-    /** Info about wanted certificate. */
+    /** Additinoal download nfo about wanted certificate. */
     typedef struct CERTINFO
     {
-        /** Gives the s_aCerts index this certificate is an alternative edition of,
-         * UINT8_MAX if no alternative.  This is a complication caused by VeriSign
-         * reissuing certificates signed with md2WithRSAEncryption using
-         * sha1WithRSAEncryption, since MD2 is comprimised.  (Public key unmodified.)
-         * It has no practical meaning for the trusted root anchor use we put it to.  */
-        uint8_t     iAlternativeTo;
-        /** Set if mandatory. */
-        bool        fMandatory;
         /** Filename in the zip file we download (PEM). */
         const char *pszZipFile;
         /** List of direct URLs to PEM formatted files.. */
@@ -105,9 +105,8 @@ private:
     static int applyProxyRules(RTHTTP hHttp, const QString &strHostName, int iPort);
     static int applyRawHeaders(RTHTTP hHttp, const QList<QByteArray> &headers, const QNetworkRequest &request);
     static unsigned countCertsFound(bool const *pafFoundCerts);
-    static bool areAllCertsFound(bool const *pafFoundCerts, bool fOnlyMandatory);
-    static int  adjustCertsFound(int rc, bool *pafFoundCerts);
-    static void refreshCertificates(RTHTTP hHttp, RTCRSTORE hOldStore, bool *pafFoundCerts, const char *pszCaCertFile);
+    static bool areAllCertsFound(bool const *pafFoundCerts);
+    static int refreshCertificates(RTHTTP hHttp, PRTCRSTORE phStore, bool *pafFoundCerts, const char *pszCaCertFile);
     static void downloadMissingCertificates(RTCRSTORE hNewStore, bool *pafNewFoundCerts, RTHTTP hHttp,
                                             PRTERRINFOSTATIC pStaticErrInfo);
     static int convertVerifyAndAddPemCertificateToStore(RTCRSTORE hStore, void const *pvResponse,
@@ -124,48 +123,40 @@ private:
     RTHTTP m_hHttp;
     QByteArray m_reply;
 
-    static const QString s_strCertificateFileName;
-    static const RTCRCERTWANTED s_aCerts[3];
-    static const CERTINFO s_CertInfoPcaCls3Gen1Md2;
-    static const CERTINFO s_CertInfoPcaCls3Gen1Sha1;
+    static const char * const s_apszRootsZipUrls[];
     static const CERTINFO s_CertInfoPcaCls3Gen5;
-};
+    static const RTCRCERTWANTED s_aCerts[];
+    static const QString s_strCertificateFileName;
 
-/*static*/ const UINetworkReplyPrivateThread::CERTINFO UINetworkReplyPrivateThread::s_CertInfoPcaCls3Gen1Sha1 =
-{
-    /*.iAlternativeTo =*/   1,
-    /*.fMandatory     =*/   false,
-    /*.pszZipFile     =*/
-    "VeriSign Root Certificates/Generation 1 (G1) PCAs/Class 3 Public Primary Certification Authority.pem",
-    /*.apszUrls[3]    =*/
-    {
-        "http://www.symantec.com/content/en/us/enterprise/verisign/roots/Class-3-Public-Primary-Certification-Authority.pem",
-        "http://www.verisign.com/repository/roots/root-certificates/PCA-3.pem", /* dead */
-        NULL,
-        "http://update.virtualbox.org/cacerts-symantec-PCA-3-pem-has-gone-missing-again" /* attention getter */
-    }
+#ifdef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
+public:
+    static void testIt(RTTEST hTest);
+#endif
 };
 
-/*static*/ const UINetworkReplyPrivateThread::CERTINFO UINetworkReplyPrivateThread::s_CertInfoPcaCls3Gen1Md2 =
+
+/**
+ * URLs to root zip files containing certificates we want.
+ */
+/*static*/ const char * const UINetworkReplyPrivateThread::s_apszRootsZipUrls[] =
 {
-    /*.iAlternativeTo =*/   0,
-    /*.fMandatory     =*/   false,
-    /*.pszZipFile     =*/   NULL,
-    /*.apszUrls[3]    =*/   { NULL, NULL, NULL },
+    "http://www.symantec.com/content/en/us/enterprise/verisign/roots/roots.zip"
 };
 
+
+/**
+ * Download details for
+ */
 /*static*/ const UINetworkReplyPrivateThread::CERTINFO UINetworkReplyPrivateThread::s_CertInfoPcaCls3Gen5 =
 {
-    /*.iAlternativeTo =*/   UINT8_MAX,
-    /*.fMandatory     =*/   true,
     /*.pszZipFile     =*/
     "VeriSign Root Certificates/Generation 5 (G5) PCA/VeriSign Class 3 Public Primary Certification Authority - G5.pem",
-    /*.apszUrls[3]    =*/
+    /*.apszUrls[]     =*/
     {
         "http://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem",
         "http://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class-3-Public-Primary-Certification-Authority-G5.pem", /* (in case they correct above typo) */
         "http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem", /* dead */
-        "http://update.virtualbox.org/cacerts-symantec-PCA-3G5-pem-has-gone-missing-again" /* attention getter */
+        NULL,
     }
 };
 
@@ -174,58 +165,9 @@ private:
  * Details on the certificates we are after.
  * The pvUser member points to a UINetworkReplyPrivateThread::CERTINFO.
  */
-/* static */ const RTCRCERTWANTED UINetworkReplyPrivateThread::s_aCerts[3] =
+/* static */ const RTCRCERTWANTED UINetworkReplyPrivateThread::s_aCerts[] =
 {
-    /*[0] =*/   /* The reissued version with the SHA-1 signature. */
-/** @todo r=bird: Why do we need this certificate? Neither update.virtualbox.org nor www.virtualbox.org uses it...  ElCapitan doesn't ship this. */
-    {
-        /*.pszSubject        =*/    "C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority",
-        /*.cbEncoded         =*/    0x240,
-        /*.Sha1Fingerprint   =*/    true,
-        /*.Sha512Fingerprint =*/    true,
-        /*.abSha1            =*/
-        {
-            0xa1, 0xdb, 0x63, 0x93, 0x91, 0x6f, 0x17, 0xe4, 0x18, 0x55,
-            0x09, 0x40, 0x04, 0x15, 0xc7, 0x02, 0x40, 0xb0, 0xae, 0x6b
-        },
-        /*.abSha512          =*/
-        {
-            0xbb, 0xf7, 0x8a, 0x19, 0x9f, 0x37, 0xee, 0xa2,
-            0xce, 0xc8, 0xaf, 0xe3, 0xd6, 0x22, 0x54, 0x20,
-            0x74, 0x67, 0x6e, 0xa5, 0x19, 0xb7, 0x62, 0x1e,
-            0xc1, 0x2f, 0xd5, 0x08, 0xf4, 0x64, 0xc4, 0xc6,
-            0xbb, 0xc2, 0xf2, 0x35, 0xe7, 0xbe, 0x32, 0x0b,
-            0xde, 0xb2, 0xfc, 0x44, 0x92, 0x5b, 0x8b, 0x9b,
-            0x77, 0xa5, 0x40, 0x22, 0x18, 0x12, 0xcb, 0x3d,
-            0x0a, 0x67, 0x83, 0x87, 0xc5, 0x45, 0xc4, 0x99
-        },
-        /*.pvUser */ &UINetworkReplyPrivateThread::s_CertInfoPcaCls3Gen1Sha1
-    },
-    /*[1] =*/   /* The original version with the MD2 signature. */
-    {
-        /*.pszSubject        =*/    "C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority",
-        /*.cbEncoded         =*/    0x240,
-        /*.Sha1Fingerprint   =*/    true,
-        /*.Sha512Fingerprint =*/    true,
-        /*.abSha1            =*/
-        {
-            0x74, 0x2c, 0x31, 0x92, 0xe6, 0x07, 0xe4, 0x24, 0xeb, 0x45,
-            0x49, 0x54, 0x2b, 0xe1, 0xbb, 0xc5, 0x3e, 0x61, 0x74, 0xe2
-        },
-        /*.abSha512          =*/
-        {
-            0x7c, 0x2f, 0x94, 0x22, 0x5f, 0x67, 0x98, 0x89,
-            0xb9, 0xde, 0xd7, 0x41, 0xa0, 0x0d, 0xb1, 0x5c,
-            0xc6, 0xca, 0x28, 0x12, 0xbf, 0xbc, 0xa8, 0x2b,
-            0x22, 0x53, 0x7a, 0xf8, 0x32, 0x41, 0x2a, 0xbb,
-            0xc1, 0x05, 0xe0, 0x0c, 0xd0, 0xa3, 0x97, 0x9d,
-            0x5f, 0xcd, 0xe9, 0x9b, 0x68, 0x06, 0xe8, 0xe6,
-            0xce, 0xef, 0xb2, 0x71, 0x8e, 0x91, 0x60, 0xa2,
-            0xc8, 0x0c, 0x5a, 0xe7, 0x8b, 0x33, 0xf2, 0xaa
-        },
-        /*.pvUser */ &UINetworkReplyPrivateThread::s_CertInfoPcaCls3Gen1Md2
-    },
-    /*[2] =*/
+    /*[0] =*/
     {
         /*.pszSubject        =*/
         "C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, "
@@ -277,15 +219,29 @@ int UINetworkReplyPrivateThread::applyProxyRules()
     /* Set thread context: */
     m_strContext = tr("During proxy configuration");
 
-    /* Make sure proxy is enabled in Proxy Manager: */
+#ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
+    /* Get the proxymanager: */
     UIProxyManager proxyManager(vboxGlobal().settings().proxySettings());
-    if (!proxyManager.proxyEnabled())
-        return VINF_SUCCESS;
 
-    /* Apply proxy rules: */
-    return applyProxyRules(m_hHttp,
-                           proxyManager.proxyHost(),
-                           proxyManager.proxyPort().toUInt());
+    /* If the specific proxy settings aren't enabled, we'll use the
+       system default proxy.  Otherwise assume it's configured. */
+    if (proxyManager.proxyEnabled())
+        return RTHttpSetProxy(m_hHttp,
+                              proxyManager.proxyHost().toUtf8().constData(),
+                              proxyManager.proxyPort().toUInt(),
+                              NULL /* pszProxyUser */, NULL /* pszProxyPwd */);
+
+    /** @todo This should be some kind of tristate:
+     *      - system configured proxy ("proxyDisabled" as well as default "")
+     *      - user configured proxy ("proxyEnabled").
+     *      - user configured "no proxy" (currently missing).
+     * In the two last cases, call RTHttpSetProxy.
+     *
+     * Alternatively, we could opt not to give the user a way of doing "no proxy",
+     * that would require no real changes to the visible GUI... Just a thought.
+     */
+#endif
+    return RTHttpUseSystemProxySettings(m_hHttp);
 }
 
 int UINetworkReplyPrivateThread::applyHttpsCertificates()
@@ -342,7 +298,6 @@ int UINetworkReplyPrivateThread::applyHttpsCertificates()
              * need to do wrt file age.
              */
             rc = RTCrStoreCertCheckWanted(hCurStore, s_aCerts, RT_ELEMENTS(s_aCerts), afCertsFound);
-            rc = adjustCertsFound(rc, afCertsFound);
             AssertRC(rc);
             RTTIMESPEC RefreshAge;
             uint32_t   cSecRefresh = rc == VINF_SUCCESS  ? 28 * RT_SEC_1DAY /* all found */ : 60 /* stuff missing */;
@@ -353,14 +308,14 @@ int UINetworkReplyPrivateThread::applyHttpsCertificates()
          * Refresh the file if necessary.
          */
         if (fRefresh)
-            refreshCertificates(m_hHttp, hCurStore, afCertsFound, pszCaCertFile);
+            refreshCertificates(m_hHttp, &hCurStore, afCertsFound, pszCaCertFile);
 
         RTCrStoreRelease(hCurStore);
 
         /*
          * Final verdict.
          */
-        if (areAllCertsFound(afCertsFound, true /*fOnlyMandatory*/))
+        if (areAllCertsFound(afCertsFound))
             rc = VINF_SUCCESS;
         else
             rc = VERR_NOT_FOUND; /** @todo r=bird: Why not try and let RTHttpGet* bitch if the necessary certs are missing? */
@@ -447,22 +402,12 @@ void UINetworkReplyPrivateThread::run()
 /* static */
 QString UINetworkReplyPrivateThread::fullCertificateFileName()
 {
+#ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
     const QDir homeDir(QDir::toNativeSeparators(vboxGlobal().homeFolder()));
     return QDir::toNativeSeparators(homeDir.absoluteFilePath(s_strCertificateFileName));
-}
-
-/* static */
-int UINetworkReplyPrivateThread::applyProxyRules(RTHTTP hHttp, const QString &strHostName, int iPort)
-{
-    /* Make sure HTTP is created: */
-    if (hHttp == NIL_RTHTTP)
-        return VERR_INVALID_HANDLE;
-
-    /* Apply HTTP proxy: */
-    return RTHttpSetProxy(hHttp,
-                          strHostName.toAscii().constData(),
-                          iPort,
-                          0 /* login */, 0 /* password */);
+#else
+    return QString("/not/such/agency/non-existing-file.cer");
+#endif
 }
 
 /* static */
@@ -489,41 +434,6 @@ int UINetworkReplyPrivateThread::applyRawHeaders(RTHTTP hHttp, const QList<QByte
 }
 
 /**
- * Adjusts the set of found certificates by marking all alternatives found if
- * one is.
- *
- * @returns Adjusted rc (VINF_SUCCESS instead of VWRN_NOT_FOUND if all found).
- * @param   rc                  The status code.
- * @param   pafFoundCerts       Array parallel to s_aCerts with the status of
- *                              each wanted certificate.
- */
-/*static*/ int
-UINetworkReplyPrivateThread::adjustCertsFound(int rc, bool *pafFoundCerts)
-{
-    for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++)
-        if (pafFoundCerts[i])
-        {
-            uint8_t iAlt = i;
-            for (;;)
-            {
-                const CERTINFO *pCertInfo = (const CERTINFO *)s_aCerts[iAlt].pvUser;
-                iAlt = pCertInfo->iAlternativeTo;
-                if (iAlt >= RT_ELEMENTS(s_aCerts) || iAlt == i)
-                {
-                    Assert(iAlt == UINT8_MAX || iAlt < RT_ELEMENTS(s_aCerts));
-                    break;
-                }
-                if (!pafFoundCerts[iAlt])
-                    pafFoundCerts[iAlt] = true;
-            }
-        }
-
-    if (rc == VINF_SUCCESS || rc == VWRN_NOT_FOUND)
-        rc = countCertsFound(pafFoundCerts) == RT_ELEMENTS(s_aCerts) ? VINF_SUCCESS : VWRN_NOT_FOUND;
-    return rc;
-}
-
-/**
  * Counts the number of certificates found in a search result array.
  *
  * @returns Number of wanted certifcates we've found.
@@ -545,35 +455,43 @@ UINetworkReplyPrivateThread::countCertsFound(bool const *pafFoundCerts)
  * @returns true if we have, false if we haven't.
  * @param   pafFoundCerts       Array parallel to s_aCerts with the status of
  *                              each wanted certificate.
- * @param   fOnlyMandatory      Only require mandatory certificates to be
- *                              present.  If false, all certificates must be
- *                              found before we return true.
  */
 /*static*/ bool
-UINetworkReplyPrivateThread::areAllCertsFound(bool const *pafFoundCerts, bool fOnlyMandatory)
+UINetworkReplyPrivateThread::areAllCertsFound(bool const *pafFoundCerts)
 {
-    if (fOnlyMandatory)
-    {
-        for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++)
-            if (   !pafFoundCerts[i]
-                && ((const CERTINFO *)s_aCerts[i].pvUser)->fMandatory)
-                return false;
-    }
-    else
-        for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++)
-            if (!pafFoundCerts[i])
-                return false;
+    for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++)
+        if (!pafFoundCerts[i])
+            return false;
     return true;
 }
 
-/*static*/ void
-UINetworkReplyPrivateThread::refreshCertificates(RTHTTP hHttp, RTCRSTORE hOldStore, bool *pafOldFoundCerts,
+/**
+ * Refresh the certificates.
+ *
+ * @return  IPRT status code for the testcase.
+ * @param   hHttp               The HTTP client instance.  (Can be NIL when
+ *                              running the testcase.)
+ * @param   phStore             On input, this holds the current store, so that
+ *                              we can fish out wanted certificates from it.
+ *                              On successful return, this is replaced with a
+ *                              new store reflecting the refrehsed content of
+ *                              @a pszCaCertFile.
+ * @param   pafFoundCerts       On input, this holds the certificates found in
+ *                              the current store.  On return, this reflects
+ *                              what is current in the @a pszCaCertFile.  The
+ *                              array runs parallel to s_aCerts.
+ * @param   pszCaCertFile       Where to write the refreshed certificates if
+ *                              we've managed to gather a collection that is at
+ *                              least as good as the old one.
+ */
+/*static*/ int
+UINetworkReplyPrivateThread::refreshCertificates(RTHTTP hHttp, PRTCRSTORE phStore, bool *pafFoundCerts,
                                                  const char *pszCaCertFile)
 {
     /*
      * Collect the standard assortment of SSL certificates.
      */
-    uint32_t  cHint = RTCrStoreCertCount(hOldStore);
+    uint32_t  cHint = RTCrStoreCertCount(*phStore);
     RTCRSTORE hNewStore;
     int rc = RTCrStoreCreateInMem(&hNewStore, cHint > 32 && cHint < _32K ? cHint + 16 : 256);
     if (RT_SUCCESS(rc))
@@ -596,17 +514,15 @@ UINetworkReplyPrivateThread::refreshCertificates(RTHTTP hHttp, RTCRSTORE hOldSto
             RT_ZERO(afNewFoundCerts); /* paranoia */
 
             rc = RTCrStoreCertCheckWanted(hNewStore, s_aCerts, RT_ELEMENTS(s_aCerts), afNewFoundCerts);
-            rc = adjustCertsFound(rc, afNewFoundCerts);
             AssertLogRelRC(rc);
-            Assert(rc != VINF_SUCCESS || areAllCertsFound(afNewFoundCerts, false /*fOnlyMandatory*/));
+            Assert(rc != VINF_SUCCESS || areAllCertsFound(afNewFoundCerts));
             if (rc != VINF_SUCCESS)
             {
                 rc = RTCrStoreCertAddWantedFromStore(hNewStore,
                                                      RTCRCERTCTX_F_ADD_IF_NOT_FOUND | RTCRCERTCTX_F_ADD_CONTINUE_ON_ERROR,
-                                                     hOldStore, s_aCerts, RT_ELEMENTS(s_aCerts), afNewFoundCerts);
-                rc = adjustCertsFound(rc, afNewFoundCerts);
+                                                     *phStore, s_aCerts, RT_ELEMENTS(s_aCerts), afNewFoundCerts);
                 AssertLogRelRC(rc);
-                Assert(rc != VINF_SUCCESS || areAllCertsFound(afNewFoundCerts, false /*fOnlyMandatory*/));
+                Assert(rc != VINF_SUCCESS || areAllCertsFound(afNewFoundCerts));
             }
 
             /*
@@ -620,38 +536,39 @@ UINetworkReplyPrivateThread::refreshCertificates(RTHTTP hHttp, RTCRSTORE hOldSto
                                                                  | RTCRCERTCTX_F_ADD_CONTINUE_ON_ERROR,
                                                                  s_aCerts, RT_ELEMENTS(s_aCerts), afNewFoundCerts,
                                                                  RTErrInfoInitStatic(&StaticErrInfo));
-                rc = adjustCertsFound(rc, afNewFoundCerts);
                 if (RTErrInfoIsSet(&StaticErrInfo.Core))
                     LogRel(("refreshCertificates/#2: %s\n", StaticErrInfo.Core.pszMsg));
-                Assert(rc != VINF_SUCCESS || areAllCertsFound(afNewFoundCerts, false /*fOnlyMandatory*/));
+                Assert(rc != VINF_SUCCESS || areAllCertsFound(afNewFoundCerts));
             }
 
             /*
              * If that didn't help, try download the certificates.
              */
-            if (rc != VINF_SUCCESS)
+            if (rc != VINF_SUCCESS && hHttp != NIL_RTHTTP)
                 downloadMissingCertificates(hNewStore, afNewFoundCerts, hHttp, &StaticErrInfo);
 
             /*
              * If we've got the same or better hit rate than the old store,
              * replace the CA certs file.
              */
-            if (   areAllCertsFound(afNewFoundCerts, false /*fOnlyMandatory*/)
-                || (   countCertsFound(afNewFoundCerts) >= countCertsFound(pafOldFoundCerts)
-                    &&    areAllCertsFound(afNewFoundCerts, true /*fOnlyMandatory*/)
-                       >= areAllCertsFound(pafOldFoundCerts, true /*fOnlyMandatory*/) ) )
+            if (   areAllCertsFound(afNewFoundCerts)
+                || countCertsFound(afNewFoundCerts) >= countCertsFound(pafFoundCerts) )
             {
                 rc = RTCrStoreCertExportAsPem(hNewStore, 0 /*fFlags*/, pszCaCertFile);
                 if (RT_SUCCESS(rc))
                 {
-                    memcpy(pafOldFoundCerts, afNewFoundCerts, sizeof(afNewFoundCerts));
                     LogRel(("refreshCertificates/#3: Found %u/%u SSL certs we/you trust (previously %u/%u).\n",
                             countCertsFound(afNewFoundCerts), RTCrStoreCertCount(hNewStore),
-                            countCertsFound(pafOldFoundCerts), RTCrStoreCertCount(hOldStore) ));
+                            countCertsFound(pafFoundCerts), RTCrStoreCertCount(*phStore) ));
+
+                    memcpy(pafFoundCerts, afNewFoundCerts, sizeof(afNewFoundCerts));
+                    RTCrStoreRelease(*phStore);
+                    *phStore  = hNewStore;
+                    hNewStore = NIL_RTCRSTORE;
                 }
                 else
                 {
-                    RT_ZERO(pafOldFoundCerts);
+                    RT_ZERO(pafFoundCerts);
                     LogRel(("refreshCertificates/#3: RTCrStoreCertExportAsPem unexpectedly failed with %Rrc\n", rc));
                 }
             }
@@ -660,6 +577,7 @@ UINetworkReplyPrivateThread::refreshCertificates(RTHTTP hHttp, RTCRSTORE hOldSto
         }
         RTCrStoreRelease(hNewStore);
     }
+    return rc;
 }
 
 /*static*/ void
@@ -671,16 +589,11 @@ UINetworkReplyPrivateThread::downloadMissingCertificates(RTCRSTORE hNewStore, bo
     /*
      * Try get the roots.zip from symantec (or virtualbox.org) first.
      */
-    static const char * const a_apszRootsZipUrls[] =
-    {
-        "http://www.symantec.com/content/en/us/enterprise/verisign/roots/roots.zip",
-        "http://update.virtualbox.org/cacerts-symantec-roots-zip-has-gone-missing-again" /* Just to try grab our attention. */
-    };
-    for (uint32_t iUrl = 0; iUrl < RT_ELEMENTS(a_apszRootsZipUrls); iUrl++)
+    for (uint32_t iUrl = 0; iUrl < RT_ELEMENTS(s_apszRootsZipUrls); iUrl++)
     {
         void   *pvRootsZip;
         size_t  cbRootsZip;
-        rc = RTHttpGetBinary(hHttp, a_apszRootsZipUrls[iUrl], &pvRootsZip, &cbRootsZip);
+        rc = RTHttpGetBinary(hHttp, s_apszRootsZipUrls[iUrl], &pvRootsZip, &cbRootsZip);
         if (RT_SUCCESS(rc))
         {
             for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++)
@@ -702,7 +615,7 @@ UINetworkReplyPrivateThread::downloadMissingCertificates(RTCRSTORE hNewStore, bo
                                  * Successfully added. Mark it as found and return if we've got them all.
                                  */
                                 pafNewFoundCerts[i] = true;
-                                if (adjustCertsFound(VWRN_NOT_FOUND, pafNewFoundCerts) == VINF_SUCCESS)
+                                if (areAllCertsFound(pafNewFoundCerts))
                                 {
                                     RTHttpFreeResponse(pvRootsZip);
                                     return;
@@ -735,7 +648,6 @@ UINetworkReplyPrivateThread::downloadMissingCertificates(RTCRSTORE hNewStore, bo
                         if (RT_SUCCESS(rc))
                         {
                             pafNewFoundCerts[i] = true;
-                            adjustCertsFound(VWRN_NOT_FOUND, pafNewFoundCerts);
                             break;
                         }
                     }
@@ -809,6 +721,7 @@ UINetworkReplyPrivateThread::convertVerifyAndAddPemCertificateToStore(RTCRSTORE
     return rc;
 }
 
+#ifndef VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS
 
 /**
  * Our network-reply (HTTP) object.
@@ -914,6 +827,11 @@ private:
     UINetworkReplyPrivateThread *m_pThread;
 };
 
+
+/*********************************************************************************************************************************
+*   Class UINetworkReply implementation.                                                                                         *
+*********************************************************************************************************************************/
+
 UINetworkReply::UINetworkReply(const QNetworkRequest &request, UINetworkRequestType requestType)
     : m_replyType(UINetworkReplyType_Qt)
     , m_pReply(0)
@@ -1030,3 +948,5 @@ QUrl UINetworkReply::url() const
 
 #include "UINetworkReply.moc"
 
+#endif /* !VBOX_GUI_IN_TST_SSL_CERT_DOWNLOADS */
+
diff --git a/src/VBox/Frontends/VirtualBox/src/net/tstSSLCertDownloads.cpp b/src/VBox/Frontends/VirtualBox/src/net/tstSSLCertDownloads.cpp
new file mode 100644
index 0000000..63a4339
--- /dev/null
+++ b/src/VBox/Frontends/VirtualBox/src/net/tstSSLCertDownloads.cpp
@@ -0,0 +1,165 @@
+/* $Id: tstSSLCertDownloads.cpp $ */
+/** @file
+ * IPRT Testcase - Simple cURL testcase.
+ */
+
+/*
+ * Copyright (C) 2012-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/test.h>
+
+
+/*
+ * It's a private class we're testing, so we must include the source.
+ * Better than emedding the testcase as public function in the class.
+ */
+#include "UINetworkReply.cpp"
+
+
+
+/*static*/ void UINetworkReplyPrivateThread::testIt(RTTEST hTest)
+{
+    QNetworkRequest Dummy;
+    UINetworkReplyPrivateThread TestObj(Dummy);
+
+    /*
+     * Do the first setup things that UINetworkReplyPrivateThread::run.
+     */
+    RTTESTI_CHECK_RC(RTHttpCreate(&TestObj.m_hHttp), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(TestObj.applyProxyRules(), VINF_SUCCESS);
+
+    /*
+     * Duplicate much of downloadMissingCertificates, but making sure we
+     * can both get the certificate from the ZIP file(s) and the first
+     * PEM URL (as the rest are currently busted).
+     */
+    RTTestISub("SSL Cert downloading");
+    RTCRSTORE hStore;
+    RTTESTI_CHECK_RC(RTCrStoreCreateInMem(&hStore, RT_ELEMENTS(s_aCerts) * 2), VINF_SUCCESS);
+
+    int rc;
+
+    /* ZIP files: */
+    for (uint32_t iUrl = 0; iUrl < RT_ELEMENTS(s_apszRootsZipUrls); iUrl++)
+    {
+        RTTestIPrintf(RTTESTLVL_ALWAYS, "URL: %s\n", s_apszRootsZipUrls[iUrl]);
+        void   *pvRootsZip;
+        size_t  cbRootsZip;
+        rc = RTHttpGetBinary(TestObj.m_hHttp, s_apszRootsZipUrls[iUrl], &pvRootsZip, &cbRootsZip);
+        if (RT_SUCCESS(rc))
+        {
+            for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++)
+            {
+                CERTINFO const *pInfo = (CERTINFO const *)s_aCerts[i].pvUser;
+                if (pInfo->pszZipFile)
+                {
+                    void  *pvFile;
+                    size_t cbFile;
+                    RTTESTI_CHECK_RC_BREAK(RTZipPkzipMemDecompress(&pvFile, &cbFile, pvRootsZip, cbRootsZip, pInfo->pszZipFile),
+                                           VINF_SUCCESS);
+                    RTTESTI_CHECK_RC(convertVerifyAndAddPemCertificateToStore(hStore, pvFile, cbFile, &TestObj.s_aCerts[i]),
+                                     VINF_SUCCESS);
+                    RTMemFree(pvFile);
+                }
+            }
+            RTHttpFreeResponse(pvRootsZip);
+        }
+        else if (   rc != VERR_HTTP_PROXY_NOT_FOUND
+                 && rc != VERR_HTTP_COULDNT_CONNECT)
+            RTTestIFailed("%Rrc on '%s'", rc, s_apszRootsZipUrls[iUrl]); /* code or link broken */
+    }
+
+    /* PEM files: */
+    for (uint32_t i = 0; i < RT_ELEMENTS(s_aCerts); i++)
+    {
+        uint32_t iUrl = 0; /* First URL must always work. */
+        UINetworkReplyPrivateThread::CERTINFO const *pInfo;
+        pInfo = (UINetworkReplyPrivateThread::CERTINFO const *)s_aCerts[i].pvUser;
+        if (pInfo->apszUrls[iUrl])
+        {
+            RTTestIPrintf(RTTESTLVL_ALWAYS, "URL: %s\n", pInfo->apszUrls[iUrl]);
+            void  *pvResponse;
+            size_t cbResponse;
+            rc = RTHttpGetBinary(TestObj.m_hHttp, pInfo->apszUrls[iUrl], &pvResponse, &cbResponse);
+            if (RT_SUCCESS(rc))
+            {
+                RTTESTI_CHECK_RC_OK(convertVerifyAndAddPemCertificateToStore(hStore, pvResponse, cbResponse,
+                                                                             &TestObj.s_aCerts[i]));
+                RTHttpFreeResponse(pvResponse);
+            }
+            else if (   rc != VERR_HTTP_PROXY_NOT_FOUND
+                     && rc != VERR_HTTP_COULDNT_CONNECT)
+                RTTestIFailed("%Rrc on '%s'", rc, pInfo->apszUrls[iUrl]); /* code or link broken */
+        }
+    }
+
+    RTTESTI_CHECK(RTCrStoreRelease(hStore) == 0);
+
+    /*
+     * Now check the gathering of certificates on the system doesn't crash.
+     */
+    RTTestISub("Refreshing certificates");
+
+    /* create an empty store and do the refresh operation, writing it to /dev/null. */
+    RTTESTI_CHECK_RC(RTCrStoreCreateInMem(&hStore, RT_ELEMENTS(s_aCerts) * 2), VINF_SUCCESS);
+    bool afFoundCerts[RT_ELEMENTS(s_aCerts)];
+    RT_ZERO(afFoundCerts);
+#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
+    RTTESTI_CHECK_RC_OK(TestObj.refreshCertificates(NIL_RTHTTP, &hStore, afFoundCerts, "nul"));
+#else
+    RTTESTI_CHECK_RC_OK(TestObj.refreshCertificates(NIL_RTHTTP, &hStore, afFoundCerts, "/dev/null"));
+#endif
+
+    /* Log how many certificates we found and require at least one. */
+    uint32_t cCerts = RTCrStoreCertCount(hStore);
+    RTTestIValue("certificates", cCerts, RTTESTUNIT_NONE);
+    RTTESTI_CHECK(cCerts > 0);
+
+    RTTESTI_CHECK(RTCrStoreRelease(hStore) == 0);
+
+    /*
+     * We're done.
+     */
+    //RTTESTI_CHECK_RC(RTHttpDestroy(TestObj.m_hHttp), VINF_SUCCESS);
+    RTHttpDestroy(TestObj.m_hHttp);
+    TestObj.m_hHttp = NIL_RTHTTP;
+}
+
+
+int main()
+{
+    RTTEST hTest;
+    RTEXITCODE rcExit = RTTestInitAndCreate("tstSSLCertDownloads", &hTest);
+    if (rcExit != RTEXITCODE_SUCCESS)
+        return rcExit;
+    RTTestBanner(hTest);
+
+    UINetworkReplyPrivateThread::testIt(hTest);
+
+    return RTTestSummaryAndDestroy(hTest);
+}
+
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm
index ca70b95..71b0ca3 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm
@@ -166,6 +166,23 @@ void darwinSetHidesAllTitleButtonsImpl(NativeNSWindowRef pWindow)
     }
 }
 
+void darwinSetHideTitleButtonImpl(NativeNSWindowRef pWindow, CocoaWindowButtonType buttonType)
+{
+    NSButton *pButton = Nil;
+    switch (buttonType)
+    {
+        case CocoaWindowButtonType_Close:            pButton = [pWindow standardWindowButton:NSWindowCloseButton]; break;
+        case CocoaWindowButtonType_Miniaturize:      pButton = [pWindow standardWindowButton:NSWindowMiniaturizeButton]; break;
+        case CocoaWindowButtonType_Zoom:             pButton = [pWindow standardWindowButton:NSWindowZoomButton]; break;
+        case CocoaWindowButtonType_Toolbar:          pButton = [pWindow standardWindowButton:NSWindowToolbarButton]; break;
+        case CocoaWindowButtonType_DocumentIcon:     pButton = [pWindow standardWindowButton:NSWindowDocumentIconButton]; break;
+        case CocoaWindowButtonType_DocumentVersions: /*pButton = [pWindow standardWindowButton:NSWindowDocumentVersionsButton];*/ break;
+        case CocoaWindowButtonType_FullScreen:       /*pButton = [pWindow standardWindowButton:NSWindowFullScreenButton];*/ break;
+    }
+    if (pButton != Nil)
+        [pButton setHidden: YES];
+}
+
 void darwinSetShowsWindowTransparentImpl(NativeNSWindowRef pWindow, bool fEnabled)
 {
     if (fEnabled)
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp
index 584c7bd..941278b 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp
@@ -78,6 +78,11 @@ void darwinSetHidesAllTitleButtons(QWidget *pWidget)
 #endif /* !QT_MAC_USE_COCOA */
 }
 
+void darwinSetHideTitleButton(QWidget *pWidget, CocoaWindowButtonType buttonType)
+{
+    ::darwinSetHideTitleButtonImpl(::darwinToNativeWindow(pWidget), buttonType);
+}
+
 void darwinSetShowsWindowTransparent(QWidget *pWidget, bool fEnabled)
 {
     ::darwinSetShowsWindowTransparentImpl(::darwinToNativeWindow(pWidget), fEnabled);
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h
index 8cf73b9..bb7a160 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h
@@ -37,6 +37,18 @@ class QPixmap;
 class QToolBar;
 class QWidget;
 
+/** Cocoa window button types. */
+enum CocoaWindowButtonType
+{
+    CocoaWindowButtonType_Close,            // Since OS X 10.2
+    CocoaWindowButtonType_Miniaturize,      // Since OS X 10.2
+    CocoaWindowButtonType_Zoom,             // Since OS X 10.2
+    CocoaWindowButtonType_Toolbar,          // Since OS X 10.2
+    CocoaWindowButtonType_DocumentIcon,     // Since OS X 10.2
+    CocoaWindowButtonType_DocumentVersions, // Since OS X 10.7
+    CocoaWindowButtonType_FullScreen        // Since OS X 10.7
+};
+
 RT_C_DECLS_BEGIN
 
 /********************************************************************************
@@ -57,6 +69,7 @@ QString darwinFromNativeString(NativeNSStringRef pString);
 void darwinSetShowsToolbarButtonImpl(NativeNSWindowRef pWindow, bool fEnabled);
 void darwinSetShowsResizeIndicatorImpl(NativeNSWindowRef pWindow, bool fEnabled);
 void darwinSetHidesAllTitleButtonsImpl(NativeNSWindowRef pWindow);
+void darwinSetHideTitleButtonImpl(NativeNSWindowRef pWindow, CocoaWindowButtonType buttonType);
 void darwinLabelWindow(NativeNSWindowRef pWindow, NativeNSImageRef pImage, bool fCenter);
 void darwinSetShowsWindowTransparentImpl(NativeNSWindowRef pWindow, bool fEnabled);
 void darwinSetWindowHasShadow(NativeNSWindowRef pWindow, bool fEnabled);
@@ -227,6 +240,7 @@ void darwinSetShowsToolbarButton(QToolBar *aToolBar, bool fEnabled);
 void darwinLabelWindow(QWidget *pWidget, QPixmap *pPixmap, bool fCenter);
 void darwinSetShowsResizeIndicator(QWidget *pWidget, bool fEnabled);
 void darwinSetHidesAllTitleButtons(QWidget *pWidget);
+void darwinSetHideTitleButton(QWidget *pWidget, CocoaWindowButtonType buttonType);
 void darwinSetShowsWindowTransparent(QWidget *pWidget, bool fEnabled);
 void darwinSetWindowHasShadow(QWidget *pWidget, bool fEnabled);
 void darwinSetDockIconMenu(QMenu *pMenu);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp
index faefea4..7bc9021 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp
@@ -2156,6 +2156,7 @@ void UIActionPoolRuntime::preparePool()
 void UIActionPoolRuntime::prepareConnections()
 {
     /* Prepare connections: */
+    connect(gShortcutPool, SIGNAL(sigSelectorShortcutsReloaded()), this, SLOT(sltApplyShortcuts()));
     connect(gShortcutPool, SIGNAL(sigMachineShortcutsReloaded()), this, SLOT(sltApplyShortcuts()));
     connect(gEDataManager, SIGNAL(sigMenuBarConfigurationChange(const QString&)),
             this, SLOT(sltHandleConfigurationChange(const QString&)));
@@ -2984,10 +2985,10 @@ void UIActionPoolRuntime::updateMenuDebug()
 }
 #endif /* VBOX_WITH_DEBUGGER_GUI */
 
-void UIActionPoolRuntime::retranslateUi()
+void UIActionPoolRuntime::updateShortcuts()
 {
     /* Call to base-class: */
-    UIActionPool::retranslateUi();
+    UIActionPool::updateShortcuts();
     /* Create temporary Selector UI pool to do the same: */
     if (!m_fTemporary)
         UIActionPool::createTemporary(UIActionPoolType_Selector);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
index 2df0076..bd19e4e 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
@@ -267,8 +267,8 @@ protected:
     void updateMenuDebug();
 #endif /* VBOX_WITH_DEBUGGER_GUI */
 
-    /** Translation handler. */
-    virtual void retranslateUi();
+    /** Update shortcuts. */
+    virtual void updateShortcuts();
 
     /** Returns extra-data ID to save keyboard shortcuts under. */
     virtual QString shortcutsExtraDataID() const;
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.cpp
index 7cb4f83..93e0680 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.cpp
@@ -117,6 +117,7 @@ void UIConsoleEventHandler::prepare()
         << KVBoxEventType_OnStateChanged
         << KVBoxEventType_OnAdditionsStateChanged
         << KVBoxEventType_OnNetworkAdapterChanged
+        << KVBoxEventType_OnStorageDeviceChanged
         << KVBoxEventType_OnMediumChanged
         << KVBoxEventType_OnVRDEServerChanged
         << KVBoxEventType_OnVRDEServerInfoChanged
@@ -151,6 +152,9 @@ void UIConsoleEventHandler::prepare()
     connect(pListener->getWrapped(), SIGNAL(sigNetworkAdapterChange(CNetworkAdapter)),
             this, SIGNAL(sigNetworkAdapterChange(CNetworkAdapter)),
             Qt::QueuedConnection);
+    connect(pListener->getWrapped(), SIGNAL(sigStorageDeviceChange(CMediumAttachment, bool, bool)),
+            this, SIGNAL(sigStorageDeviceChange(CMediumAttachment, bool, bool)),
+            Qt::QueuedConnection);
     connect(pListener->getWrapped(), SIGNAL(sigMediumChange(CMediumAttachment)),
             this, SIGNAL(sigMediumChange(CMediumAttachment)),
             Qt::QueuedConnection);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h
index 8dae9b3..66655f4 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h
@@ -48,6 +48,8 @@ signals:
     void sigAdditionsChange();
     /** Notifies about network @a adapter state change. */
     void sigNetworkAdapterChange(CNetworkAdapter adapter);
+    /** Notifies about storage device change for @a attachment, which was @a fRemoved and it was @a fSilent for guest. */
+    void sigStorageDeviceChange(CMediumAttachment attachment, bool fRemoved, bool fSilent);
     /** Notifies about storage medium @a attachment state change. */
     void sigMediumChange(CMediumAttachment attachment);
     /** Notifies about VRDE device state change. */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
index fc7cc84..1f9d281 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
@@ -927,7 +927,7 @@ void UIMachineLogic::prepareSessionConnections()
             this, SLOT(sltHandleVBoxSVCAvailabilityChange()));
 
     /* We should watch for requested modes: */
-    connect(uisession(), SIGNAL(sigInitialized()), this, SLOT(sltCheckForRequestedVisualStateType()));
+    connect(uisession(), SIGNAL(sigInitialized()), this, SLOT(sltCheckForRequestedVisualStateType()), Qt::QueuedConnection);
     connect(uisession(), SIGNAL(sigAdditionsStateChange()), this, SLOT(sltCheckForRequestedVisualStateType()));
 
     /* We should watch for console events: */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
index b5d7137..7c999a1 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
@@ -773,6 +773,15 @@ void UISession::sltGuestMonitorChange(KGuestMonitorChangedEventType changeType,
     emit sigGuestMonitorChange(changeType, uScreenId, screenGeo);
 }
 
+void UISession::sltHandleStorageDeviceChange(const CMediumAttachment &attachment, bool fRemoved, bool fSilent)
+{
+    /* Update action restrictions: */
+    updateActionRestrictions();
+
+    /* Notify listeners about storage device change: */
+    emit sigStorageDeviceChange(attachment, fRemoved, fSilent);
+}
+
 #ifdef RT_OS_DARWIN
 /**
  * MacOS X: Restarts display-reconfiguration watchdog timer from the beginning.
@@ -1050,83 +1059,8 @@ void UISession::prepareActions()
         /* Configure action-pool: */
         actionPool()->toRuntime()->setSession(this);
 
-        /* Get host: */
-        const CHost host = vboxGlobal().host();
-        UIExtraDataMetaDefs::RuntimeMenuViewActionType restrictionForView = UIExtraDataMetaDefs::RuntimeMenuViewActionType_Invalid;
-        UIExtraDataMetaDefs::RuntimeMenuDevicesActionType restrictionForDevices = UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_Invalid;
-
-        /* VRDE server stuff: */
-        {
-            /* Initialize 'View' menu: */
-            const CVRDEServer server = machine().GetVRDEServer();
-            if (server.isNull())
-                restrictionForView = (UIExtraDataMetaDefs::RuntimeMenuViewActionType)(restrictionForView | UIExtraDataMetaDefs::RuntimeMenuViewActionType_VRDEServer);
-        }
-
-        /* Storage stuff: */
-        {
-            /* Initialize CD/FD menus: */
-            int iDevicesCountCD = 0;
-            int iDevicesCountFD = 0;
-            foreach (const CMediumAttachment &attachment, machine().GetMediumAttachments())
-            {
-                if (attachment.GetType() == KDeviceType_DVD)
-                    ++iDevicesCountCD;
-                if (attachment.GetType() == KDeviceType_Floppy)
-                    ++iDevicesCountFD;
-            }
-            QAction *pOpticalDevicesMenu = actionPool()->action(UIActionIndexRT_M_Devices_M_OpticalDevices);
-            QAction *pFloppyDevicesMenu = actionPool()->action(UIActionIndexRT_M_Devices_M_FloppyDevices);
-            pOpticalDevicesMenu->setData(iDevicesCountCD);
-            pFloppyDevicesMenu->setData(iDevicesCountFD);
-            if (!iDevicesCountCD)
-                restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_OpticalDevices);
-            if (!iDevicesCountFD)
-                restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_FloppyDevices);
-        }
-
-        /* Network stuff: */
-        {
-            /* Initialize Network menu: */
-            bool fAtLeastOneAdapterActive = false;
-            const KChipsetType chipsetType = machine().GetChipsetType();
-            ULONG uSlots = vboxGlobal().virtualBox().GetSystemProperties().GetMaxNetworkAdapters(chipsetType);
-            for (ULONG uSlot = 0; uSlot < uSlots; ++uSlot)
-            {
-                const CNetworkAdapter &adapter = machine().GetNetworkAdapter(uSlot);
-                if (adapter.GetEnabled())
-                {
-                    fAtLeastOneAdapterActive = true;
-                    break;
-                }
-            }
-            if (!fAtLeastOneAdapterActive)
-                restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_Network);
-        }
-
-        /* USB stuff: */
-        {
-            /* Check whether there is at least one USB controller with an available proxy. */
-            const bool fUSBEnabled =    !machine().GetUSBDeviceFilters().isNull()
-                                     && !machine().GetUSBControllers().isEmpty()
-                                     && machine().GetUSBProxyAvailable();
-            if (!fUSBEnabled)
-                restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_USBDevices);
-        }
-
-        /* WebCams stuff: */
-        {
-            /* Check whether there is an accessible video input devices pool: */
-            host.GetVideoInputDevices();
-            const bool fWebCamsEnabled = host.isOk() && !machine().GetUSBControllers().isEmpty();
-            if (!fWebCamsEnabled)
-                restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_WebCams);
-        }
-
-        /* Apply cumulative restriction for 'View' menu: */
-        actionPool()->toRuntime()->setRestrictionForMenuView(UIActionRestrictionLevel_Session, restrictionForView);
-        /* Apply cumulative restriction for 'Devices' menu: */
-        actionPool()->toRuntime()->setRestrictionForMenuDevices(UIActionRestrictionLevel_Session, restrictionForDevices);
+        /* Update action restrictions: */
+        updateActionRestrictions();
 
 #ifdef Q_WS_MAC
         /* Create Mac OS X menu-bar: */
@@ -1191,6 +1125,9 @@ void UISession::prepareConsoleEventHandlers()
     connect(gConsoleEvents, SIGNAL(sigNetworkAdapterChange(CNetworkAdapter)),
             this, SIGNAL(sigNetworkAdapterChange(CNetworkAdapter)));
 
+    connect(gConsoleEvents, SIGNAL(sigStorageDeviceChange(CMediumAttachment, bool, bool)),
+            this, SLOT(sltHandleStorageDeviceChange(CMediumAttachment, bool, bool)));
+
     connect(gConsoleEvents, SIGNAL(sigMediumChange(CMediumAttachment)),
             this, SIGNAL(sigMediumChange(CMediumAttachment)));
 
@@ -1972,6 +1909,87 @@ void UISession::updateHostScreenData()
         m_hostScreens << vboxGlobal().screenGeometry(iScreenIndex);
 }
 
+void UISession::updateActionRestrictions()
+{
+    /* Get host and prepare restrictions: */
+    const CHost host = vboxGlobal().host();
+    UIExtraDataMetaDefs::RuntimeMenuViewActionType restrictionForView = UIExtraDataMetaDefs::RuntimeMenuViewActionType_Invalid;
+    UIExtraDataMetaDefs::RuntimeMenuDevicesActionType restrictionForDevices = UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_Invalid;
+
+    /* VRDE server stuff: */
+    {
+        /* Initialize 'View' menu: */
+        const CVRDEServer server = machine().GetVRDEServer();
+        if (server.isNull())
+            restrictionForView = (UIExtraDataMetaDefs::RuntimeMenuViewActionType)(restrictionForView | UIExtraDataMetaDefs::RuntimeMenuViewActionType_VRDEServer);
+    }
+
+    /* Storage stuff: */
+    {
+        /* Initialize CD/FD menus: */
+        int iDevicesCountCD = 0;
+        int iDevicesCountFD = 0;
+        foreach (const CMediumAttachment &attachment, machine().GetMediumAttachments())
+        {
+            if (attachment.GetType() == KDeviceType_DVD)
+                ++iDevicesCountCD;
+            if (attachment.GetType() == KDeviceType_Floppy)
+                ++iDevicesCountFD;
+        }
+        QAction *pOpticalDevicesMenu = actionPool()->action(UIActionIndexRT_M_Devices_M_OpticalDevices);
+        QAction *pFloppyDevicesMenu = actionPool()->action(UIActionIndexRT_M_Devices_M_FloppyDevices);
+        pOpticalDevicesMenu->setData(iDevicesCountCD);
+        pFloppyDevicesMenu->setData(iDevicesCountFD);
+        if (!iDevicesCountCD)
+            restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_OpticalDevices);
+        if (!iDevicesCountFD)
+            restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_FloppyDevices);
+    }
+
+    /* Network stuff: */
+    {
+        /* Initialize Network menu: */
+        bool fAtLeastOneAdapterActive = false;
+        const KChipsetType chipsetType = machine().GetChipsetType();
+        ULONG uSlots = vboxGlobal().virtualBox().GetSystemProperties().GetMaxNetworkAdapters(chipsetType);
+        for (ULONG uSlot = 0; uSlot < uSlots; ++uSlot)
+        {
+            const CNetworkAdapter &adapter = machine().GetNetworkAdapter(uSlot);
+            if (adapter.GetEnabled())
+            {
+                fAtLeastOneAdapterActive = true;
+                break;
+            }
+        }
+        if (!fAtLeastOneAdapterActive)
+            restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_Network);
+    }
+
+    /* USB stuff: */
+    {
+        /* Check whether there is at least one USB controller with an available proxy. */
+        const bool fUSBEnabled =    !machine().GetUSBDeviceFilters().isNull()
+                                 && !machine().GetUSBControllers().isEmpty()
+                                 && machine().GetUSBProxyAvailable();
+        if (!fUSBEnabled)
+            restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_USBDevices);
+    }
+
+    /* WebCams stuff: */
+    {
+        /* Check whether there is an accessible video input devices pool: */
+        host.GetVideoInputDevices();
+        const bool fWebCamsEnabled = host.isOk() && !machine().GetUSBControllers().isEmpty();
+        if (!fWebCamsEnabled)
+            restrictionForDevices = (UIExtraDataMetaDefs::RuntimeMenuDevicesActionType)(restrictionForDevices | UIExtraDataMetaDefs::RuntimeMenuDevicesActionType_WebCams);
+    }
+
+    /* Apply cumulative restriction for 'View' menu: */
+    actionPool()->toRuntime()->setRestrictionForMenuView(UIActionRestrictionLevel_Session, restrictionForView);
+    /* Apply cumulative restriction for 'Devices' menu: */
+    actionPool()->toRuntime()->setRestrictionForMenuDevices(UIActionRestrictionLevel_Session, restrictionForDevices);
+}
+
 #ifdef VBOX_GUI_WITH_KEYS_RESET_HANDLER
 /**
  * Custom signal handler. When switching VTs, we might not get release events
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
index b64e03e..0b6f7d1 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
@@ -261,6 +261,8 @@ signals:
     void sigAdditionsStateChange();
     void sigAdditionsStateActualChange();
     void sigNetworkAdapterChange(const CNetworkAdapter &networkAdapter);
+    /** Notifies about storage device change for @a attachment, which was @a fRemoved and it was @a fSilent for guest. */
+    void sigStorageDeviceChange(const CMediumAttachment &attachment, bool fRemoved, bool fSilent);
     void sigMediumChange(const CMediumAttachment &mediumAttachment);
     void sigVRDEChange();
     void sigVideoCaptureChange();
@@ -316,6 +318,8 @@ private slots:
     void sltVRDEChange();
     void sltVideoCaptureChange();
     void sltGuestMonitorChange(KGuestMonitorChangedEventType changeType, ulong uScreenId, QRect screenGeo);
+    /** Handles storage device change for @a attachment, which was @a fRemoved and it was @a fSilent for guest. */
+    void sltHandleStorageDeviceChange(const CMediumAttachment &attachment, bool fRemoved, bool fSilent);
 
     /* Handlers: Display reconfiguration stuff: */
 #ifdef RT_OS_DARWIN
@@ -376,6 +380,9 @@ private:
     /** Update host-screen data. */
     void updateHostScreenData();
 
+    /** Updates action restrictions. */
+    void updateActionRestrictions();
+
     /* Private variables: */
     UIMachine *m_pMachine;
 
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
index 9c3f225..55ad4e3 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
@@ -303,6 +303,10 @@ void UIMachineWindowNormal::prepareVisualState()
         QPixmap betaLabel = ::betaLabel(QSize(100, 16));
         ::darwinLabelWindow(this, &betaLabel, true);
     }
+
+    /* No 'Zoom' button since El Capitan for now: */
+    if (vboxGlobal().osRelease() >= MacOSXRelease_ElCapitan)
+        darwinSetHideTitleButton(this, CocoaWindowButtonType_Zoom);
 #endif /* Q_WS_MAC */
 }
 
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp
index 8cb4a10..f4d6f5a 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp
@@ -69,6 +69,10 @@ void UIMachineWindowScale::prepareVisualState()
         QPixmap betaLabel = ::betaLabel(QSize(100, 16));
         ::darwinLabelWindow(this, &betaLabel, true);
     }
+
+    /* No 'Zoom' button since El Capitan for now: */
+    if (vboxGlobal().osRelease() >= MacOSXRelease_ElCapitan)
+        darwinSetHideTitleButton(this, CocoaWindowButtonType_Zoom);
 }
 #endif /* Q_WS_MAC */
 
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
index 80cc84c..f541814 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
@@ -1068,6 +1068,7 @@ void UIActionPoolSelector::prepareConnections()
 {
     /* Prepare connections: */
     connect(gShortcutPool, SIGNAL(sigSelectorShortcutsReloaded()), this, SLOT(sltApplyShortcuts()));
+    connect(gShortcutPool, SIGNAL(sigMachineShortcutsReloaded()), this, SLOT(sltApplyShortcuts()));
 
     /* Call to base-class: */
     UIActionPool::prepareConnections();
@@ -1079,10 +1080,10 @@ void UIActionPoolSelector::updateMenus()
     updateMenuHelp();
 }
 
-void UIActionPoolSelector::retranslateUi()
+void UIActionPoolSelector::updateShortcuts()
 {
     /* Call to base-class: */
-    UIActionPool::retranslateUi();
+    UIActionPool::updateShortcuts();
     /* Create temporary Runtime UI pool to do the same: */
     if (!m_fTemporary)
         UIActionPool::createTemporary(UIActionPoolType_Runtime);
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
index ae0f5a5..93f565b 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
@@ -113,8 +113,8 @@ protected:
     /** Update menus routine. */
     virtual void updateMenus();
 
-    /** Translation handler. */
-    virtual void retranslateUi();
+    /** Update shortcuts. */
+    virtual void updateShortcuts();
 
     /** Returns extra-data ID to save keyboard shortcuts under. */
     virtual QString shortcutsExtraDataID() const;
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
index 6704f78..ff6a7db 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
@@ -1,10 +1,10 @@
 /* $Id: UIGDetailsElements.cpp $ */
 /** @file
- * VBox Qt GUI - UIGDetailsDetails class implementation.
+ * VBox Qt GUI - UIGDetailsElement[Name] classes implementation.
  */
 
 /*
- * Copyright (C) 2012-2014 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -20,8 +20,9 @@
 #else  /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
 /* Qt includes: */
-# include <QTimer>
 # include <QDir>
+# include <QTimer>
+# include <QGraphicsLinearLayout>
 
 /* GUI includes: */
 # include "UIGDetailsElements.h"
@@ -35,6 +36,8 @@
 # include "UIMessageCenter.h"
 
 /* COM includes: */
+# include "COMEnums.h"
+# include "CMachine.h"
 # include "CSystemProperties.h"
 # include "CVRDEServer.h"
 # include "CStorageController.h"
@@ -51,156 +54,104 @@
 
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
-#include <QGraphicsLinearLayout>
-
 
-/* Constructor: */
-UIGDetailsUpdateThread::UIGDetailsUpdateThread(const CMachine &machine)
-    : m_machine(machine)
+UIGDetailsUpdateTask::UIGDetailsUpdateTask(const CMachine &machine)
+    : UITask(UITask::Type_DetailsPopulation)
 {
-    qRegisterMetaType<UITextTable>();
+    /* Store machine as property: */
+    setProperty("machine", QVariant::fromValue(machine));
 }
 
-UIGDetailsElementInterface::UIGDetailsElementInterface(UIGDetailsSet *pParent, DetailsElementType elementType, bool fOpened)
-    : UIGDetailsElement(pParent, elementType, fOpened)
-    , m_pThread(0)
+UIGDetailsElementInterface::UIGDetailsElementInterface(UIGDetailsSet *pParent, DetailsElementType type, bool fOpened)
+    : UIGDetailsElement(pParent, type, fOpened)
+    , m_pTask(0)
 {
+    /* Assign corresponding icon: */
+    setIcon(gpConverter->toIcon(elementType()));
+
+    /* Listen for the global thread-pool: */
+    connect(vboxGlobal().threadPool(), SIGNAL(sigTaskComplete(UITask*)),
+            this, SLOT(sltUpdateAppearanceFinished(UITask*)));
+
+    /* Translate finally: */
+    retranslateUi();
 }
 
-UIGDetailsElementInterface::~UIGDetailsElementInterface()
+void UIGDetailsElementInterface::retranslateUi()
 {
-    cleanupThread();
+    /* Assign corresponding name: */
+    setName(gpConverter->toString(elementType()));
 }
 
 void UIGDetailsElementInterface::updateAppearance()
 {
-    /* Call for base class: */
+    /* Call to base-class: */
     UIGDetailsElement::updateAppearance();
 
-    /* Create/start update thread in necessary: */
-    if (!m_pThread)
+    /* Prepare/start update task: */
+    if (!m_pTask)
     {
-        m_pThread = createUpdateThread();
-        connect(m_pThread, SIGNAL(sigComplete(const UITextTable&)),
-                this, SLOT(sltUpdateAppearanceFinished(const UITextTable&)));
-        m_pThread->start();
+        /* Prepare update task: */
+        m_pTask = createUpdateTask();
+        /* Post task into global thread-pool: */
+        vboxGlobal().threadPool()->enqueueTask(m_pTask);
     }
 }
 
-void UIGDetailsElementInterface::sltUpdateAppearanceFinished(const UITextTable &newText)
+void UIGDetailsElementInterface::sltUpdateAppearanceFinished(UITask *pTask)
 {
+    /* Make sure that is one of our tasks: */
+    if (pTask->type() != UITask::Type_DetailsPopulation)
+        return;
+
+    /* Skip unrelated tasks: */
+    if (m_pTask != pTask)
+        return;
+
+    /* Assign new text if changed: */
+    const UITextTable newText = pTask->property("table").value<UITextTable>();
     if (text() != newText)
         setText(newText);
-    cleanupThread();
-    emit sigBuildDone();
-}
-
-void UIGDetailsElementInterface::cleanupThread()
-{
-    if (m_pThread)
-    {
-        m_pThread->wait();
-        delete m_pThread;
-        m_pThread = 0;
-    }
-}
 
+    /* Mark task processed: */
+    m_pTask = 0;
 
-UIGDetailsUpdateThreadGeneral::UIGDetailsUpdateThreadGeneral(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
-{
+    /* Notify listeners about update task complete: */
+    emit sigBuildDone();
 }
 
-void UIGDetailsUpdateThreadGeneral::run()
+
+UIGDetailsElementPreview::UIGDetailsElementPreview(UIGDetailsSet *pParent, bool fOpened)
+    : UIGDetailsElement(pParent, DetailsElementType_Preview, fOpened)
 {
-    COMBase::InitializeCOM(false);
+    /* Assign corresponding icon: */
+    setIcon(gpConverter->toIcon(elementType()));
 
-    if (!machine().isNull())
+    /* Create layout: */
+    QGraphicsLinearLayout *pLayout = new QGraphicsLinearLayout;
+    AssertPtr(pLayout);
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        /* Prepare layout: */
+        const int iMargin = data(ElementData_Margin).toInt();
+        pLayout->setContentsMargins(iMargin, 2 * iMargin + minimumHeaderHeight(), iMargin, iMargin);
+        /* Assign layout to widget: */
+        setLayout(pLayout);
+        /* Create preview: */
+        m_pPreview = new UIGMachinePreview(this);
+        AssertPtr(m_pPreview);
         {
-            /* Machine name: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Name", "details (general)"), machine().GetName());
-
-            /* Operating system type: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Operating System", "details (general)"),
-                                       vboxGlobal().vmGuestOSTypeDescription(machine().GetOSTypeId()));
-
-            /* Get groups: */
-            QStringList groups = machine().GetGroups().toList();
-            /* Do not show groups for machine which is in root group only: */
-            if (groups.size() == 1)
-                groups.removeAll("/");
-            /* If group list still not empty: */
-            if (!groups.isEmpty())
-            {
-                /* For every group: */
-                for (int i = 0; i < groups.size(); ++i)
-                {
-                    /* Trim first '/' symbol: */
-                    QString &strGroup = groups[i];
-                    if (strGroup.startsWith("/") && strGroup != "/")
-                        strGroup.remove(0, 1);
-                }
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Groups", "details (general)"), groups.join(", "));
-            }
+            /* Prepare preview: */
+            connect(m_pPreview, SIGNAL(sigSizeHintChanged()),
+                    this, SLOT(sltPreviewSizeHintChanged()));
+            /* Add preview into layout: */
+            pLayout->addItem(m_pPreview);
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
     }
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementGeneral::UIGDetailsElementGeneral(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_General, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/machine_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementGeneral::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_General));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementGeneral::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadGeneral(machine());
-}
-
-
-UIGDetailsElementPreview::UIGDetailsElementPreview(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElement(pParent, DetailsElementType_Preview, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/machine_16px.png"));
-
-    /* Prepare variables: */
-    int iMargin = data(ElementData_Margin).toInt();
-    /* Prepare layout: */
-    QGraphicsLinearLayout *pLayout = new QGraphicsLinearLayout;
-    pLayout->setContentsMargins(iMargin, 2 * iMargin + minimumHeaderHeight(), iMargin, iMargin);
-    setLayout(pLayout);
-
-    /* Create preview: */
-    m_pPreview = new UIGMachinePreview(this);
-    connect(m_pPreview, SIGNAL(sigSizeHintChanged()),
-            this, SLOT(sltPreviewSizeHintChanged()));
-    pLayout->addItem(m_pPreview);
+    /* Set fixed size policy finally (after all content constructed): */
     setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
 
-    /* Translate: */
+    /* Translate finally: */
     retranslateUi();
 }
 
@@ -214,7 +165,8 @@ void UIGDetailsElementPreview::sltPreviewSizeHintChanged()
 
 void UIGDetailsElementPreview::retranslateUi()
 {
-    setName(gpConverter->toString(DetailsElementType_Preview));
+    /* Assign corresponding name: */
+    setName(gpConverter->toString(elementType()));
 }
 
 int UIGDetailsElementPreview::minimumWidthHint() const
@@ -280,511 +232,440 @@ void UIGDetailsElementPreview::updateLayout()
 
 void UIGDetailsElementPreview::updateAppearance()
 {
-    /* Call for base class: */
+    /* Call to base-class: */
     UIGDetailsElement::updateAppearance();
 
-    /* Set new machine attribute: */
+    /* Set new machine attribute directly: */
     m_pPreview->setMachine(machine());
     emit sigBuildDone();
 }
 
 
-UIGDetailsUpdateThreadSystem::UIGDetailsUpdateThreadSystem(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskGeneral::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadSystem::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        /* Machine name: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Name", "details (general)"), machine.GetName());
+
+        /* Operating system type: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Operating System", "details (general)"),
+                                 vboxGlobal().vmGuestOSTypeDescription(machine.GetOSTypeId()));
+
+        /* Get groups: */
+        QStringList groups = machine.GetGroups().toList();
+        /* Do not show groups for machine which is in root group only: */
+        if (groups.size() == 1)
+            groups.removeAll("/");
+        /* If group list still not empty: */
+        if (!groups.isEmpty())
         {
-            /* Base memory: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Base Memory", "details (system)"),
-                                      QApplication::translate("UIGDetails", "%1 MB", "details").arg(machine().GetMemorySize()));
-
-            /* CPU count: */
-            int cCPU = machine().GetCPUCount();
-            if (cCPU > 1)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Processors", "details (system)"),
-                                          QString::number(cCPU));
-
-            /* CPU execution cap: */
-            int iCPUExecCap = machine().GetCPUExecutionCap();
-            if (iCPUExecCap < 100)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Execution Cap", "details (system)"),
-                                          QApplication::translate("UIGDetails", "%1%", "details").arg(iCPUExecCap));
-
-            /* Boot-order: */
-            QStringList bootOrder;
-            for (ulong i = 1; i <= vboxGlobal().virtualBox().GetSystemProperties().GetMaxBootPosition(); ++i)
-            {
-                KDeviceType device = machine().GetBootOrder(i);
-                if (device == KDeviceType_Null)
-                    continue;
-                bootOrder << gpConverter->toString(device);
-            }
-            if (bootOrder.isEmpty())
-                bootOrder << gpConverter->toString(KDeviceType_Null);
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Boot Order", "details (system)"), bootOrder.join(", "));
-
-            /* Acceleration: */
-            QStringList acceleration;
-            if (vboxGlobal().virtualBox().GetHost().GetProcessorFeature(KProcessorFeature_HWVirtEx))
+            /* For every group: */
+            for (int i = 0; i < groups.size(); ++i)
             {
-                /* VT-x/AMD-V: */
-                if (machine().GetHWVirtExProperty(KHWVirtExPropertyType_Enabled))
-                {
-                    acceleration << QApplication::translate("UIGDetails", "VT-x/AMD-V", "details (system)");
-                    /* Nested Paging (only when hw virt is enabled): */
-                    if (machine().GetHWVirtExProperty(KHWVirtExPropertyType_NestedPaging))
-                        acceleration << QApplication::translate("UIGDetails", "Nested Paging", "details (system)");
-                }
+                /* Trim first '/' symbol: */
+                QString &strGroup = groups[i];
+                if (strGroup.startsWith("/") && strGroup != "/")
+                    strGroup.remove(0, 1);
             }
-            if (machine().GetCPUProperty(KCPUPropertyType_PAE))
-                acceleration << QApplication::translate("UIGDetails", "PAE/NX", "details (system)");
-            switch (machine().GetEffectiveParavirtProvider())
-            {
-                case KParavirtProvider_Minimal: acceleration << QApplication::translate("UIGDetails", "Minimal Paravirtualization", "details (system)"); break;
-                case KParavirtProvider_HyperV:  acceleration << QApplication::translate("UIGDetails", "Hyper-V Paravirtualization", "details (system)"); break;
-                case KParavirtProvider_KVM:     acceleration << QApplication::translate("UIGDetails", "KVM Paravirtualization", "details (system)"); break;
-                default: break;
-            }
-            if (!acceleration.isEmpty())
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (system)"),
-                                          acceleration.join(", "));
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Groups", "details (general)"), groups.join(", "));
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
-                                      QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
-UIGDetailsElementSystem::UIGDetailsElementSystem(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_System, fOpened)
+
+void UIGDetailsUpdateTaskSystem::run()
 {
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/chipset_16px.png"));
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-    /* Translate: */
-    retranslateUi();
-}
+    /* Prepare table: */
+    UITextTable table;
 
-void UIGDetailsElementSystem::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_System));
-}
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Base memory: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Base Memory", "details (system)"),
+                                 QApplication::translate("UIGDetails", "%1 MB", "details").arg(machine.GetMemorySize()));
+
+        /* CPU count: */
+        int cCPU = machine.GetCPUCount();
+        if (cCPU > 1)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Processors", "details (system)"),
+                                     QString::number(cCPU));
+
+        /* CPU execution cap: */
+        int iCPUExecCap = machine.GetCPUExecutionCap();
+        if (iCPUExecCap < 100)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Execution Cap", "details (system)"),
+                                     QApplication::translate("UIGDetails", "%1%", "details").arg(iCPUExecCap));
+
+        /* Boot-order: */
+        QStringList bootOrder;
+        for (ulong i = 1; i <= vboxGlobal().virtualBox().GetSystemProperties().GetMaxBootPosition(); ++i)
+        {
+            KDeviceType device = machine.GetBootOrder(i);
+            if (device == KDeviceType_Null)
+                continue;
+            bootOrder << gpConverter->toString(device);
+        }
+        if (bootOrder.isEmpty())
+            bootOrder << gpConverter->toString(KDeviceType_Null);
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Boot Order", "details (system)"), bootOrder.join(", "));
 
-UIGDetailsUpdateThread* UIGDetailsElementSystem::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadSystem(machine());
+        /* Acceleration: */
+        QStringList acceleration;
+        if (vboxGlobal().virtualBox().GetHost().GetProcessorFeature(KProcessorFeature_HWVirtEx))
+        {
+            /* VT-x/AMD-V: */
+            if (machine.GetHWVirtExProperty(KHWVirtExPropertyType_Enabled))
+            {
+                acceleration << QApplication::translate("UIGDetails", "VT-x/AMD-V", "details (system)");
+                /* Nested Paging (only when hw virt is enabled): */
+                if (machine.GetHWVirtExProperty(KHWVirtExPropertyType_NestedPaging))
+                    acceleration << QApplication::translate("UIGDetails", "Nested Paging", "details (system)");
+            }
+        }
+        if (machine.GetCPUProperty(KCPUPropertyType_PAE))
+            acceleration << QApplication::translate("UIGDetails", "PAE/NX", "details (system)");
+        switch (machine.GetEffectiveParavirtProvider())
+        {
+            case KParavirtProvider_Minimal: acceleration << QApplication::translate("UIGDetails", "Minimal Paravirtualization", "details (system)"); break;
+            case KParavirtProvider_HyperV:  acceleration << QApplication::translate("UIGDetails", "Hyper-V Paravirtualization", "details (system)"); break;
+            case KParavirtProvider_KVM:     acceleration << QApplication::translate("UIGDetails", "KVM Paravirtualization", "details (system)"); break;
+            default: break;
+        }
+        if (!acceleration.isEmpty())
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (system)"),
+                                     acceleration.join(", "));
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
+                                 QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
 
-UIGDetailsUpdateThreadDisplay::UIGDetailsUpdateThreadDisplay(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskDisplay::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadDisplay::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        /* Video memory: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Video Memory", "details (display)"),
+                                 QApplication::translate("UIGDetails", "%1 MB", "details").arg(machine.GetVRAMSize()));
+
+        /* Screen count: */
+        int cGuestScreens = machine.GetMonitorCount();
+        if (cGuestScreens > 1)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Screens", "details (display)"),
+                                     QString::number(cGuestScreens));
+
+        /* Get scale-factor value: */
+        const QString strScaleFactor = machine.GetExtraData(UIExtraDataDefs::GUI_ScaleFactor);
         {
-            /* Damn GetExtraData should be const already :( */
-            CMachine localMachine = machine();
-
-            /* Video memory: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Memory", "details (display)"),
-                                      QApplication::translate("UIGDetails", "%1 MB", "details").arg(localMachine.GetVRAMSize()));
-
-            /* Screen count: */
-            int cGuestScreens = localMachine.GetMonitorCount();
-            if (cGuestScreens > 1)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Screens", "details (display)"),
-                                          QString::number(cGuestScreens));
-
-            /* Get scale-factor value: */
-            const QString strScaleFactor = localMachine.GetExtraData(UIExtraDataDefs::GUI_ScaleFactor);
-            {
-                /* Try to convert loaded data to double: */
-                bool fOk = false;
-                double dValue = strScaleFactor.toDouble(&fOk);
-                /* Invent the default value: */
-                if (!fOk || !dValue)
-                    dValue = 1.0;
-                /* Append information: */
-                if (dValue != 1.0)
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Scale-factor", "details (display)"),
-                                              QString::number(dValue, 'f', 2));
-            }
+            /* Try to convert loaded data to double: */
+            bool fOk = false;
+            double dValue = strScaleFactor.toDouble(&fOk);
+            /* Invent the default value: */
+            if (!fOk || !dValue)
+                dValue = 1.0;
+            /* Append information: */
+            if (dValue != 1.0)
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Scale-factor", "details (display)"),
+                                         QString::number(dValue, 'f', 2));
+        }
 
 #ifdef Q_WS_MAC
-            /* Get 'Unscaled HiDPI Video Output' mode value: */
-            const QString strUnscaledHiDPIMode = localMachine.GetExtraData(UIExtraDataDefs::GUI_HiDPI_UnscaledOutput);
-            {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled  = strUnscaledHiDPIMode.compare("true", Qt::CaseInsensitive) == 0 ||
-                                       strUnscaledHiDPIMode.compare("yes", Qt::CaseInsensitive) == 0 ||
-                                       strUnscaledHiDPIMode.compare("on", Qt::CaseInsensitive) == 0 ||
-                                       strUnscaledHiDPIMode == "1";
-                /* Append information: */
-                if (fEnabled)
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Unscaled HiDPI Video Output", "details (display)"),
-                                              QApplication::translate("UIGDetails", "Enabled", "details (display/Unscaled HiDPI Video Output)"));
-            }
+        /* Get 'Unscaled HiDPI Video Output' mode value: */
+        const QString strUnscaledHiDPIMode = machine.GetExtraData(UIExtraDataDefs::GUI_HiDPI_UnscaledOutput);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled  = strUnscaledHiDPIMode.compare("true", Qt::CaseInsensitive) == 0 ||
+                                   strUnscaledHiDPIMode.compare("yes", Qt::CaseInsensitive) == 0 ||
+                                   strUnscaledHiDPIMode.compare("on", Qt::CaseInsensitive) == 0 ||
+                                   strUnscaledHiDPIMode == "1";
+            /* Append information: */
+            if (fEnabled)
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Unscaled HiDPI Video Output", "details (display)"),
+                                         QApplication::translate("UIGDetails", "Enabled", "details (display/Unscaled HiDPI Video Output)"));
+        }
 #endif /* Q_WS_MAC */
 
-            QStringList acceleration;
+        QStringList acceleration;
 #ifdef VBOX_WITH_VIDEOHWACCEL
-            /* 2D acceleration: */
-            if (localMachine.GetAccelerate2DVideoEnabled())
-                acceleration << QApplication::translate("UIGDetails", "2D Video", "details (display)");
+        /* 2D acceleration: */
+        if (machine.GetAccelerate2DVideoEnabled())
+            acceleration << QApplication::translate("UIGDetails", "2D Video", "details (display)");
 #endif /* VBOX_WITH_VIDEOHWACCEL */
-            /* 3D acceleration: */
-            if (localMachine.GetAccelerate3DEnabled())
-                acceleration << QApplication::translate("UIGDetails", "3D", "details (display)");
-            if (!acceleration.isEmpty())
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (display)"),
-                                          acceleration.join(", "));
-
-            /* VRDE info: */
-            CVRDEServer srv = localMachine.GetVRDEServer();
-            if (!srv.isNull())
-            {
-                if (srv.GetEnabled())
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server Port", "details (display/vrde)"),
-                                              srv.GetVRDEProperty("TCP/Ports"));
-                else
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server", "details (display/vrde)"),
-                                              QApplication::translate("UIGDetails", "Disabled", "details (display/vrde/VRDE server)"));
-            }
-
-            /* Video Capture info: */
-            if (localMachine.GetVideoCaptureEnabled())
-            {
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture File", "details (display/video capture)"),
-                                          localMachine.GetVideoCaptureFile());
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture Attributes", "details (display/video capture)"),
-                                          QApplication::translate("UIGDetails", "Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps")
-                                             .arg(localMachine.GetVideoCaptureWidth()).arg(localMachine.GetVideoCaptureHeight())
-                                             .arg(localMachine.GetVideoCaptureFPS()).arg(localMachine.GetVideoCaptureRate()));
-            }
+        /* 3D acceleration: */
+        if (machine.GetAccelerate3DEnabled())
+            acceleration << QApplication::translate("UIGDetails", "3D", "details (display)");
+        if (!acceleration.isEmpty())
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (display)"),
+                                     acceleration.join(", "));
+
+        /* VRDE info: */
+        CVRDEServer srv = machine.GetVRDEServer();
+        if (!srv.isNull())
+        {
+            if (srv.GetEnabled())
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server Port", "details (display/vrde)"),
+                                         srv.GetVRDEProperty("TCP/Ports"));
             else
-            {
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture", "details (display/video capture)"),
-                                          QApplication::translate("UIGDetails", "Disabled", "details (display/video capture)"));
-            }
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server", "details (display/vrde)"),
+                                         QApplication::translate("UIGDetails", "Disabled", "details (display/vrde/VRDE server)"));
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+        /* Video Capture info: */
+        if (machine.GetVideoCaptureEnabled())
+        {
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture File", "details (display/video capture)"),
+                                     machine.GetVideoCaptureFile());
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture Attributes", "details (display/video capture)"),
+                                     QApplication::translate("UIGDetails", "Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps")
+                                         .arg(machine.GetVideoCaptureWidth()).arg(machine.GetVideoCaptureHeight())
+                                         .arg(machine.GetVideoCaptureFPS()).arg(machine.GetVideoCaptureRate()));
+        }
+        else
+        {
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture", "details (display/video capture)"),
+                                     QApplication::translate("UIGDetails", "Disabled", "details (display/video capture)"));
+        }
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementDisplay::UIGDetailsElementDisplay(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_Display, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/vrdp_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementDisplay::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_Display));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementDisplay::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadDisplay(machine());
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
 
-UIGDetailsUpdateThreadStorage::UIGDetailsUpdateThreadStorage(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskStorage::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadStorage::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        /* Iterate over all the machine controllers: */
+        bool fSomeInfo = false;
+        foreach (const CStorageController &controller, machine.GetStorageControllers())
         {
-            /* Iterate over all the machine controllers: */
-            bool fSomeInfo = false;
-            foreach (const CStorageController &controller, machine().GetStorageControllers())
+            /* Add controller information: */
+            QString strControllerName = QApplication::translate("UIMachineSettingsStorage", "Controller: %1");
+            table << UITextTableLine(strControllerName.arg(controller.GetName()), QString());
+            fSomeInfo = true;
+            /* Populate map (its sorted!): */
+            QMap<StorageSlot, QString> attachmentsMap;
+            foreach (const CMediumAttachment &attachment, machine.GetMediumAttachmentsOfController(controller.GetName()))
             {
-                /* Add controller information: */
-                QString strControllerName = QApplication::translate("UIMachineSettingsStorage", "Controller: %1");
-                m_text << UITextTableLine(strControllerName.arg(controller.GetName()), QString());
-                fSomeInfo = true;
-                /* Populate map (its sorted!): */
-                QMap<StorageSlot, QString> attachmentsMap;
-                foreach (const CMediumAttachment &attachment, machine().GetMediumAttachmentsOfController(controller.GetName()))
+                /* Prepare current storage slot: */
+                StorageSlot attachmentSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice());
+                AssertMsg(controller.isOk(),
+                          ("Unable to acquire controller data: %s\n",
+                           msgCenter().formatRC(controller.lastRC()).toAscii().constData()));
+                if (!controller.isOk())
+                    continue;
+                /* Prepare attachment information: */
+                QString strAttachmentInfo = vboxGlobal().details(attachment.GetMedium(), false, false);
+                /* That temporary hack makes sure 'Inaccessible' word is always bold: */
+                { // hack
+                    QString strInaccessibleString(VBoxGlobal::tr("Inaccessible", "medium"));
+                    QString strBoldInaccessibleString(QString("<b>%1</b>").arg(strInaccessibleString));
+                    strAttachmentInfo.replace(strInaccessibleString, strBoldInaccessibleString);
+                } // hack
+                /* Append 'device slot name' with 'device type name' for optical devices only: */
+                KDeviceType deviceType = attachment.GetType();
+                QString strDeviceType = deviceType == KDeviceType_DVD ?
+                            QApplication::translate("UIGDetails", "[Optical Drive]", "details (storage)") : QString();
+                if (!strDeviceType.isNull())
+                    strDeviceType.append(' ');
+                /* Insert that attachment information into the map: */
+                if (!strAttachmentInfo.isNull())
                 {
-                    /* Prepare current storage slot: */
-                    StorageSlot attachmentSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice());
-                    AssertMsg(controller.isOk(),
-                              ("Unable to acquire controller data: %s\n",
-                               msgCenter().formatRC(controller.lastRC()).toAscii().constData()));
-                    if (!controller.isOk())
-                        continue;
-                    /* Prepare attachment information: */
-                    QString strAttachmentInfo = vboxGlobal().details(attachment.GetMedium(), false, false);
-                    /* That temporary hack makes sure 'Inaccessible' word is always bold: */
-                    { // hack
-                        QString strInaccessibleString(VBoxGlobal::tr("Inaccessible", "medium"));
-                        QString strBoldInaccessibleString(QString("<b>%1</b>").arg(strInaccessibleString));
-                        strAttachmentInfo.replace(strInaccessibleString, strBoldInaccessibleString);
-                    } // hack
-                    /* Append 'device slot name' with 'device type name' for optical devices only: */
-                    KDeviceType deviceType = attachment.GetType();
-                    QString strDeviceType = deviceType == KDeviceType_DVD ?
-                                QApplication::translate("UIGDetails", "[Optical Drive]", "details (storage)") : QString();
-                    if (!strDeviceType.isNull())
-                        strDeviceType.append(' ');
-                    /* Insert that attachment information into the map: */
-                    if (!strAttachmentInfo.isNull())
-                    {
-                        /* Configure hovering anchors: */
-                        const QString strAnchorType = deviceType == KDeviceType_DVD || deviceType == KDeviceType_Floppy ? QString("mount") :
-                                                      deviceType == KDeviceType_HardDisk ? QString("attach") : QString();
-                        const CMedium medium = attachment.GetMedium();
-                        const QString strMediumLocation = medium.isNull() ? QString() : medium.GetLocation();
-                        attachmentsMap.insert(attachmentSlot,
-                                              QString("<a href=#%1,%2,%3,%4>%5</a>")
-                                                      .arg(strAnchorType,
-                                                           controller.GetName(),
-                                                           gpConverter->toString(attachmentSlot),
-                                                           strMediumLocation,
-                                                           strDeviceType + strAttachmentInfo));
-                    }
+                    /* Configure hovering anchors: */
+                    const QString strAnchorType = deviceType == KDeviceType_DVD || deviceType == KDeviceType_Floppy ? QString("mount") :
+                                                  deviceType == KDeviceType_HardDisk ? QString("attach") : QString();
+                    const CMedium medium = attachment.GetMedium();
+                    const QString strMediumLocation = medium.isNull() ? QString() : medium.GetLocation();
+                    attachmentsMap.insert(attachmentSlot,
+                                          QString("<a href=#%1,%2,%3,%4>%5</a>")
+                                                  .arg(strAnchorType,
+                                                       controller.GetName(),
+                                                       gpConverter->toString(attachmentSlot),
+                                                       strMediumLocation,
+                                                       strDeviceType + strAttachmentInfo));
                 }
-                /* Iterate over the sorted map: */
-                QList<StorageSlot> storageSlots = attachmentsMap.keys();
-                QList<QString> storageInfo = attachmentsMap.values();
-                for (int i = 0; i < storageSlots.size(); ++i)
-                    m_text << UITextTableLine(QString("  ") + gpConverter->toString(storageSlots[i]), storageInfo[i]);
             }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Not Attached", "details (storage)"), QString());
+            /* Iterate over the sorted map: */
+            QList<StorageSlot> storageSlots = attachmentsMap.keys();
+            QList<QString> storageInfo = attachmentsMap.values();
+            for (int i = 0; i < storageSlots.size(); ++i)
+                table << UITextTableLine(QString("  ") + gpConverter->toString(storageSlots[i]), storageInfo[i]);
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Not Attached", "details (storage)"), QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementStorage::UIGDetailsElementStorage(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_Storage, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/hd_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
-void UIGDetailsElementStorage::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_Storage));
-}
 
-UIGDetailsUpdateThread* UIGDetailsElementStorage::createUpdateThread()
+void UIGDetailsUpdateTaskAudio::run()
 {
-    return new UIGDetailsUpdateThreadStorage(machine());
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
+    /* Prepare table: */
+    UITextTable table;
 
-UIGDetailsUpdateThreadAudio::UIGDetailsUpdateThreadAudio(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
-{
-}
-
-void UIGDetailsUpdateThreadAudio::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        const CAudioAdapter &audio = machine.GetAudioAdapter();
+        if (audio.GetEnabled())
         {
-            const CAudioAdapter &audio = machine().GetAudioAdapter();
-            if (audio.GetEnabled())
-            {
-                /* Driver: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Host Driver", "details (audio)"),
-                                          gpConverter->toString(audio.GetAudioDriver()));
+            /* Driver: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Host Driver", "details (audio)"),
+                                     gpConverter->toString(audio.GetAudioDriver()));
 
-                /* Controller: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Controller", "details (audio)"),
-                                          gpConverter->toString(audio.GetAudioController()));
-            }
-            else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (audio)"),
-                                          QString());
+            /* Controller: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Controller", "details (audio)"),
+                                     gpConverter->toString(audio.GetAudioController()));
         }
         else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
-                                      QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (audio)"),
+                                     QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
+                                 QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementAudio::UIGDetailsElementAudio(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_Audio, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/sound_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementAudio::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_Audio));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementAudio::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadAudio(machine());
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
 
-UIGDetailsUpdateThreadNetwork::UIGDetailsUpdateThreadNetwork(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskNetwork::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadNetwork::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        /* Iterate over all the adapters: */
+        bool fSomeInfo = false;
+        ulong uSount = vboxGlobal().virtualBox().GetSystemProperties().GetMaxNetworkAdapters(KChipsetType_PIIX3);
+        for (ulong uSlot = 0; uSlot < uSount; ++uSlot)
         {
-            /* Iterate over all the adapters: */
-            bool fSomeInfo = false;
-            ulong uSount = vboxGlobal().virtualBox().GetSystemProperties().GetMaxNetworkAdapters(KChipsetType_PIIX3);
-            for (ulong uSlot = 0; uSlot < uSount; ++uSlot)
+            const CNetworkAdapter &adapter = machine.GetNetworkAdapter(uSlot);
+            if (adapter.GetEnabled())
             {
-                const CNetworkAdapter &adapter = machine().GetNetworkAdapter(uSlot);
-                if (adapter.GetEnabled())
+                KNetworkAttachmentType type = adapter.GetAttachmentType();
+                QString strAttachmentType = gpConverter->toString(adapter.GetAdapterType())
+                                            .replace(QRegExp("\\s\\(.+\\)"), " (%1)");
+                switch (type)
                 {
-                    KNetworkAttachmentType type = adapter.GetAttachmentType();
-                    QString strAttachmentType = gpConverter->toString(adapter.GetAdapterType())
-                                                .replace(QRegExp("\\s\\(.+\\)"), " (%1)");
-                    switch (type)
+                    case KNetworkAttachmentType_Bridged:
                     {
-                        case KNetworkAttachmentType_Bridged:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Bridged Adapter, %1", "details (network)")
-                                                                      .arg(adapter.GetBridgedInterface()));
-                            break;
-                        }
-                        case KNetworkAttachmentType_Internal:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Internal Network, '%1'", "details (network)")
-                                                                      .arg(adapter.GetInternalNetwork()));
-                            break;
-                        }
-                        case KNetworkAttachmentType_HostOnly:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Host-only Adapter, '%1'", "details (network)")
-                                                                      .arg(adapter.GetHostOnlyInterface()));
-                            break;
-                        }
-                        case KNetworkAttachmentType_Generic:
-                        {
-                            QString strGenericDriverProperties(summarizeGenericProperties(adapter));
-                            strAttachmentType = strGenericDriverProperties.isNull() ?
-                                      strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1'", "details (network)").arg(adapter.GetGenericDriver())) :
-                                      strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1' { %2 }", "details (network)")
-                                                            .arg(adapter.GetGenericDriver(), strGenericDriverProperties));
-                            break;
-                        }
-                        case KNetworkAttachmentType_NATNetwork:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "NAT Network, '%1'", "details (network)")
-                                                                      .arg(adapter.GetNATNetwork()));
-                            break;
-                        }
-                        default:
-                        {
-                            strAttachmentType = strAttachmentType.arg(gpConverter->toString(type));
-                            break;
-                        }
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Bridged Adapter, %1", "details (network)")
+                                                                  .arg(adapter.GetBridgedInterface()));
+                        break;
+                    }
+                    case KNetworkAttachmentType_Internal:
+                    {
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Internal Network, '%1'", "details (network)")
+                                                                  .arg(adapter.GetInternalNetwork()));
+                        break;
+                    }
+                    case KNetworkAttachmentType_HostOnly:
+                    {
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Host-only Adapter, '%1'", "details (network)")
+                                                                  .arg(adapter.GetHostOnlyInterface()));
+                        break;
+                    }
+                    case KNetworkAttachmentType_Generic:
+                    {
+                        QString strGenericDriverProperties(summarizeGenericProperties(adapter));
+                        strAttachmentType = strGenericDriverProperties.isNull() ?
+                                  strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1'", "details (network)").arg(adapter.GetGenericDriver())) :
+                                  strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1' { %2 }", "details (network)")
+                                                        .arg(adapter.GetGenericDriver(), strGenericDriverProperties));
+                        break;
+                    }
+                    case KNetworkAttachmentType_NATNetwork:
+                    {
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "NAT Network, '%1'", "details (network)")
+                                                                  .arg(adapter.GetNATNetwork()));
+                        break;
+                    }
+                    default:
+                    {
+                        strAttachmentType = strAttachmentType.arg(gpConverter->toString(type));
+                        break;
                     }
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Adapter %1", "details (network)").arg(adapter.GetSlot() + 1), strAttachmentType);
-                    fSomeInfo = true;
                 }
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Adapter %1", "details (network)").arg(adapter.GetSlot() + 1), strAttachmentType);
+                fSomeInfo = true;
             }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (network/adapter)"), QString());
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (network/adapter)"), QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
 /* static */
-QString UIGDetailsUpdateThreadNetwork::summarizeGenericProperties(const CNetworkAdapter &adapter)
+QString UIGDetailsUpdateTaskNetwork::summarizeGenericProperties(const CNetworkAdapter &adapter)
 {
     QVector<QString> names;
     QVector<QString> props;
@@ -799,465 +680,280 @@ QString UIGDetailsUpdateThreadNetwork::summarizeGenericProperties(const CNetwork
     return strResult;
 }
 
-UIGDetailsElementNetwork::UIGDetailsElementNetwork(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_Network, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/nw_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementNetwork::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_Network));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementNetwork::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadNetwork(machine());
-}
 
-
-UIGDetailsUpdateThreadSerial::UIGDetailsUpdateThreadSerial(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskSerial::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadSerial::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        /* Iterate over all the ports: */
+        bool fSomeInfo = false;
+        ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetSerialPortCount();
+        for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
         {
-            /* Iterate over all the ports: */
-            bool fSomeInfo = false;
-            ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetSerialPortCount();
-            for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
+            const CSerialPort &port = machine.GetSerialPort(uSlot);
+            if (port.GetEnabled())
             {
-                const CSerialPort &port = machine().GetSerialPort(uSlot);
-                if (port.GetEnabled())
-                {
-                    KPortMode mode = port.GetHostMode();
-                    QString data = vboxGlobal().toCOMPortName(port.GetIRQ(), port.GetIOBase()) + ", ";
-                    if (mode == KPortMode_HostPipe || mode == KPortMode_HostDevice ||
-                        mode == KPortMode_RawFile || mode == KPortMode_TCP)
-                        data += QString("%1 (%2)").arg(gpConverter->toString(mode)).arg(QDir::toNativeSeparators(port.GetPath()));
-                    else
-                        data += gpConverter->toString(mode);
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (serial)").arg(port.GetSlot() + 1), data);
-                    fSomeInfo = true;
-                }
+                KPortMode mode = port.GetHostMode();
+                QString data = vboxGlobal().toCOMPortName(port.GetIRQ(), port.GetIOBase()) + ", ";
+                if (mode == KPortMode_HostPipe || mode == KPortMode_HostDevice ||
+                    mode == KPortMode_RawFile || mode == KPortMode_TCP)
+                    data += QString("%1 (%2)").arg(gpConverter->toString(mode)).arg(QDir::toNativeSeparators(port.GetPath()));
+                else
+                    data += gpConverter->toString(mode);
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (serial)").arg(port.GetSlot() + 1), data);
+                fSomeInfo = true;
             }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (serial)"), QString());
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (serial)"), QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementSerial::UIGDetailsElementSerial(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_Serial, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/serial_port_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementSerial::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_Serial));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementSerial::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadSerial(machine());
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
 
 #ifdef VBOX_WITH_PARALLEL_PORTS
-UIGDetailsUpdateThreadParallel::UIGDetailsUpdateThreadParallel(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskParallel::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadParallel::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        bool fSomeInfo = false;
+        ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetParallelPortCount();
+        for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
         {
-            bool fSomeInfo = false;
-            ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetParallelPortCount();
-            for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
+            const CParallelPort &port = machine.GetParallelPort(uSlot);
+            if (port.GetEnabled())
             {
-                const CParallelPort &port = machine().GetParallelPort(uSlot);
-                if (port.GetEnabled())
-                {
-                    QString data = vboxGlobal().toLPTPortName(port.GetIRQ(), port.GetIOBase()) +
-                                   QString(" (<nobr>%1</nobr>)").arg(QDir::toNativeSeparators(port.GetPath()));
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (parallel)").arg(port.GetSlot() + 1), data);
-                    fSomeInfo = true;
-                }
+                QString data = vboxGlobal().toLPTPortName(port.GetIRQ(), port.GetIOBase()) +
+                               QString(" (<nobr>%1</nobr>)").arg(QDir::toNativeSeparators(port.GetPath()));
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (parallel)").arg(port.GetSlot() + 1), data);
+                fSomeInfo = true;
             }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (parallel)"), QString());
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (parallel)"), QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementParallel::UIGDetailsElementParallel(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_Parallel, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/parallel_port_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementParallel::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_Parallel));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementParallel::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadParallel(machine());
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 #endif /* VBOX_WITH_PARALLEL_PORTS */
 
 
-UIGDetailsUpdateThreadUSB::UIGDetailsUpdateThreadUSB(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskUSB::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadUSB::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
+        /* Iterate over all the USB filters: */
+        const CUSBDeviceFilters &filters = machine.GetUSBDeviceFilters();
+        if (!filters.isNull() && machine.GetUSBProxyAvailable())
         {
-            /* Iterate over all the USB filters: */
-            const CUSBDeviceFilters &filters = machine().GetUSBDeviceFilters();
-            if (!filters.isNull() && machine().GetUSBProxyAvailable())
+            const CUSBDeviceFilters flts = machine.GetUSBDeviceFilters();
+            const CUSBControllerVector controllers = machine.GetUSBControllers();
+            if (!flts.isNull() && !controllers.isEmpty())
             {
-                const CUSBDeviceFilters flts = machine().GetUSBDeviceFilters();
-                const CUSBControllerVector controllers = machine().GetUSBControllers();
-                if (!flts.isNull() && !controllers.isEmpty())
-                {
-                    /* USB Controllers info: */
-                    QStringList controllerList;
-                    foreach (const CUSBController &controller, controllers)
-                        controllerList << gpConverter->toString(controller.GetType());
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller", "details (usb)"),
-                                              controllerList.join(", "));
-                    /* USB Device Filters info: */
-                    const CUSBDeviceFilterVector &coll = flts.GetDeviceFilters();
-                    uint uActive = 0;
-                    for (int i = 0; i < coll.size(); ++i)
-                        if (coll[i].GetActive())
-                            ++uActive;
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Device Filters", "details (usb)"),
-                                              QApplication::translate("UIGDetails", "%1 (%2 active)", "details (usb)").arg(coll.size()).arg(uActive));
-                }
-                else
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (usb)"), QString());
+                /* USB Controllers info: */
+                QStringList controllerList;
+                foreach (const CUSBController &controller, controllers)
+                    controllerList << gpConverter->toString(controller.GetType());
+                table << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller", "details (usb)"),
+                                          controllerList.join(", "));
+                /* USB Device Filters info: */
+                const CUSBDeviceFilterVector &coll = flts.GetDeviceFilters();
+                uint uActive = 0;
+                for (int i = 0; i < coll.size(); ++i)
+                    if (coll[i].GetActive())
+                        ++uActive;
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Device Filters", "details (usb)"),
+                                         QApplication::translate("UIGDetails", "%1 (%2 active)", "details (usb)").arg(coll.size()).arg(uActive));
             }
             else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller Inaccessible", "details (usb)"), QString());
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (usb)"), QString());
         }
         else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+            table << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller Inaccessible", "details (usb)"), QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementUSB::UIGDetailsElementUSB(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_USB, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/usb_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
-void UIGDetailsElementUSB::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_USB));
-}
 
-UIGDetailsUpdateThread* UIGDetailsElementUSB::createUpdateThread()
+void UIGDetailsUpdateTaskSF::run()
 {
-    return new UIGDetailsUpdateThreadUSB(machine());
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
+    /* Prepare table: */
+    UITextTable table;
 
-UIGDetailsUpdateThreadSF::UIGDetailsUpdateThreadSF(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
-{
-}
-
-void UIGDetailsUpdateThreadSF::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Iterate over all the shared folders: */
-            ulong uCount = machine().GetSharedFolders().size();
-            if (uCount > 0)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Shared Folders", "details (shared folders)"), QString::number(uCount));
-            else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (shared folders)"), QString());
-        }
+        /* Iterate over all the shared folders: */
+        ulong uCount = machine.GetSharedFolders().size();
+        if (uCount > 0)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Shared Folders", "details (shared folders)"), QString::number(uCount));
         else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+            table << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (shared folders)"), QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementSF::UIGDetailsElementSF(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_SF, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/sf_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementSF::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_SF));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementSF::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadSF(machine());
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
 
-UIGDetailsUpdateThreadUI::UIGDetailsUpdateThreadUI(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
+void UIGDetailsUpdateTaskUI::run()
 {
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
-void UIGDetailsUpdateThreadUI::run()
-{
-    COMBase::InitializeCOM(false);
+    /* Prepare table: */
+    UITextTable table;
 
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Damn GetExtraData should be const already :( */
-            CMachine localMachine = machine();
-
 #ifndef Q_WS_MAC
-            /* Get menu-bar availability status: */
-            const QString strMenubarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_MenuBar_Enabled);
-            {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled = !(strMenubarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
-                                        strMenubarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
-                                        strMenubarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
-                                        strMenubarEnabled == "0");
-                /* Append information: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Menu-bar", "details (user interface)"),
-                                          fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/menu-bar)") :
-                                                     QApplication::translate("UIGDetails", "Disabled", "details (user interface/menu-bar)"));
-            }
+        /* Get menu-bar availability status: */
+        const QString strMenubarEnabled = machine.GetExtraData(UIExtraDataDefs::GUI_MenuBar_Enabled);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled = !(strMenubarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+                                    strMenubarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+                                    strMenubarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+                                    strMenubarEnabled == "0");
+            /* Append information: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Menu-bar", "details (user interface)"),
+                                     fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/menu-bar)") :
+                                                QApplication::translate("UIGDetails", "Disabled", "details (user interface/menu-bar)"));
+        }
 #endif /* !Q_WS_MAC */
 
-            /* Get status-bar availability status: */
-            const QString strStatusbarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_StatusBar_Enabled);
-            {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled = !(strStatusbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
-                                        strStatusbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
-                                        strStatusbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
-                                        strStatusbarEnabled == "0");
-                /* Append information: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Status-bar", "details (user interface)"),
-                                          fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/status-bar)") :
-                                                     QApplication::translate("UIGDetails", "Disabled", "details (user interface/status-bar)"));
-            }
+        /* Get status-bar availability status: */
+        const QString strStatusbarEnabled = machine.GetExtraData(UIExtraDataDefs::GUI_StatusBar_Enabled);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled = !(strStatusbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+                                    strStatusbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+                                    strStatusbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+                                    strStatusbarEnabled == "0");
+            /* Append information: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Status-bar", "details (user interface)"),
+                                     fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/status-bar)") :
+                                                QApplication::translate("UIGDetails", "Disabled", "details (user interface/status-bar)"));
+        }
 
 #ifndef Q_WS_MAC
-            /* Get mini-toolbar availability status: */
-            const QString strMiniToolbarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_ShowMiniToolBar);
+        /* Get mini-toolbar availability status: */
+        const QString strMiniToolbarEnabled = machine.GetExtraData(UIExtraDataDefs::GUI_ShowMiniToolBar);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled = !(strMiniToolbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+                                    strMiniToolbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+                                    strMiniToolbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+                                    strMiniToolbarEnabled == "0");
+            /* Append information: */
+            if (fEnabled)
             {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled = !(strMiniToolbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
-                                        strMiniToolbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
-                                        strMiniToolbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
-                                        strMiniToolbarEnabled == "0");
-                /* Append information: */
-                if (fEnabled)
+                /* Get mini-toolbar position: */
+                const QString &strMiniToolbarPosition = machine.GetExtraData(UIExtraDataDefs::GUI_MiniToolBarAlignment);
                 {
-                    /* Get mini-toolbar position: */
-                    const QString &strMiniToolbarPosition = localMachine.GetExtraData(UIExtraDataDefs::GUI_MiniToolBarAlignment);
+                    /* Try to convert loaded data to alignment: */
+                    switch (gpConverter->fromInternalString<MiniToolbarAlignment>(strMiniToolbarPosition))
                     {
-                        /* Try to convert loaded data to alignment: */
-                        switch (gpConverter->fromInternalString<MiniToolbarAlignment>(strMiniToolbarPosition))
-                        {
-                            /* Append information: */
-                            case MiniToolbarAlignment_Top:
-                                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
-                                                          QApplication::translate("UIGDetails", "Top", "details (user interface/mini-toolbar position)"));
-                                break;
-                            /* Append information: */
-                            case MiniToolbarAlignment_Bottom:
-                                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
-                                                          QApplication::translate("UIGDetails", "Bottom", "details (user interface/mini-toolbar position)"));
-                                break;
-                        }
+                        /* Append information: */
+                        case MiniToolbarAlignment_Top:
+                            table << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
+                                                     QApplication::translate("UIGDetails", "Top", "details (user interface/mini-toolbar position)"));
+                            break;
+                        /* Append information: */
+                        case MiniToolbarAlignment_Bottom:
+                            table << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
+                                                     QApplication::translate("UIGDetails", "Bottom", "details (user interface/mini-toolbar position)"));
+                            break;
                     }
                 }
-                /* Append information: */
-                else
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar", "details (user interface)"),
-                                              QApplication::translate("UIGDetails", "Disabled", "details (user interface/mini-toolbar)"));
             }
-#endif /* !Q_WS_MAC */
+            /* Append information: */
+            else
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar", "details (user interface)"),
+                                         QApplication::translate("UIGDetails", "Disabled", "details (user interface/mini-toolbar)"));
         }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+#endif /* !Q_WS_MAC */
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementUI::UIGDetailsElementUI(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_UI, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/interface_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
-void UIGDetailsElementUI::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_UI));
-}
 
-UIGDetailsUpdateThread* UIGDetailsElementUI::createUpdateThread()
+void UIGDetailsUpdateTaskDescription::run()
 {
-    return new UIGDetailsUpdateThreadUI(machine());
-}
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
 
+    /* Prepare table: */
+    UITextTable table;
 
-UIGDetailsUpdateThreadDescription::UIGDetailsUpdateThreadDescription(const CMachine &machine)
-    : UIGDetailsUpdateThread(machine)
-{
-}
-
-void UIGDetailsUpdateThreadDescription::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
+    /* Gather information: */
+    if (machine.GetAccessible())
     {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Get description: */
-            const QString &strDesc = machine().GetDescription();
-            if (!strDesc.isEmpty())
-                m_text << UITextTableLine(strDesc, QString());
-            else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (description)"), QString());
-        }
+        /* Get description: */
+        const QString &strDesc = machine.GetDescription();
+        if (!strDesc.isEmpty())
+            table << UITextTableLine(strDesc, QString());
         else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
+            table << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (description)"), QString());
     }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
 
-    COMBase::CleanupCOM();
-}
-
-UIGDetailsElementDescription::UIGDetailsElementDescription(UIGDetailsSet *pParent, bool fOpened)
-    : UIGDetailsElementInterface(pParent, DetailsElementType_Description, fOpened)
-{
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/description_16px.png"));
-
-    /* Translate: */
-    retranslateUi();
-}
-
-void UIGDetailsElementDescription::retranslateUi()
-{
-    setName(gpConverter->toString(DetailsElementType_Description));
-}
-
-UIGDetailsUpdateThread* UIGDetailsElementDescription::createUpdateThread()
-{
-    return new UIGDetailsUpdateThreadDescription(machine());
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h
index 0e140db..9f989f0 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h
@@ -1,10 +1,10 @@
 /* $Id: UIGDetailsElements.h $ */
 /** @file
- * VBox Qt GUI - UIGDetailsElements class declaration.
+ * VBox Qt GUI - UIGDetailsElement[Name] classes declaration.
  */
 
 /*
- * Copyright (C) 2012-2013 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -15,546 +15,538 @@
  * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
  */
 
-#ifndef __UIGDetailsElements_h__
-#define __UIGDetailsElements_h__
-
-/* Qt includes: */
-#include <QThread>
+#ifndef ___UIGDetailsElements_h___
+#define ___UIGDetailsElements_h___
 
 /* GUI includes: */
+#include "UIThreadPool.h"
 #include "UIGDetailsElement.h"
 
-/* COM includes: */
-#include "COMEnums.h"
-#include "CMachine.h"
-
 /* Forward declarations: */
 class UIGMachinePreview;
+class CNetworkAdapter;
 
-/* Element update thread: */
-class UIGDetailsUpdateThread : public QThread
+
+/** UITask extension used as update task for the details-element. */
+class UIGDetailsUpdateTask : public UITask
 {
     Q_OBJECT;
 
-signals:
-
-    /* Notifier: Prepare stuff: */
-    void sigComplete(const UITextTable &text);
-
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThread(const CMachine &machine);
-
-protected:
-
-    /* Internal API: Machine stuff: */
-    const CMachine& machine() const { return m_machine; }
-
-private:
-
-    /* Variables: */
-    const CMachine &m_machine;
+    /** Constructs update task taking @a machine as data. */
+    UIGDetailsUpdateTask(const CMachine &machine);
 };
 
-/* Details element interface: */
+/** UIGDetailsElement extension used as a wrapping interface to
+  * extend base-class with async functionality performed by the COM worker-threads. */
 class UIGDetailsElementInterface : public UIGDetailsElement
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor/destructor: */
-    UIGDetailsElementInterface(UIGDetailsSet *pParent, DetailsElementType elementType, bool fOpened);
-    ~UIGDetailsElementInterface();
+    /** Constructs details-element interface for passed @a pParent set.
+      * @param type    brings the details-element type this element belongs to.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementInterface(UIGDetailsSet *pParent, DetailsElementType type, bool fOpened);
 
 protected:
 
-    /* Helpers: Update stuff: */
-    void updateAppearance();
-    virtual UIGDetailsUpdateThread* createUpdateThread() = 0;
+    /** Performs translation. */
+    virtual void retranslateUi();
+
+    /** Updates appearance. */
+    virtual void updateAppearance();
+
+    /** Creates update task. */
+    virtual UITask* createUpdateTask() = 0;
 
 private slots:
 
-    /* Handler: Update stuff: */
-    virtual void sltUpdateAppearanceFinished(const UITextTable &newText);
+    /** Handles the signal about update @a pTask is finished. */
+    virtual void sltUpdateAppearanceFinished(UITask *pTask);
 
 private:
 
-    /* Helpers: Cleanup stuff: */
-    void cleanupThread();
-
-    /* Variables: */
-    UIGDetailsUpdateThread *m_pThread;
+    /** Holds the instance of the update task. */
+    UITask *m_pTask;
 };
 
 
-/* Thread 'General': */
-class UIGDetailsUpdateThreadGeneral : public UIGDetailsUpdateThread
+/** UIGDetailsElementInterface extension for the details-element type 'Preview'. */
+class UIGDetailsElementPreview : public UIGDetailsElement
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadGeneral(const CMachine &machine);
+    /** Constructs details-element interface for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be opened. */
+    UIGDetailsElementPreview(UIGDetailsSet *pParent, bool fOpened);
+
+private slots:
+
+    /** Handles preview size-hint changes. */
+    void sltPreviewSizeHintChanged();
 
 private:
 
-    /* Helpers: Prepare stuff: */
-    void run();
+    /** Performs translation. */
+    virtual void retranslateUi();
+
+    /** Returns minimum width hint. */
+    int minimumWidthHint() const;
+    /** Returns minimum height hint.
+      * @param fClosed allows to specify whether the hint should
+      *                be calculated for the closed element. */
+    int minimumHeightHint(bool fClosed) const;
+    /** Updates layout. */
+    void updateLayout();
+
+    /** Updates appearance. */
+    void updateAppearance();
+
+    /** Holds the instance of VM preview. */
+    UIGMachinePreview *m_pPreview;
 };
 
-/* Element 'General': */
-class UIGDetailsElementGeneral : public UIGDetailsElementInterface
+
+/** UITask extension used as update task for the details-element type 'General'. */
+class UIGDetailsUpdateTaskGeneral : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementGeneral(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskGeneral(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Contains update task body. */
+    void run();
 };
 
-
-/* Element 'Preview': */
-class UIGDetailsElementPreview : public UIGDetailsElement
+/** UIGDetailsElementInterface extension for the details-element type 'General'. */
+class UIGDetailsElementGeneral : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementPreview(UIGDetailsSet *pParent, bool fOpened);
-
-private slots:
-
-    /** Handles preview size-hint changes. */
-    void sltPreviewSizeHintChanged();
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementGeneral(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_General, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helpers: Layout stuff: */
-    int minimumWidthHint() const;
-    int minimumHeightHint(bool fClosed) const;
-    void updateLayout();
-
-    /* Helper: Update stuff: */
-    void updateAppearance();
-
-    /* Variables: */
-    UIGMachinePreview *m_pPreview;
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskGeneral(machine()); }
 };
 
 
-/* Thread 'System': */
-class UIGDetailsUpdateThreadSystem : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'System'. */
+class UIGDetailsUpdateTaskSystem : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadSystem(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskSystem(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'System': */
+/** UIGDetailsElementInterface extension for the details-element type 'System'. */
 class UIGDetailsElementSystem : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementSystem(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementSystem(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_System, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskSystem(machine()); }
 };
 
 
-/* Thread 'Display': */
-class UIGDetailsUpdateThreadDisplay : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'Display'. */
+class UIGDetailsUpdateTaskDisplay : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadDisplay(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskDisplay(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'Display': */
+/** UIGDetailsElementInterface extension for the details-element type 'Display'. */
 class UIGDetailsElementDisplay : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementDisplay(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementDisplay(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_Display, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskDisplay(machine()); }
 };
 
 
-/* Thread 'Storage': */
-class UIGDetailsUpdateThreadStorage : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'Storage'. */
+class UIGDetailsUpdateTaskStorage : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadStorage(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskStorage(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'Storage': */
+/** UIGDetailsElementInterface extension for the details-element type 'Storage'. */
 class UIGDetailsElementStorage : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementStorage(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementStorage(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_Storage, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskStorage(machine()); }
 };
 
 
-/* Thread 'Audio': */
-class UIGDetailsUpdateThreadAudio : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'Audio'. */
+class UIGDetailsUpdateTaskAudio : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadAudio(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskAudio(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'Audio': */
+/** UIGDetailsElementInterface extension for the details-element type 'Audio'. */
 class UIGDetailsElementAudio : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementAudio(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementAudio(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_Audio, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskAudio(machine()); }
 };
 
 
-/* Thread 'Network': */
-class UIGDetailsUpdateThreadNetwork : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'Network'. */
+class UIGDetailsUpdateTaskNetwork : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadNetwork(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskNetwork(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
+
+    /** Summarizes generic properties. */
     static QString summarizeGenericProperties(const CNetworkAdapter &adapter);
 };
 
-/* Element 'Network': */
+/** UIGDetailsElementInterface extension for the details-element type 'Network'. */
 class UIGDetailsElementNetwork : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementNetwork(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementNetwork(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_Network, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskNetwork(machine()); }
 };
 
 
-/* Thread 'Serial': */
-class UIGDetailsUpdateThreadSerial : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'Serial'. */
+class UIGDetailsUpdateTaskSerial : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadSerial(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskSerial(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'Serial': */
+/** UIGDetailsElementInterface extension for the details-element type 'Serial'. */
 class UIGDetailsElementSerial : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementSerial(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementSerial(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_Serial, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskSerial(machine()); }
 };
 
 
 #ifdef VBOX_WITH_PARALLEL_PORTS
-/* Thread 'Parallel': */
-class UIGDetailsUpdateThreadParallel : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'Parallel'. */
+class UIGDetailsUpdateTaskParallel : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadParallel(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskParallel(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'Parallel': */
+/** UIGDetailsElementInterface extension for the details-element type 'Parallel'. */
 class UIGDetailsElementParallel : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementParallel(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementParallel(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_Parallel, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskParallel(machine()); }
 };
 #endif /* VBOX_WITH_PARALLEL_PORTS */
 
 
-/* Thread 'USB': */
-class UIGDetailsUpdateThreadUSB : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'USB'. */
+class UIGDetailsUpdateTaskUSB : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadUSB(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskUSB(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'USB': */
+/** UIGDetailsElementInterface extension for the details-element type 'USB'. */
 class UIGDetailsElementUSB : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementUSB(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementUSB(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_USB, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskUSB(machine()); }
 };
 
 
-/* Thread 'SF': */
-class UIGDetailsUpdateThreadSF : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'SF'. */
+class UIGDetailsUpdateTaskSF : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadSF(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskSF(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'SF': */
+/** UIGDetailsElementInterface extension for the details-element type 'SF'. */
 class UIGDetailsElementSF : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementSF(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementSF(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_SF, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskSF(machine()); }
 };
 
 
-/* Thread 'UI': */
-class UIGDetailsUpdateThreadUI : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'UI'. */
+class UIGDetailsUpdateTaskUI : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadUI(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskUI(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'UI': */
+/** UIGDetailsElementInterface extension for the details-element type 'UI'. */
 class UIGDetailsElementUI : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementUI(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementUI(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_UI, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskUI(machine()); }
 };
 
 
-/* Thread 'Description': */
-class UIGDetailsUpdateThreadDescription : public UIGDetailsUpdateThread
+/** UITask extension used as update task for the details-element type 'Description'. */
+class UIGDetailsUpdateTaskDescription : public UIGDetailsUpdateTask
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsUpdateThreadDescription(const CMachine &machine);
+    /** Constructs update task passing @a machine to the base-class. */
+    UIGDetailsUpdateTaskDescription(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
 
-    /* Helpers: Prepare stuff: */
+    /** Contains update task body. */
     void run();
 };
 
-/* Element 'Description': */
+/** UIGDetailsElementInterface extension for the details-element type 'Description'. */
 class UIGDetailsElementDescription : public UIGDetailsElementInterface
 {
     Q_OBJECT;
 
 public:
 
-    /* Constructor: */
-    UIGDetailsElementDescription(UIGDetailsSet *pParent, bool fOpened);
+    /** Constructs details-element object for passed @a pParent set.
+      * @param fOpened brings whether the details-element should be visually opened. */
+    UIGDetailsElementDescription(UIGDetailsSet *pParent, bool fOpened)
+        : UIGDetailsElementInterface(pParent, DetailsElementType_Description, fOpened) {}
 
 private:
 
-    /* Helper: Translate stuff: */
-    void retranslateUi();
-
-    /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread();
+    /** Creates update task for this element. */
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskDescription(machine()); }
 };
 
-#endif /* __UIGDetailsElements_h__ */
+#endif /* !___UIGDetailsElements_h___ */
 
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.cpp b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.cpp
index b55a625..6ea778b 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.cpp
@@ -35,10 +35,12 @@ ConfigurationAccessLevel UISettingsDefs::configurationAccessLevel(KSessionState
     {
         case KMachineState_PoweredOff:
         case KMachineState_Teleported:
-        case KMachineState_Aborted:    return sessionState == KSessionState_Unlocked ? ConfigurationAccessLevel_Full : ConfigurationAccessLevel_Null;
-        case KMachineState_Saved:      return ConfigurationAccessLevel_Saved;
+        case KMachineState_Aborted:    return sessionState == KSessionState_Unlocked ?
+                                              ConfigurationAccessLevel_Full :
+                                              ConfigurationAccessLevel_Partial_PoweredOff;
+        case KMachineState_Saved:      return ConfigurationAccessLevel_Partial_Saved;
         case KMachineState_Running:
-        case KMachineState_Paused:     return ConfigurationAccessLevel_Runtime;
+        case KMachineState_Paused:     return ConfigurationAccessLevel_Partial_Running;
         default: break;
     }
     /* Null by default: */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h
index cf6027d..187a423 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h
@@ -25,16 +25,22 @@
 /* COM includes: */
 #include "COMEnums.h"
 
-/** Settings configuration namespace: */
+/** Settings configuration namespace. */
 namespace UISettingsDefs
 {
-    /** Configuration access levels: */
+    /** Configuration access levels. */
     enum ConfigurationAccessLevel
     {
+        /** Configuration is not accessible. */
         ConfigurationAccessLevel_Null,
-        ConfigurationAccessLevel_Saved,
-        ConfigurationAccessLevel_Runtime,
-        ConfigurationAccessLevel_Full
+        /** Configuration is accessible fully. */
+        ConfigurationAccessLevel_Full,
+        /** Configuration is accessible partially, machine is in @a powered_off state. */
+        ConfigurationAccessLevel_Partial_PoweredOff,
+        /** Configuration is accessible partially, machine is in @a saved state. */
+        ConfigurationAccessLevel_Partial_Saved,
+        /** Configuration is accessible partially, machine is in @a running state. */
+        ConfigurationAccessLevel_Partial_Running,
     };
 
     /** Determines configuration access level for passed @a sessionState and @a machineState. */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h
index f79c420..9e27b91 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h
@@ -124,9 +124,10 @@ public:
     ConfigurationAccessLevel configurationAccessLevel() const { return m_configurationAccessLevel; }
     virtual void setConfigurationAccessLevel(ConfigurationAccessLevel newConfigurationAccessLevel) { m_configurationAccessLevel = newConfigurationAccessLevel; polishPage(); }
     bool isMachineOffline() const { return configurationAccessLevel() == ConfigurationAccessLevel_Full; }
-    bool isMachineSaved() const { return configurationAccessLevel() == ConfigurationAccessLevel_Saved; }
-    bool isMachineOnline() const { return configurationAccessLevel() == ConfigurationAccessLevel_Runtime; }
-    bool isMachineInValidMode() const { return isMachineOffline() || isMachineSaved() || isMachineOnline(); }
+    bool isMachinePoweredOff() const { return configurationAccessLevel() == ConfigurationAccessLevel_Partial_PoweredOff; }
+    bool isMachineSaved() const { return configurationAccessLevel() == ConfigurationAccessLevel_Partial_Saved; }
+    bool isMachineOnline() const { return configurationAccessLevel() == ConfigurationAccessLevel_Partial_Running; }
+    bool isMachineInValidMode() const { return isMachineOffline() || isMachinePoweredOff() || isMachineSaved() || isMachineOnline(); }
 
     /* Page changed: */
     virtual bool changed() const = 0;
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp
index ed26749..69953a0 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp
@@ -364,7 +364,7 @@ void UIMachineSettingsNetwork::polishTab()
                                         attachmentType() == KNetworkAttachmentType_NAT);
 
     /* Postprocessing: */
-    if ((m_pParent->isMachineSaved() || m_pParent->isMachineOnline()) && !m_pAdvancedArrow->isExpanded())
+    if ((m_pParent->isMachinePoweredOff() || m_pParent->isMachineSaved() || m_pParent->isMachineOnline()) && !m_pAdvancedArrow->isExpanded())
         m_pAdvancedArrow->animateClick();
     sltHandleAdvancedButtonStateChange();
 }
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
index 7766d4d..71a8829 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
@@ -1215,7 +1215,7 @@ QVariant StorageModel::data (const QModelIndex &aIndex, int aRole) const
                         {
                             case ConfigurationAccessLevel_Full:
                                 return true;
-                            case ConfigurationAccessLevel_Runtime:
+                            case ConfigurationAccessLevel_Partial_Running:
                             {
                                 switch (ctr->ctrBusType())
                                 {
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_current.py b/src/VBox/GuestHost/OpenGL/packer/pack_current.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py b/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/packer/packer.py b/src/VBox/GuestHost/OpenGL/packer/packer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/convert.py b/src/VBox/GuestHost/OpenGL/state_tracker/convert.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/dump_gen.py b/src/VBox/GuestHost/OpenGL/state_tracker/dump_gen.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_get.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_get.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostDrivers/Support/Makefile.kmk b/src/VBox/HostDrivers/Support/Makefile.kmk
index 50f9f41..9faf1d1 100644
--- a/src/VBox/HostDrivers/Support/Makefile.kmk
+++ b/src/VBox/HostDrivers/Support/Makefile.kmk
@@ -458,6 +458,12 @@ $$(SUPR0_0_OUTDIR)/SUPR0.def: \
 		-f $(dir $<)/SUPR0-def-$(VBOX_LDR_FMT).sed \
 		--output $@ \
 		$<
+ # Experiment: Let's see how blunt the ones messing our NULL_THUNK_DATA entries on W10 are.
+ ifeq ($(KBUILD_TARGET),win)
+  ifdef KLIBTWEAKER_EXT
+   SUPR0_POST_CMDS = $(KLIBTWEAKER_EXT) --clear-timestamps --fill-null_thunk_data $(out)
+  endif
+ endif
 endif
 
 
diff --git a/src/VBox/HostDrivers/Support/SUPDrv.cpp b/src/VBox/HostDrivers/Support/SUPDrv.cpp
index 944dee0..371f0b4 100644
--- a/src/VBox/HostDrivers/Support/SUPDrv.cpp
+++ b/src/VBox/HostDrivers/Support/SUPDrv.cpp
@@ -1690,7 +1690,7 @@ static int supdrvIOCtlInnerUnrestricted(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt,
         {
             /* validate */
             PSUPLDRLOAD pReq = (PSUPLDRLOAD)pReqHdr;
-            REQ_CHECK_EXPR(Name, pReq->Hdr.cbIn >= sizeof(*pReq));
+            REQ_CHECK_EXPR(Name, pReq->Hdr.cbIn >= SUP_IOCTL_LDR_LOAD_SIZE_IN(32));
             REQ_CHECK_SIZES_EX(SUP_IOCTL_LDR_LOAD, SUP_IOCTL_LDR_LOAD_SIZE_IN(pReq->u.In.cbImageWithTabs), SUP_IOCTL_LDR_LOAD_SIZE_OUT);
             REQ_CHECK_EXPR(SUP_IOCTL_LDR_LOAD, pReq->u.In.cSymbols <= 16384);
             REQ_CHECK_EXPR_FMT(     !pReq->u.In.cSymbols
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
index 0ef1c29..09792dd 100644
--- a/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
@@ -983,7 +983,7 @@ extern "C" uint32_t g_uNtVerCombined;
 
 DECLHIDDEN(void) supR3HardenedOpenLog(int *pcArgs, char **papszArgs)
 {
-    static const char s_szLogOption[] = "--sup-startup-log=";
+    static const char s_szLogOption[] = "--sup-hardening-log=";
 
     /*
      * Scan the argument vector.
diff --git a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
index 9d172b7..2dc87f7 100644
--- a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
+++ b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
@@ -1621,11 +1621,9 @@ bool org_virtualbox_SupDrvClient::initWithTask(task_t OwningTask, void *pvSecuri
 
     if (u32Type != SUP_DARWIN_IOSERVICE_COOKIE)
     {
-        LogRel(("org_virtualbox_SupDrvClient::initWithTask: Bad cookie %#x (%s)\n", u32Type, pszProcName));
+        LogRelMax(10,("org_virtualbox_SupDrvClient::initWithTask: Bad cookie %#x (%s)\n", u32Type, pszProcName));
         return false;
     }
-    else
-        LogRel(("org_virtualbox_SupDrvClient::initWithTask: Expected cookie %#x (%s)\n", u32Type, pszProcName));
 
     if (IOUserClient::initWithTask(OwningTask, pvSecurityId , u32Type))
     {
diff --git a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
index 78fb72a..36fb4d7 100644
--- a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
+++ b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
@@ -1,4 +1,4 @@
-/* $Rev: 102121 $ */
+/* $Rev: 102792 $ */
 /** @file
  * VBoxDrv - The VirtualBox Support Driver - Linux specifics.
  */
@@ -471,9 +471,7 @@ static int __init VBoxDrvLinuxInit(void)
  */
 static void __exit VBoxDrvLinuxUnload(void)
 {
-    int                 rc;
     Log(("VBoxDrvLinuxUnload\n"));
-    NOREF(rc);
 
 #ifdef VBOX_WITH_SUSPEND_NOTIFICATION
     platform_device_unregister(&gPlatformDevice);
@@ -485,16 +483,8 @@ static void __exit VBoxDrvLinuxUnload(void)
      * opened, at least we'll blindly assume that here.
      */
 #ifdef CONFIG_VBOXDRV_AS_MISC
-    rc = misc_deregister(&gMiscDeviceUsr);
-    if (rc < 0)
-    {
-        Log(("misc_deregister failed with rc=%#x on vboxdrvu\n", rc));
-    }
-    rc = misc_deregister(&gMiscDeviceSys);
-    if (rc < 0)
-    {
-        Log(("misc_deregister failed with rc=%#x on vboxdrv\n", rc));
-    }
+    misc_deregister(&gMiscDeviceUsr);
+    misc_deregister(&gMiscDeviceSys);
 #else  /* !CONFIG_VBOXDRV_AS_MISC */
 # ifdef CONFIG_DEVFS_FS
     /*
diff --git a/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c b/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c
index ca39ff6..5189a76 100644
--- a/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c
+++ b/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c
@@ -427,7 +427,6 @@ static int __init VBoxNetAdpLinuxInit(void)
  */
 static void __exit VBoxNetAdpLinuxUnload(void)
 {
-    int rc;
     Log(("VBoxNetAdpLinuxUnload\n"));
 
     /*
@@ -436,11 +435,7 @@ static void __exit VBoxNetAdpLinuxUnload(void)
 
     vboxNetAdpShutdown();
     /* Remove control device */
-    rc = misc_deregister(&g_CtlDev);
-    if (rc < 0)
-    {
-        printk(KERN_ERR "misc_deregister failed with rc=%x\n", rc);
-    }
+    misc_deregister(&g_CtlDev);
 
     RTR0Term();
 
diff --git a/src/VBox/HostDrivers/VBoxNetAdp/win/VBoxNetAdp-win.cpp b/src/VBox/HostDrivers/VBoxNetAdp/win/VBoxNetAdp-win.cpp
index 22d2dac..9bfa0e4 100644
--- a/src/VBox/HostDrivers/VBoxNetAdp/win/VBoxNetAdp-win.cpp
+++ b/src/VBox/HostDrivers/VBoxNetAdp/win/VBoxNetAdp-win.cpp
@@ -325,6 +325,8 @@ DECLHIDDEN(VOID) vboxNetAdpWinHaltEx(IN NDIS_HANDLE MiniportAdapterContext,
     PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
     LogFlow(("==>vboxNetAdpWinHaltEx\n"));
     // TODO: Stop something?
+    if (pAdapter)
+        vboxNetAdpWinFreeAdapter(pAdapter);
     LogFlow(("<==vboxNetAdpWinHaltEx\n"));
 }
 
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c b/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
index 7b8ed3c..f6b4901 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
+++ b/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
@@ -328,7 +328,7 @@ int _fini(void)
     rc = vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltSolarisGlobals);
     if (RT_FAILURE(rc))
     {
-        LogRel((DEVICE_NAME ":_fini - busy!\n"));
+        LogRel((DEVICE_NAME ":_fini - busy! rc=%d\n", rc));
         return EBUSY;
     }
 
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetLwf-win.cpp b/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetLwf-win.cpp
index fb63e82..5baf345 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetLwf-win.cpp
+++ b/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetLwf-win.cpp
@@ -185,6 +185,8 @@ typedef struct _VBOXNETLWF_MODULE {
     NDIS_EVENT EventSendComplete;
     /** Counter for pending sends (both to wire and host) */
     int32_t cPendingBuffers;
+    /** Work Item to deliver offloading indications at passive IRQL */
+    NDIS_HANDLE hWorkItem;
 #endif /* !VBOXNETLWF_SYNC_SEND */
     /** Name of underlying adapter */
     ANSI_STRING strMiniportName;
@@ -758,6 +760,11 @@ static void vboxNetLwfWinDevDestroy(PVBOXNETLWFGLOBALS pGlobals)
     pGlobals->pDevObj = NULL;
 }
 
+static void vboxNetLwfWinUpdateSavedOffloadConfig(PVBOXNETLWF_MODULE pModuleCtx, PNDIS_OFFLOAD pOffload)
+{
+    pModuleCtx->SavedOffloadConfig = *pOffload;
+    pModuleCtx->fOffloadConfigValid = true;
+}
 
 static NDIS_STATUS vboxNetLwfWinAttach(IN NDIS_HANDLE hFilter, IN NDIS_HANDLE hDriverCtx,
                                        IN PNDIS_FILTER_ATTACH_PARAMETERS pParameters)
@@ -777,6 +784,15 @@ static NDIS_STATUS vboxNetLwfWinAttach(IN NDIS_HANDLE hFilter, IN NDIS_HANDLE hD
 
     NdisZeroMemory(pModuleCtx, sizeof(VBOXNETLWF_MODULE));
 
+    pModuleCtx->hWorkItem = NdisAllocateIoWorkItem(g_VBoxNetLwfGlobals.hFilterDriver);
+    if (!pModuleCtx->hWorkItem)
+    {
+        Log(("ERROR! vboxNetLwfWinAttach: Failed to allocate work item for %ls\n",
+             pParameters->BaseMiniportName));
+        NdisFreeMemory(pModuleCtx, 0, 0);
+        return NDIS_STATUS_RESOURCES;
+    }
+
     /* We use the miniport name to associate this filter module with the netflt instance */
     NTSTATUS rc = RtlUnicodeStringToAnsiString(&pModuleCtx->strMiniportName,
                                                pParameters->BaseMiniportName,
@@ -785,6 +801,7 @@ static NDIS_STATUS vboxNetLwfWinAttach(IN NDIS_HANDLE hFilter, IN NDIS_HANDLE hD
     {
         Log(("ERROR! vboxNetLwfWinAttach: RtlUnicodeStringToAnsiString(%ls) failed with 0x%x\n",
              pParameters->BaseMiniportName, rc));
+        NdisFreeIoWorkItem(pModuleCtx->hWorkItem);
         NdisFreeMemory(pModuleCtx, 0, 0);
         return NDIS_STATUS_FAILURE;
     }
@@ -794,10 +811,7 @@ static NDIS_STATUS vboxNetLwfWinAttach(IN NDIS_HANDLE hFilter, IN NDIS_HANDLE hD
     Assert(pParameters->MacAddressLength == sizeof(RTMAC));
     NdisMoveMemory(&pModuleCtx->MacAddr, pParameters->CurrentMacAddress, RT_MIN(sizeof(RTMAC), pParameters->MacAddressLength));
     if (pParameters->DefaultOffloadConfiguration)
-    {
-        pModuleCtx->SavedOffloadConfig = *pParameters->DefaultOffloadConfiguration;
-        pModuleCtx->fOffloadConfigValid = true;
-    }
+        vboxNetLwfWinUpdateSavedOffloadConfig(pModuleCtx, pParameters->DefaultOffloadConfiguration);
 
     pModuleCtx->pGlobals  = pGlobals;
     pModuleCtx->hFilter   = hFilter;
@@ -830,6 +844,7 @@ static NDIS_STATUS vboxNetLwfWinAttach(IN NDIS_HANDLE hFilter, IN NDIS_HANDLE hD
     {
         Log(("ERROR! vboxNetLwfWinAttach: NdisAllocateNetBufferListPool failed\n"));
         RtlFreeAnsiString(&pModuleCtx->strMiniportName);
+        NdisFreeIoWorkItem(pModuleCtx->hWorkItem);
         NdisFreeMemory(pModuleCtx, 0, 0);
         return NDIS_STATUS_RESOURCES;
     }
@@ -848,6 +863,7 @@ static NDIS_STATUS vboxNetLwfWinAttach(IN NDIS_HANDLE hFilter, IN NDIS_HANDLE hD
         NdisFreeNetBufferListPool(pModuleCtx->hPool);
         Log4(("vboxNetLwfWinAttach: freed NBL+NB pool 0x%p\n", pModuleCtx->hPool));
         RtlFreeAnsiString(&pModuleCtx->strMiniportName);
+        NdisFreeIoWorkItem(pModuleCtx->hWorkItem);
         NdisFreeMemory(pModuleCtx, 0, 0);
         return NDIS_STATUS_RESOURCES;
     }
@@ -901,6 +917,7 @@ static VOID vboxNetLwfWinDetach(IN NDIS_HANDLE hModuleCtx)
         Log4(("vboxNetLwfWinDetach: freed NBL+NB pool 0x%p\n", pModuleCtx->hPool));
     }
     RtlFreeAnsiString(&pModuleCtx->strMiniportName);
+    NdisFreeIoWorkItem(pModuleCtx->hWorkItem);
     NdisFreeMemory(hModuleCtx, 0, 0);
     Log4(("vboxNetLwfWinDetach: freed module context 0x%p\n", pModuleCtx));
     LogFlow(("<==vboxNetLwfWinDetach\n"));
@@ -946,55 +963,6 @@ static NDIS_STATUS vboxNetLwfWinRestart(IN NDIS_HANDLE hModuleCtx, IN PNDIS_FILT
     LogFlow(("==>vboxNetLwfWinRestart: module=%p\n", hModuleCtx));
     PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)hModuleCtx;
     vboxNetLwfWinChangeState(pModuleCtx, LwfState_Restarting, LwfState_Paused);
-#if 1
-    if (pModuleCtx->fOffloadConfigValid)
-    {
-        if (ASMAtomicReadBool(&pModuleCtx->fActive))
-        {
-            /* Disable offloading temporarily by indicating offload config change. */
-            /** @todo Be sure to revise this when implementing offloading support! */
-            NDIS_OFFLOAD OffloadConfig;
-            OffloadConfig = pModuleCtx->SavedOffloadConfig;
-            OffloadConfig.Checksum.IPv4Transmit.Encapsulation               = NDIS_ENCAPSULATION_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Transmit.IpOptionsSupported          = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Transmit.TcpOptionsSupported         = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Transmit.TcpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Transmit.UdpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Transmit.IpChecksum                  = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Receive.Encapsulation                = NDIS_ENCAPSULATION_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Receive.IpOptionsSupported           = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Receive.TcpOptionsSupported          = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Receive.TcpChecksum                  = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Receive.UdpChecksum                  = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv4Receive.IpChecksum                   = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Transmit.Encapsulation               = NDIS_ENCAPSULATION_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Transmit.IpExtensionHeadersSupported = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Transmit.TcpOptionsSupported         = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Transmit.TcpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Transmit.UdpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Receive.Encapsulation                = NDIS_ENCAPSULATION_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Receive.IpExtensionHeadersSupported  = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Receive.TcpOptionsSupported          = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Receive.TcpChecksum                  = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.Checksum.IPv6Receive.UdpChecksum                  = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.LsoV1.IPv4.Encapsulation                          = NDIS_ENCAPSULATION_NOT_SUPPORTED;
-            OffloadConfig.LsoV1.IPv4.TcpOptions                             = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.LsoV1.IPv4.IpOptions                              = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.LsoV2.IPv4.Encapsulation                          = NDIS_ENCAPSULATION_NOT_SUPPORTED;
-            OffloadConfig.LsoV2.IPv6.Encapsulation                          = NDIS_ENCAPSULATION_NOT_SUPPORTED;
-            OffloadConfig.LsoV2.IPv6.IpExtensionHeadersSupported            = NDIS_OFFLOAD_NOT_SUPPORTED;
-            OffloadConfig.LsoV2.IPv6.TcpOptionsSupported                    = NDIS_OFFLOAD_NOT_SUPPORTED;
-            vboxNetLwfWinIndicateOffload(pModuleCtx, &OffloadConfig);
-            Log(("vboxNetLwfWinRestart: set offloading off\n"));
-        }
-        else
-        {
-            /* The filter is inactive -- restore offloading configuration. */
-            vboxNetLwfWinIndicateOffload(pModuleCtx, &pModuleCtx->SavedOffloadConfig);
-            Log(("vboxNetLwfWinRestart: restored offloading config\n"));
-        }
-    }
-#endif
 
     vboxNetLwfWinChangeState(pModuleCtx, LwfState_Running, LwfState_Restarting);
     NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
@@ -1340,6 +1308,28 @@ static PINTNETSG vboxNetLwfWinNBtoSG(PVBOXNETLWF_MODULE pModule, PNET_BUFFER pNe
     return pSG;
 }
 
+static void vboxNetLwfWinDisableOffloading(PNDIS_OFFLOAD pOffloadConfig)
+{
+    pOffloadConfig->Checksum.IPv4Transmit.Encapsulation               = NDIS_ENCAPSULATION_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv4Transmit.IpOptionsSupported          = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv4Transmit.TcpOptionsSupported         = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv4Transmit.TcpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv4Transmit.UdpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv4Transmit.IpChecksum                  = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv6Transmit.Encapsulation               = NDIS_ENCAPSULATION_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv6Transmit.IpExtensionHeadersSupported = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv6Transmit.TcpOptionsSupported         = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv6Transmit.TcpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->Checksum.IPv6Transmit.UdpChecksum                 = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->LsoV1.IPv4.Encapsulation                          = NDIS_ENCAPSULATION_NOT_SUPPORTED;
+    pOffloadConfig->LsoV1.IPv4.TcpOptions                             = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->LsoV1.IPv4.IpOptions                              = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->LsoV2.IPv4.Encapsulation                          = NDIS_ENCAPSULATION_NOT_SUPPORTED;
+    pOffloadConfig->LsoV2.IPv6.Encapsulation                          = NDIS_ENCAPSULATION_NOT_SUPPORTED;
+    pOffloadConfig->LsoV2.IPv6.IpExtensionHeadersSupported            = NDIS_OFFLOAD_NOT_SUPPORTED;
+    pOffloadConfig->LsoV2.IPv6.TcpOptionsSupported                    = NDIS_OFFLOAD_NOT_SUPPORTED;
+}
+
 VOID vboxNetLwfWinStatus(IN NDIS_HANDLE hModuleCtx, IN PNDIS_STATUS_INDICATION pIndication)
 {
     LogFlow(("==>vboxNetLwfWinStatus: module=%p\n", hModuleCtx));
@@ -1356,6 +1346,11 @@ VOID vboxNetLwfWinStatus(IN NDIS_HANDLE hModuleCtx, IN PNDIS_STATUS_INDICATION p
         case NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG:
             Log5(("vboxNetLwfWinStatus: offloading currently set to:\n"));
             vboxNetLwfWinDumpOffloadSettings((PNDIS_OFFLOAD)pIndication->StatusBuffer);
+            vboxNetLwfWinUpdateSavedOffloadConfig(pModuleCtx, (PNDIS_OFFLOAD)pIndication->StatusBuffer);
+            if (ASMAtomicReadBool(&pModuleCtx->fActive))
+                vboxNetLwfWinDisableOffloading((PNDIS_OFFLOAD)pIndication->StatusBuffer);
+            Log5(("vboxNetLwfWinStatus: reporting offloading up as:\n"));
+            vboxNetLwfWinDumpOffloadSettings((PNDIS_OFFLOAD)pIndication->StatusBuffer);
             break;
     }
     NdisFIndicateStatus(pModuleCtx->hFilter, pIndication);
@@ -2111,6 +2106,49 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, ui
     return rc;
 }
 
+
+NDIS_IO_WORKITEM_FUNCTION vboxNetLwfWinToggleOffloading;
+
+VOID vboxNetLwfWinToggleOffloading(PVOID WorkItemContext, NDIS_HANDLE NdisIoWorkItemHandle)
+{
+    /* WARNING! Call this with IRQL=Passive! */
+    PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)WorkItemContext;
+
+    if (ASMAtomicReadBool(&pModuleCtx->fActive))
+    {
+        /* Disable offloading temporarily by indicating offload config change. */
+        /** @todo Be sure to revise this when implementing offloading support! */
+        NDIS_OFFLOAD OffloadConfig;
+        if (pModuleCtx->fOffloadConfigValid)
+        {
+            OffloadConfig = pModuleCtx->SavedOffloadConfig;
+            vboxNetLwfWinDisableOffloading(&OffloadConfig);
+        }
+        else
+        {
+            DbgPrint("VBoxNetLwf: no saved offload config to modify for %Z\n", pModuleCtx->strMiniportName);
+            NdisZeroMemory(&OffloadConfig, sizeof(OffloadConfig));
+            OffloadConfig.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
+            OffloadConfig.Header.Revision = NDIS_OFFLOAD_REVISION_1;
+            OffloadConfig.Header.Size = NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1;
+        }
+        vboxNetLwfWinIndicateOffload(pModuleCtx, &OffloadConfig);
+        Log(("vboxNetLwfWinToggleOffloading: set offloading off\n"));
+    }
+    else
+    {
+        /* The filter is inactive -- restore offloading configuration. */
+        if (pModuleCtx->fOffloadConfigValid)
+        {
+            vboxNetLwfWinIndicateOffload(pModuleCtx, &pModuleCtx->SavedOffloadConfig);
+            Log(("vboxNetLwfWinToggleOffloading: restored offloading config\n"));
+        }
+        else
+            DbgPrint("VBoxNetLwf: no saved offload config to restore for %Z\n", pModuleCtx->strMiniportName);
+    }
+}
+
+
 void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
 {
     PVBOXNETLWF_MODULE pModuleCtx = (PVBOXNETLWF_MODULE)pThis->u.s.WinIf.hModuleCtx;
@@ -2125,6 +2163,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
     bool fOldActive = ASMAtomicXchgBool(&pModuleCtx->fActive, fActive);
     if (fOldActive != fActive)
     {
+        NdisQueueIoWorkItem(pModuleCtx->hWorkItem, vboxNetLwfWinToggleOffloading, pModuleCtx);
         Status = vboxNetLwfWinSetPacketFilter(pModuleCtx, fActive);
         LogFlow(("<==vboxNetFltPortOsSetActive: vboxNetLwfWinSetPacketFilter() returned 0x%x\n", Status));
     }
diff --git a/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp b/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp
index 878fba4..614c365 100644
--- a/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/darwin/VBoxUSB.cpp
@@ -193,6 +193,8 @@ public:
 
     static void  scheduleReleaseByOwner(RTPROCESS Owner);
 private:
+    /** Padding to guard against parent class expanding (see class remarks). */
+    uint8_t m_abPadding[256];
     /** The interface we're driving (aka. the provider). */
     IOUSBDevice *m_pDevice;
     /** The owner process, meaning the VBoxSVC process. */
@@ -1089,7 +1091,8 @@ org_virtualbox_VBoxUSBDevice::probe(IOService *pProvider, SInt32 *pi32Score)
      * It matched. Save the owner in the provider registry (hope that works).
      */
     IOService *pRet = IOUSBUserClientInit::probe(pProvider, pi32Score);
-    Assert(pRet == this);
+    /*AssertMsg(pRet == this, ("pRet=%p this=%p *pi32Score=%d \n", pRet, this, pi32Score ? *pi32Score : 0)); - call always returns NULL on 10.11+ */
+    pRet = this;
     m_Owner = Owner;
     m_uId = uId;
     Log(("%p: m_Owner=%d m_uId=%d\n", this, (int)m_Owner, (int)m_uId));
diff --git a/src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp b/src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp
index 8e48103..4054168 100644
--- a/src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp
+++ b/src/VBox/HostDrivers/win/cfg/VBoxDrvCfg.cpp
@@ -637,7 +637,7 @@ static bool vboxDrvCfgInfEnumerationCallback(LPCWSTR lpszFileName, PVOID pCtxt)
     PINFENUM_CONTEXT pContext = (PINFENUM_CONTEXT)pCtxt;
     DWORD dwErr;
     NonStandardLogRelCrap((__FUNCTION__": lpszFileName (%S)\n", lpszFileName));
-    NonStandardLogRelCrap((__FUNCTION__ ": pContext->InfInfo.lpszClassName = (%S)", pContext->InfInfo.lpszClassName));
+    NonStandardLogRelCrap((__FUNCTION__ ": pContext->InfInfo.lpszClassName = (%S)\n", pContext->InfInfo.lpszClassName));
     HINF hInf = SetupOpenInfFileW(lpszFileName, pContext->InfInfo.lpszClassName, INF_STYLE_WIN4, NULL /*__in PUINT ErrorLine */);
     if (hInf == INVALID_HANDLE_VALUE)
     {
@@ -649,15 +649,15 @@ static bool vboxDrvCfgInfEnumerationCallback(LPCWSTR lpszFileName, PVOID pCtxt)
         }
         else
         {
-            NonStandardLogCrap((__FUNCTION__ ": dwErr == ERROR_CLASS_MISMATCH"));
+            NonStandardLogCrap((__FUNCTION__ ": dwErr == ERROR_CLASS_MISMATCH\n"));
         }
         return true;
     }
 
     LPWSTR lpszPnPId;
     HRESULT hr = vboxDrvCfgInfQueryFirstPnPId(hInf, &lpszPnPId);
-    NonStandardLogRelCrap((__FUNCTION__ ": vboxDrvCfgInfQueryFirstPnPId returned lpszPnPId = (%S)", lpszPnPId));
-    NonStandardLogRelCrap((__FUNCTION__ ": pContext->InfInfo.lpszPnPId = (%S)", pContext->InfInfo.lpszPnPId));
+    NonStandardLogRelCrap((__FUNCTION__ ": vboxDrvCfgInfQueryFirstPnPId returned lpszPnPId = (%S)\n", lpszPnPId));
+    NonStandardLogRelCrap((__FUNCTION__ ": pContext->InfInfo.lpszPnPId = (%S)\n", pContext->InfInfo.lpszPnPId));
     if (hr == S_OK)
     {
         if (!wcsicmp(pContext->InfInfo.lpszPnPId, lpszPnPId))
diff --git a/src/VBox/HostServices/DragAndDrop/service.cpp b/src/VBox/HostServices/DragAndDrop/service.cpp
index 5adeccb..1466a7f 100644
--- a/src/VBox/HostServices/DragAndDrop/service.cpp
+++ b/src/VBox/HostServices/DragAndDrop/service.cpp
@@ -278,9 +278,19 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
 
         /* Note: New since protocol version 2. */
         case DragAndDropSvc::GUEST_DND_CONNECT:
-            /* Fall through is intentional. */
+        {
+            /*
+             * Never block the initial connect call, as the clients do this when
+             * initializing and might get stuck if drag and drop is set to "disabled" at
+             * that time.
+             */
+            rc = VINF_SUCCESS;
+            break;
+        }
         case DragAndDropSvc::GUEST_DND_HG_ACK_OP:
+            /* Fall through is intentional. */
         case DragAndDropSvc::GUEST_DND_HG_REQ_DATA:
+            /* Fall through is intentional. */
         case DragAndDropSvc::GUEST_DND_HG_EVT_PROGRESS:
         {
             if (   modeGet() == VBOX_DRAG_AND_DROP_MODE_BIDIRECTIONAL
diff --git a/src/VBox/HostServices/GuestProperties/service.cpp b/src/VBox/HostServices/GuestProperties/service.cpp
index 80fc9b2..4d57abb 100644
--- a/src/VBox/HostServices/GuestProperties/service.cpp
+++ b/src/VBox/HostServices/GuestProperties/service.cpp
@@ -58,6 +58,9 @@
 #include <string>
 #include <list>
 
+/** @todo Delete the old !ASYNC_HOST_NOTIFY code and remove this define. */
+#define ASYNC_HOST_NOTIFY
+
 namespace guestProp {
 
 /**
@@ -286,6 +289,10 @@ public:
         , mpvHostData(NULL)
         , mPrevTimestamp(0)
         , mcTimestampAdjustments(0)
+#ifdef ASYNC_HOST_NOTIFY
+        , mhThreadNotifyHost(NIL_RTTHREAD)
+        , mhReqQNotifyHost(NIL_RTREQQUEUE)
+#endif
     { }
 
     /**
@@ -365,6 +372,10 @@ public:
         return VINF_SUCCESS;
     }
 
+#ifdef ASYNC_HOST_NOTIFY
+    int initialize();
+#endif
+
 private:
     static DECLCALLBACK(int) reqThreadFn(RTTHREAD ThreadSelf, void *pvUser);
     uint64_t getCurrentTimestamp(void);
@@ -391,6 +402,14 @@ private:
     int uninit();
     void dbgInfoShow(PCDBGFINFOHLP pHlp);
     static DECLCALLBACK(void) dbgInfo(void *pvUser, PCDBGFINFOHLP pHlp, const char *pszArgs);
+
+#ifdef ASYNC_HOST_NOTIFY
+    /* Thread for handling host notifications. */
+    RTTHREAD mhThreadNotifyHost;
+    /* Queue for handling requests for notifications. */
+    RTREQQUEUE mhReqQNotifyHost;
+    static DECLCALLBACK(int) threadNotifyHost(RTTHREAD self, void *pvUser);
+#endif
 };
 
 
@@ -1207,6 +1226,18 @@ int Service::doNotifications(const char *pszProperty, uint64_t u64Timestamp)
     return rc;
 }
 
+#ifdef ASYNC_HOST_NOTIFY
+static DECLCALLBACK(void) notifyHostAsyncWorker(PFNHGCMSVCEXT pfnHostCallback,
+                                                void *pvHostData,
+                                                HOSTCALLBACKDATA *pHostCallbackData)
+{
+    pfnHostCallback(pvHostData, 0 /*u32Function*/,
+                   (void *)pHostCallbackData,
+                   sizeof(HOSTCALLBACKDATA));
+    RTMemFree(pHostCallbackData);
+}
+#endif
+
 /**
  * Notify the service owner that a property has been added/deleted/changed.
  * @returns  IPRT status value
@@ -1220,6 +1251,52 @@ int Service::notifyHost(const char *pszName, const char *pszValue,
 {
     LogFlowFunc(("pszName=%s, pszValue=%s, u64Timestamp=%llu, pszFlags=%s\n",
                  pszName, pszValue, u64Timestamp, pszFlags));
+#ifdef ASYNC_HOST_NOTIFY
+    int rc = VINF_SUCCESS;
+
+    /* Allocate buffer for the callback data and strings. */
+    size_t cbName = pszName? strlen(pszName): 0;
+    size_t cbValue = pszValue? strlen(pszValue): 0;
+    size_t cbFlags = pszFlags? strlen(pszFlags): 0;
+    size_t cbAlloc = sizeof(HOSTCALLBACKDATA) + cbName + cbValue + cbFlags + 3;
+    HOSTCALLBACKDATA *pHostCallbackData = (HOSTCALLBACKDATA *)RTMemAlloc(cbAlloc);
+    if (pHostCallbackData)
+    {
+        uint8_t *pu8 = (uint8_t *)pHostCallbackData;
+        pu8 += sizeof(HOSTCALLBACKDATA);
+
+        pHostCallbackData->u32Magic     = HOSTCALLBACKMAGIC;
+
+        pHostCallbackData->pcszName     = (const char *)pu8;
+        memcpy(pu8, pszName, cbName);
+        pu8 += cbName;
+        *pu8++ = 0;
+
+        pHostCallbackData->pcszValue    = (const char *)pu8;
+        memcpy(pu8, pszValue, cbValue);
+        pu8 += cbValue;
+        *pu8++ = 0;
+
+        pHostCallbackData->u64Timestamp = u64Timestamp;
+
+        pHostCallbackData->pcszFlags    = (const char *)pu8;
+        memcpy(pu8, pszFlags, cbFlags);
+        pu8 += cbFlags;
+        *pu8++ = 0;
+
+        rc = RTReqQueueCallEx(mhReqQNotifyHost, NULL, 0, RTREQFLAGS_VOID | RTREQFLAGS_NO_WAIT,
+                              (PFNRT)notifyHostAsyncWorker, 3,
+                              mpfnHostCallback, mpvHostData, pHostCallbackData);
+        if (RT_FAILURE(rc))
+        {
+            RTMemFree(pHostCallbackData);
+        }
+    }
+    else
+    {
+        rc = VERR_NO_MEMORY;
+    }
+#else
     HOSTCALLBACKDATA HostCallbackData;
     HostCallbackData.u32Magic     = HOSTCALLBACKMAGIC;
     HostCallbackData.pcszName     = pszName;
@@ -1229,6 +1306,7 @@ int Service::notifyHost(const char *pszName, const char *pszValue,
     int rc = mpfnHostCallback(mpvHostData, 0 /*u32Function*/,
                               (void *)(&HostCallbackData),
                               sizeof(HostCallbackData));
+#endif
     LogFlowFunc(("returning rc=%Rrc\n", rc));
     return rc;
 }
@@ -1439,8 +1517,84 @@ int Service::hostCall (uint32_t eFunction, uint32_t cParms, VBOXHGCMSVCPARM paPa
     return rc;
 }
 
+#ifdef ASYNC_HOST_NOTIFY
+/* static */
+DECLCALLBACK(int) Service::threadNotifyHost(RTTHREAD self, void *pvUser)
+{
+    Service *pThis = (Service *)pvUser;
+    int rc = VINF_SUCCESS;
+
+    LogFlowFunc(("ENTER: %p\n", pThis));
+
+    for (;;)
+    {
+        rc = RTReqQueueProcess(pThis->mhReqQNotifyHost, RT_INDEFINITE_WAIT);
+
+        AssertMsg(rc == VWRN_STATE_CHANGED,
+                  ("Left RTReqProcess and error code is not VWRN_STATE_CHANGED rc=%Rrc\n",
+                   rc));
+        if (rc == VWRN_STATE_CHANGED)
+        {
+            break;
+        }
+    }
+
+    LogFlowFunc(("LEAVE: %Rrc\n", rc));
+    return rc;
+}
+
+static DECLCALLBACK(int) wakeupNotifyHost(void)
+{
+    /* Returning a VWRN_* will cause RTReqQueueProcess return. */
+    return VWRN_STATE_CHANGED;
+}
+
+int Service::initialize()
+{
+    /* The host notification thread and queue. */
+    int rc = RTReqQueueCreate(&mhReqQNotifyHost);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTThreadCreate(&mhThreadNotifyHost,
+                            threadNotifyHost,
+                            this,
+                            0 /* default stack size */,
+                            RTTHREADTYPE_DEFAULT,
+                            0, /* no flags. */
+                            "GSTPROPNTFY");
+    }
+
+    if (RT_FAILURE(rc))
+    {
+        if (mhReqQNotifyHost != NIL_RTREQQUEUE)
+        {
+            RTReqQueueDestroy(mhReqQNotifyHost);
+            mhReqQNotifyHost = NIL_RTREQQUEUE;
+        }
+    }
+
+    return rc;
+}
+#endif
+
 int Service::uninit()
 {
+#ifdef ASYNC_HOST_NOTIFY
+    if (mhReqQNotifyHost != NIL_RTREQQUEUE)
+    {
+        /* Stop the thread */
+        PRTREQ pReq;
+        int rc = RTReqQueueCall(mhReqQNotifyHost, &pReq, 10000, (PFNRT)wakeupNotifyHost, 0);
+        if (RT_SUCCESS(rc))
+            RTReqRelease(pReq);
+
+        rc = RTReqQueueDestroy(mhReqQNotifyHost);
+        AssertRC(rc);
+        mhReqQNotifyHost = NIL_RTREQQUEUE;
+        mhThreadNotifyHost = NIL_RTTHREAD;
+    }
+#endif
+
     return VINF_SUCCESS;
 }
 
@@ -1500,6 +1654,15 @@ extern "C" DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad (VBOXHGCMSVCFNTABLE *pt
 
                 /* Service specific initialization. */
                 ptable->pvService = pService;
+
+#ifdef ASYNC_HOST_NOTIFY
+                rc = pService->initialize();
+                if (RT_FAILURE(rc))
+                {
+                    delete pService;
+                    pService = NULL;
+                }
+#endif
             }
             else
                 Assert(!pService);
diff --git a/src/VBox/HostServices/SharedFolders/vbsf.cpp b/src/VBox/HostServices/SharedFolders/vbsf.cpp
index efc5cac..034d5b5 100644
--- a/src/VBox/HostServices/SharedFolders/vbsf.cpp
+++ b/src/VBox/HostServices/SharedFolders/vbsf.cpp
@@ -114,8 +114,12 @@ static int vbsfBuildFullPath(SHFLCLIENTDATA *pClient, SHFLROOT root, PSHFLSTRING
 {
     char *pszHostPath = NULL;
     uint32_t fu32PathFlags = 0;
+    uint32_t fu32Options =   VBSF_O_PATH_CHECK_ROOT_ESCAPE
+                           | (fWildCard? VBSF_O_PATH_WILDCARD: 0)
+                           | (fPreserveLastComponent? VBSF_O_PATH_PRESERVE_LAST_COMPONENT: 0);
+
     int rc = vbsfPathGuestToHost(pClient, root, pPath, cbPath,
-                                 &pszHostPath, pcbFullPathRoot, fWildCard, fPreserveLastComponent, &fu32PathFlags);
+                                 &pszHostPath, pcbFullPathRoot, fu32Options, &fu32PathFlags);
     if (BIT_FLAG(pClient->fu32Flags, SHFL_CF_UTF8))
     {
         LogRel2(("SharedFolders: GuestToHost 0x%RX32 [%.*s]->[%s] %Rrc\n", fu32PathFlags, pPath->u16Length, &pPath->String.utf8[0], pszHostPath, rc));
@@ -1873,7 +1877,10 @@ int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SH
     AssertRCReturn(rc, rc);
 
     /* Verify that the link target can be a valid host path, i.e. does not contain invalid characters. */
-    rc = vbsfBuildFullPath(pClient, root, pOldPath, pOldPath->u16Size + SHFLSTRING_HEADER_SIZE, &pszFullOldPath, NULL);
+    uint32_t fu32PathFlags = 0;
+    uint32_t fu32Options = 0;
+    rc = vbsfPathGuestToHost(pClient, root, pOldPath, pOldPath->u16Size + SHFLSTRING_HEADER_SIZE,
+                             &pszFullOldPath, NULL, fu32Options, &fu32PathFlags);
     if (RT_FAILURE(rc))
     {
         vbsfFreeFullPath(pszFullNewPath);
diff --git a/src/VBox/HostServices/SharedFolders/vbsfpath.cpp b/src/VBox/HostServices/SharedFolders/vbsfpath.cpp
index 8855cdd..7d86a76 100644
--- a/src/VBox/HostServices/SharedFolders/vbsfpath.cpp
+++ b/src/VBox/HostServices/SharedFolders/vbsfpath.cpp
@@ -441,10 +441,6 @@ static int vbsfPathCheckRootEscape(const char *pszPath)
  * '<', '>' and '"' are allowed as possible wildcards (see ANSI_DOS_STAR, etc in ntifs.h)
  */
 static const char sachCharBlackList[] = ":/\\|";
-#elif defined(RT_OS_DARWIN)
-/* Technically only '/' is not allowed, but apparently ':' has a special meaning in Finder.
- */
-static const char sachCharBlackList[] = ":/";
 #else
 /* Something else. */
 static const char sachCharBlackList[] = "/";
@@ -498,7 +494,7 @@ static bool vbsfPathIsWildcardChar(char c)
 int vbsfPathGuestToHost(SHFLCLIENTDATA *pClient, SHFLROOT hRoot,
                         PSHFLSTRING pGuestString, uint32_t cbGuestString,
                         char **ppszHostPath, uint32_t *pcbHostPathRoot,
-                        bool fWildCard, bool fPreserveLastComponent,
+                        uint32_t fu32Options,
                         uint32_t *pfu32PathFlags)
 {
 #ifdef VBOX_STRICT
@@ -687,7 +683,10 @@ int vbsfPathGuestToHost(SHFLCLIENTDATA *pClient, SHFLROOT hRoot,
                 }
 
                 /* Check the appended path for root escapes. */
-                rc = vbsfPathCheckRootEscape(&pszFullPath[cbRootLen]);
+                if (fu32Options & VBSF_O_PATH_CHECK_ROOT_ESCAPE)
+                {
+                    rc = vbsfPathCheckRootEscape(&pszFullPath[cbRootLen]);
+                }
                 if (RT_SUCCESS(rc))
                 {
                     /*
@@ -697,6 +696,8 @@ int vbsfPathGuestToHost(SHFLCLIENTDATA *pClient, SHFLROOT hRoot,
                     if (    vbsfIsHostMappingCaseSensitive(hRoot)
                         && !vbsfIsGuestMappingCaseSensitive(hRoot))
                     {
+                        bool fWildCard = RT_BOOL(fu32Options & VBSF_O_PATH_WILDCARD);
+                        bool fPreserveLastComponent = RT_BOOL(fu32Options & VBSF_O_PATH_PRESERVE_LAST_COMPONENT);
                         rc = vbsfCorrectPathCasing(pClient, pszFullPath, cbFullPathLength, fWildCard, fPreserveLastComponent);
                     }
 
diff --git a/src/VBox/HostServices/SharedFolders/vbsfpath.h b/src/VBox/HostServices/SharedFolders/vbsfpath.h
index f105d0a..662df32 100644
--- a/src/VBox/HostServices/SharedFolders/vbsfpath.h
+++ b/src/VBox/HostServices/SharedFolders/vbsfpath.h
@@ -21,6 +21,10 @@
 #include "shfl.h"
 #include <VBox/shflsvc.h>
 
+#define VBSF_O_PATH_WILDCARD                UINT32_C(0x00000001)
+#define VBSF_O_PATH_PRESERVE_LAST_COMPONENT UINT32_C(0x00000002)
+#define VBSF_O_PATH_CHECK_ROOT_ESCAPE       UINT32_C(0x00000004)
+
 #define VBSF_F_PATH_HAS_WILDCARD_IN_PREFIX UINT32_C(0x00000001) /* A component before the last one contains a wildcard. */
 #define VBSF_F_PATH_HAS_WILDCARD_IN_LAST   UINT32_C(0x00000002) /* The last component contains a wildcard. */
 
@@ -42,7 +46,7 @@
 int vbsfPathGuestToHost(SHFLCLIENTDATA *pClient, SHFLROOT hRoot,
                         PSHFLSTRING pGuestString, uint32_t cbGuestString,
                         char **ppszHostPath, uint32_t *pcbHostPathRoot,
-                        bool fWildCard, bool fPreserveLastComponent,
+                        uint32_t fu32Options,
                         uint32_t *pfu32PathFlags);
 
 /** Free the host path returned by vbsfPathGuestToHost.
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_simpleget.py b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_simpleget.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/dlm/dlm_generated.py b/src/VBox/HostServices/SharedOpenGL/dlm/dlm_generated.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Installer/linux/Makefile.kmk b/src/VBox/Installer/linux/Makefile.kmk
index eda9941..1c79dbc 100644
--- a/src/VBox/Installer/linux/Makefile.kmk
+++ b/src/VBox/Installer/linux/Makefile.kmk
@@ -67,6 +67,9 @@ INSTALLS += linux-bin
 linux-bin_INST = bin/
 linux-bin_MODE = a+rx,u+w
 linux-bin_SOURCES = \
+	postinst-common.sh \
+	prerm-common.sh \
+	routines.sh \
 	scripts/install.sh=>scripts/install.sh \
 	scripts/VBoxHeadlessXOrg.sh=>scripts/VBoxHeadlessXOrg.sh \
 	VBoxSysInfo.sh \
@@ -82,6 +85,8 @@ linux-scripts_INST = $(VBOX_LNX_INST_STAGE_DIR_REL)/
 linux-scripts_MODE = a+rx,u+w
 linux-scripts_SOURCES = \
 	deffiles \
+	postinst-common.sh \
+	prerm-common.sh \
 	routines.sh \
 	uninstall.sh \
 	vboxautostart-service.sh \
@@ -204,6 +209,9 @@ VBOX_LNX_NO_STRIP = \
 	  ExtensionPacks/VNC/ExtPack-license.html \
 	  ExtensionPacks/VNC/ExtPack-license.rtf \
 	  ExtensionPacks/VNC/ExtPack-license.txt,) \
+	postinst-common.sh \
+	prerm-common.sh \
+	routines.sh \
 	VBoxSysInfo.sh \
 	vboxautostart-service.sh \
 	vboxballoonctrl-service.sh \
diff --git a/src/VBox/Installer/linux/VBox.sh b/src/VBox/Installer/linux/VBox.sh
index 85bcc9c..5490669 100755
--- a/src/VBox/Installer/linux/VBox.sh
+++ b/src/VBox/Installer/linux/VBox.sh
@@ -40,7 +40,7 @@ WARNING: The vboxdrv kernel module is not loaded. Either there is no module
          available for the current kernel (`uname -r`) or it failed to
          load. Please recompile the kernel module and install it by
 
-           sudo /etc/init.d/vboxdrv setup
+           sudo /sbin/rcvboxdrv setup
 
          You will not be able to start VMs until this problem is fixed.
 EOF
@@ -48,7 +48,7 @@ elif [ ! -c /dev/vboxdrv ]; then
     cat << EOF
 WARNING: The character device /dev/vboxdrv does not exist. Try
 
-           sudo /etc/init.d/vboxdrv restart
+           sudo /sbin/rcvboxdrv restart
 
          and if that is not successful, try to re-install the package.
 
diff --git a/src/VBox/Installer/linux/install.sh b/src/VBox/Installer/linux/install.sh
index 5d74351..ff6a37d 100755
--- a/src/VBox/Installer/linux/install.sh
+++ b/src/VBox/Installer/linux/install.sh
@@ -129,18 +129,6 @@ check_root
 # Set up logging before anything else
 create_log $LOG
 
-# Now stop the autostart service otherwise it will keep VBoxSVC running
-stop_init_script vboxautostart-service
-
-# Now stop the ballon control service otherwise it will keep VBoxSVC running
-stop_init_script vboxballoonctrl-service
-
-# Now stop the web service otherwise it will keep VBoxSVC running
-stop_init_script vboxweb-service
-
-# Now check if no VBoxSVC daemon is running
-check_running
-
 log "VirtualBox $VERSION r$SVNREV installer, built $BUILD."
 log ""
 log "Testing system setup..."
@@ -161,23 +149,6 @@ if [ "$cpu" != "$ARCH" ]; then
   exit 1
 fi
 
-# Check that the system is setup correctly for the installation
-have_bzip2="`check_bzip2; echo $?`"     # Do we have bzip2?
-have_gmake="`check_gmake; echo $?`"     # Do we have GNU make?
-have_ksource="`check_ksource; echo $?`" # Can we find the kernel source?
-have_gcc="`check_gcc; echo $?`"         # Is GCC installed?
-
-if [ $have_bzip2 -eq 1 -o $have_gmake -eq 1 -o $have_ksource -eq 1 \
-     -o $have_gcc -eq 1 ]; then
-    info "Problems were found which would prevent VirtualBox from installing."
-    info "Please correct these problems and try again."
-    log "Giving up due to the problems mentioned above."
-    exit 1
-else
-    log "System setup appears correct."
-    log ""
-fi
-
 # Sensible default actions
 ACTION="install"
 BUILD_MODULE="true"
@@ -220,10 +191,7 @@ if [ "$ACTION" = "install" ]; then
     umask 022
 
     # Find previous installation
-    if [ ! -r $CONFIG_DIR/$CONFIG ]; then
-        mkdir -p -m 755 $CONFIG_DIR
-        touch $CONFIG_DIR/$CONFIG
-    else
+    if test -r "$CONFIG_DIR/$CONFIG"; then
         . $CONFIG_DIR/$CONFIG
         PREV_INSTALLATION=$INSTALL_DIR
     fi
@@ -246,38 +214,14 @@ if [ "$ACTION" = "install" ]; then
         fi
     fi
 
-    # Terminate Server and VBoxNetDHCP if running
-    terminate_proc VBoxSVC
-    terminate_proc VBoxNetDHCP
-    terminate_proc VBoxNetNAT
-
     # Remove previous installation
-    if [ -n "$PREV_INSTALLATION" -a -z "$FORCE_UPGRADE" -a ! "$VERSION" = "$INSTALL_VER" ] &&
-      expr "$INSTALL_VER" "<" "1.6.0" > /dev/null 2>&1
-    then
-        info
-        info "If you are upgrading from VirtualBox 1.5 or older and if some of your virtual"
-        info "machines have saved states, then the saved state information will be lost"
-        info "after the upgrade and will have to be discarded.  If you do not want this then"
-        info "you can cancel the upgrade now."
-        info
-        info "Do you wish to continue? [yes or no]"
-        read reply dummy
-        if ! expr "$reply" : [yY] && ! expr "$reply" : [yY][eE][sS]
-        then
-            info
-            info "Cancelling upgrade."
-            log "User requested cancellation of the installation"
-            exit 1
-        fi
-    fi
-
     if [ ! "$VERSION" = "$INSTALL_VER" -a ! "$BUILD_MODULE" = "true" -a -n "$DKMS" ]
     then
         # Not doing this can confuse dkms
         info "Rebuilding the kernel module after version change"
         BUILD_MODULE=true
     fi
+    test "${BUILD_MODULE}" = true || VBOX_DONT_REMOVE_OLD_MODULES=1
 
     if [ -n "$PREV_INSTALLATION" ]; then
         [ -n "$INSTALL_REV" ] && INSTALL_REV=" r$INSTALL_REV"
@@ -285,70 +229,42 @@ if [ "$ACTION" = "install" ]; then
         log "Removing previous installation of VirtualBox $INSTALL_VER$INSTALL_REV from $PREV_INSTALLATION"
         log ""
 
-        stop_init_script vboxnet >/dev/null 2>&1  # Do we need this?
-        delrunlevel vboxnet > /dev/null 2>&1
-        if [ "$BUILD_MODULE" = "true" ]; then
-            stop_init_script vboxdrv
-            if [ -n "$DKMS" ]
-            then
-                $DKMS remove -m vboxhost -v $INSTALL_VER --all > /dev/null 2>&1
-                $DKMS remove -m vboxdrv -v $INSTALL_VER --all > /dev/null 2>&1
-                $DKMS remove -m vboxnetflt -v $INSTALL_VER --all > /dev/null 2>&1
-                $DKMS remove -m vboxnetadp -v $INSTALL_VER --all > /dev/null 2>&1
-            fi
-            # OSE doesn't always have the initscript
-            rmmod vboxpci > /dev/null 2>&1
-            rmmod vboxnetadp > /dev/null 2>&1
-            rmmod vboxnetflt > /dev/null 2>&1
-            rmmod vboxdrv > /dev/null 2>&1
-
-            module_loaded && {
-                info "Warning: could not stop VirtualBox kernel module."
-                info "Please restart your system to apply changes."
-                log "Unable to remove the old VirtualBox kernel module."
-                log "  An old version of VirtualBox may be running."
-            }
-        else
-            VBOX_DONT_REMOVE_OLD_MODULES=1
-        fi
-
         VBOX_NO_UNINSTALL_MESSAGE=1
+        # This also checks $BUILD_MODULE and $VBOX_DONT_REMOVE_OLD_MODULES
         . ./uninstall.sh
-
     fi
 
+    mkdir -p -m 755 $CONFIG_DIR
+    touch $CONFIG_DIR/$CONFIG
+
     info "Installing VirtualBox to $INSTALLATION_DIR"
     log "Installing VirtualBox to $INSTALLATION_DIR"
     log ""
 
     # Verify the archive
     mkdir -p -m 755 $INSTALLATION_DIR
-    bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > $CONFIG_DIR/$CONFIG_FILES
-    RETVAL=$?
-    if [ $RETVAL != 0 ]; then
+    bzip2 -d -c VirtualBox.tar.bz2 > VirtualBox.tar
+    if ! tar -tf VirtualBox.tar > $CONFIG_DIR/$CONFIG_FILES; then
         rmdir $INSTALLATION_DIR 2> /dev/null
         rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
         rm -f $CONFIG_DIR/$CONFIG_FILES 2> /dev/null
-        log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -tf - > '"$CONFIG_DIR/$CONFIG_FILES"'".'
+        log 'Error running "bzip2 -d -c VirtualBox.tar.bz2" or "tar -tf VirtualBox.tar".'
         abort "Error installing VirtualBox.  Installation aborted"
     fi
 
     # Create installation directory and install
-    bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C $INSTALLATION_DIR
-    RETVAL=$?
-    if [ $RETVAL != 0 ]; then
+    if ! tar -xf VirtualBox.tar -C $INSTALLATION_DIR; then
         cwd=`pwd`
         cd $INSTALLATION_DIR
         rm -f `cat $CONFIG_DIR/$CONFIG_FILES` 2> /dev/null
         cd $pwd
         rmdir $INSTALLATION_DIR 2> /dev/null
         rm -f $CONFIG_DIR/$CONFIG 2> /dev/null
-        log 'Error running "bzip2 -d -c VirtualBox.tar.bz2 | tar -xf - -C '"$INSTALLATION_DIR"'".'
+        log 'Error running "tar -xf VirtualBox.tar -C '"$INSTALLATION_DIR"'".'
         abort "Error installing VirtualBox.  Installation aborted"
     fi
 
-    cp uninstall.sh routines.sh $INSTALLATION_DIR
-    echo "routines.sh" >> $CONFIG_DIR/$CONFIG_FILES
+    cp uninstall.sh $INSTALLATION_DIR
     echo "uninstall.sh" >> $CONFIG_DIR/$CONFIG_FILES
 
     # XXX SELinux: allow text relocation entries
@@ -375,13 +291,7 @@ if [ "$ACTION" = "install" ]; then
     test -e $INSTALLATION_DIR/VBoxNetAdpCtl && chmod 4511 $INSTALLATION_DIR/VBoxNetAdpCtl
     test -e $INSTALLATION_DIR/VBoxVolInfo && chmod 4511 $INSTALLATION_DIR/VBoxVolInfo
 
-    # Install runlevel scripts
-    install_init_script $INSTALLATION_DIR/vboxdrv.sh vboxdrv 2>> $LOG
-    install_init_script $INSTALLATION_DIR/vboxballoonctrl-service.sh vboxballoonctrl-service 2>> $LOG
-    install_init_script $INSTALLATION_DIR/vboxautostart-service.sh vboxautostart-service 2>> $LOG
-    install_init_script $INSTALLATION_DIR/vboxweb-service.sh vboxweb-service 2>> $LOG
-
-    # Write the configuration. Do this before we call /etc/init.d/vboxdrv setup!
+    # Write the configuration. Do this before we call /sbin/rcvboxdrv setup!
     echo "# VirtualBox installation directory" > $CONFIG_DIR/$CONFIG
     echo "INSTALL_DIR='$INSTALLATION_DIR'" >> $CONFIG_DIR/$CONFIG
     echo "# VirtualBox version" >> $CONFIG_DIR/$CONFIG
@@ -391,15 +301,6 @@ if [ "$ACTION" = "install" ]; then
     echo "BUILD_TYPE='$BUILD_BUILDTYPE'" >> $CONFIG_DIR/$CONFIG
     echo "USERNAME='$BUILD_USERNAME'" >> $CONFIG_DIR/$CONFIG
 
-    delrunlevel vboxdrv > /dev/null 2>&1
-    addrunlevel vboxdrv 2>> $LOG # This may produce useful output
-    delrunlevel vboxballoonctrl-service > /dev/null 2>&1
-    addrunlevel vboxballoonctrl-service 2>> $LOG # This may produce useful output
-    delrunlevel vboxautostart-service > /dev/null 2>&1
-    addrunlevel vboxautostart-service 2>> $LOG # This may produce useful output
-    delrunlevel vboxweb-service > /dev/null 2>&1
-    addrunlevel vboxweb-service 2>> $LOG # This may produce useful output
-
     # Create users group
     groupadd -r -f $GROUPNAME 2> /dev/null
 
@@ -417,7 +318,6 @@ if [ "$ACTION" = "install" ]; then
     if [ -f $INSTALLATION_DIR/VBoxDTrace ]; then
         ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxDTrace
     fi
-    ln -sf $INSTALLATION_DIR/vboxdrv.sh /sbin/rcvboxdrv
     # Unity and Nautilus seem to look here for their icons
     ln -sf $INSTALLATION_DIR/icons/128x128/virtualbox.png /usr/share/pixmaps/virtualbox.png
     ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop
@@ -477,21 +377,24 @@ if [ "$ACTION" = "install" ]; then
         log "Output from the module build process (the Linux kernel build system) follows:"
         cur=`pwd`
         log ""
-        ./vboxdrv.sh setup
         # Start VirtualBox kernel module
-        if [ $RETVAL -eq 0 ] && ! start_init_script vboxdrv; then
+        if ! ./vboxdrv.sh setup || ! ./vboxdrv.sh start; then
             info "Failed to load the kernel module."
             MODULE_FAILED="true"
             RC_SCRIPT=1
         fi
-        start_init_script vboxballoonctrl-service
-        start_init_script vboxautostart-service
-        start_init_script vboxweb-service
         log ""
         log "End of the output from the Linux kernel build system."
         cd $cur
     fi
 
+    # Do post-installation common to all installer types, currently service
+    # script set-up.
+    START_SERVICES=
+    test "${BUILD_MODULE}" = "true" && test "${MODULE_FAILED}" = "false" &&
+        START_SERVICES="--start"
+    ./postinst-common.sh "${INSTALLATION_DIR}" "${START_SERVICES}" >> "${LOG}"
+
     info ""
     if [ ! "$MODULE_FAILED" = "true" ]
     then
@@ -499,7 +402,7 @@ if [ "$ACTION" = "install" ]; then
     else
         info "VirtualBox has been installed successfully, but the kernel module could not"
         info "be built.  When you have fixed the problems preventing this, execute"
-        info "  /etc/init.d/vboxdrv setup"
+        info "  /sbin/rcvboxdrv setup"
         info "as administrator to build it."
     fi
     info ""
diff --git a/src/VBox/Installer/linux/postinst-common.sh b/src/VBox/Installer/linux/postinst-common.sh
new file mode 100644
index 0000000..d81e628
--- /dev/null
+++ b/src/VBox/Installer/linux/postinst-common.sh
@@ -0,0 +1,74 @@
+# Oracle VM VirtualBox
+# VirtualBox Linux post-installer common portions
+#
+
+# Copyright (C) 2015 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+
+# Put bits of the post-installation here which should work the same for all of
+# the Linux installers.  We do not use special helpers (e.g. dh_* on Debian),
+# but that should not matter, as we know what those helpers actually do, and we
+# have to work on those systems anyway when installed using the all
+# distributions installer.
+#
+# We assume that all required files are in the same folder as this script
+# (e.g. /opt/VirtualBox, /usr/lib/VirtualBox, the build output directory).
+
+# This is GNU-specific, sorry Solaris.
+MY_PATH="$(dirname $(readlink -f -- "${0}"))/"
+cd "${MY_PATH}"
+. "./routines.sh"
+
+START=
+TARGET=
+for i in "$@"
+do
+    case "${i}" in
+        --start)
+            START=true
+            ;;
+        *)
+            if test -z "${TARGET}" && test -d "${i}"; then
+                TARGET="${i}"
+            else
+                echo "Bad argument ${i}" >&2
+                exit 1
+            fi
+            ;;
+    esac
+done
+
+if test -z "${TARGET}"; then
+    echo "$0: no installation target specified." >&2
+    exit 1
+fi
+
+# Install runlevel scripts and systemd unit files
+install_init_script "${TARGET}/vboxdrv.sh" vboxdrv
+install_init_script "${TARGET}/vboxballoonctrl-service.sh" vboxballoonctrl-service
+install_init_script "${TARGET}/vboxautostart-service.sh" vboxautostart-service
+install_init_script "${TARGET}/vboxweb-service.sh" vboxweb-service
+
+delrunlevel vboxdrv
+addrunlevel vboxdrv
+delrunlevel vboxballoonctrl-service
+addrunlevel vboxballoonctrl-service
+delrunlevel vboxautostart-service
+addrunlevel vboxautostart-service
+delrunlevel vboxweb-service
+addrunlevel vboxweb-service
+
+test -n "${START}" &&
+{
+    start_init_script vboxdrv
+    start_init_script vboxballoonctrl-service
+    start_init_script vboxautostart-service
+    start_init_script vboxweb-service
+}
diff --git a/src/VBox/Installer/linux/prerm-common.sh b/src/VBox/Installer/linux/prerm-common.sh
new file mode 100644
index 0000000..2d7d881
--- /dev/null
+++ b/src/VBox/Installer/linux/prerm-common.sh
@@ -0,0 +1,90 @@
+# Oracle VM VirtualBox
+# VirtualBox Linux pre-uninstaller common portions
+#
+
+# Copyright (C) 2015 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+
+# Put bits of the pre-uninstallation here which should work the same for all of
+# the Linux installers.  We do not use special helpers (e.g. dh_* on Debian),
+# but that should not matter, as we know what those helpers actually do, and we
+# have to work on those systems anyway when installed using the all
+# distributions installer.
+#
+# We assume that all required files are in the same folder as this script
+# (e.g. /opt/VirtualBox, /usr/lib/VirtualBox, the build output directory).
+#
+# Script exit status: 0 on success, 1 if VirtualBox is running and can not be
+# stopped (installers may show an error themselves or just pass on standard
+# error).
+
+# This is GNU-specific, sorry Solaris.
+MY_PATH="$(dirname $(readlink -f -- "${0}"))/"
+cd "${MY_PATH}"
+. "./routines.sh"
+
+DO_DKMS=
+VERSION=
+while true
+do
+    test -z "${1}" && break
+    case "${1}" in
+        --dkms)
+            DO_DKMS=true
+            shift
+            VERSION="${1}"
+            if test -z "${VERSION}"; then
+                echo "--dkms requires a version"
+                exit 1
+            fi
+            ;;
+        *)
+            echo "Bad argument ${1}" >&2
+            exit 1
+            ;;
+    esac
+    shift
+done
+
+# Stop the ballon control service
+stop_init_script vboxballoonctrl-service 2>/dev/null
+# Stop the autostart service
+stop_init_script vboxautostart-service 2>/dev/null
+# Stop the web service
+stop_init_script vboxweb-service 2>/dev/null
+# Do this check here after we terminated the web service: check whether VBoxSVC
+# is running and exit if it can't be stopped.
+check_running
+# Terminate VBoxNetDHCP if running
+terminate_proc VBoxNetDHCP
+# Terminate VBoxNetNAT if running
+terminate_proc VBoxNetNAT
+delrunlevel vboxballoonctrl-service
+remove_init_script vboxballoonctrl-service
+delrunlevel vboxautostart-service
+remove_init_script vboxautostart-service
+delrunlevel vboxweb-service
+remove_init_script vboxweb-service
+DKMS=`which dkms 2>/dev/null`
+if test "$DO_DKMS" = true && test -n "$DKMS"; then
+  $DKMS remove -m vboxhost -v "${VERSION}" --all > /dev/null 2>&1
+  $DKMS remove -m vboxdrv -v "${VERSION}" --all > /dev/null 2>&1
+  $DKMS remove -m vboxnetflt -v "${VERSION}" --all > /dev/null 2>&1
+  $DKMS remove -m vboxnetadp -v "${VERSION}" --all > /dev/null 2>&1
+fi
+# Stop kernel module and uninstall runlevel script
+stop_init_script vboxdrv 2>/dev/null
+delrunlevel vboxdrv
+remove_init_script vboxdrv
+# Stop host networking and uninstall runlevel script (obsolete)
+stop_init_script vboxnet 2>/dev/null
+delrunlevel vboxnet 2>/dev/null
+remove_init_script vboxnet 2>/dev/null
+exit 0
diff --git a/src/VBox/Installer/linux/routines.sh b/src/VBox/Installer/linux/routines.sh
index 850f36c..be976f4 100644
--- a/src/VBox/Installer/linux/routines.sh
+++ b/src/VBox/Installer/linux/routines.sh
@@ -108,82 +108,6 @@ check_running()
     fi
 }
 
-## Do we have bzip2?
-check_bzip2()
-{
-    if ! ls /bin/bzip2 /usr/bin/bzip2 /usr/local/bin/bzip2 2> /dev/null | grep bzip2 > /dev/null; then
-        echo 1>&2 "Please install the bzip2 utility."
-        log "Please install bzip2."
-        return 1
-    fi
-    return 0
-}
-
-## Do we have GNU make?
-check_gmake()
-{
-make --version 2>&1 | grep GNU > /dev/null
-    if [ ! $? = 0 ]; then
-        echo 1>&2 "Please install GNU make."
-        log "Please install GNU make."
-        return 1
-    fi
-    return 0
-}
-
-## Can we find the kernel source?
-check_ksource()
-{
-    ro_KBUILD_DIR=/lib/modules/`uname -r`/build
-    if [ ! -d $ro_KBUILD_DIR/include ]; then
-        ro_KBUILD_DIR=/usr/src/linux
-        if [ ! -d $ro_KBUILD_DIR/include ]; then
-            echo 1>&2 "Please install the build and header files for your current Linux kernel."
-            echo 1>&2 "The current kernel version is `uname -r`"
-            ro_KBUILD_DIR=""
-            log "Could not find the Linux kernel header files - the directories"
-            log "  /lib/modules/`uname -r`/build/include and /usr/src/linux/include"
-            log "  do not exist."
-            return 1
-        fi
-    fi
-    return 0
-}
-
-## Is GCC installed?
-check_gcc()
-{
-    ro_gcc_version=`gcc --version 2> /dev/null | head -n 1`
-    if [ "$ro_gcc_version" = "" ]; then
-        echo 1>&2 "Please install the GNU compiler."
-        log "Please install the GNU compiler."
-        return 1
-    fi # GCC installed
-    return 0
-}
-
-## Is bash installed?  You never know...
-check_bash()
-{
-    if [ ! -x /bin/bash ]; then
-        echo 1>&2 "Please install GNU bash."
-        log "Please install GNU bash."
-        return 1
-    fi
-    return 0
-}
-
-## Is perl installed?
-check_perl()
-{
-    if [ ! `perl -e 'print "test"' 2> /dev/null` = "test" ]; then
-        echo 1>&2 "Please install perl."
-        echo "Please install perl."
-        return 1
-    fi
-    return 0
-}
-
 ## Creates a systemd wrapper in /lib for an LSB init script
 systemd_wrap_init_script()
 {
@@ -193,12 +117,12 @@ systemd_wrap_init_script()
     ## Name for the service.
     name="$2"
     test -x "$script" && test ! "$name" = "" || \
-        { log "$self: invalid arguments" && return 1; }
+        { echo "$self: invalid arguments" >&2 && return 1; }
     test -d /usr/lib/systemd/system && unit_path=/usr/lib/systemd/system
     test -d /lib/systemd/system && unit_path=/lib/systemd/system
     test -n "${unit_path}" || \
-        { log "$self: systemd unit path not found" && return 1; }
-    description=`sed -n 's/# *Description: *\(.*\)/\1/p' "${script}"`
+        { echo "$self: systemd unit path not found" >&2 && return 1; }
+    description=`sed -n 's/# *Short-Description: *\(.*\)/\1/p' "${script}"`
     required=`sed -n 's/# *Required-Start: *\(.*\)/\1/p' "${script}"`
     runlevels=`sed -n 's/# *Default-Start: *\(.*\)/\1/p' "${script}"`
     before=`for i in ${runlevels}; do printf "runlevel${i}.target "; done`
@@ -235,19 +159,21 @@ install_init_script()
     script="$1"
     ## Name for the service.
     name="$2"
-    test -x "$script" && test ! "$name" = "" || \
-        { log "$self: invalid arguments" && return 1; }
-    test -d /lib/systemd/system || test -d /usr/lib/systemd/system && systemd_wrap_init_script "$script" "$name"
-    if test -d /etc/rc.d/init.d
-    then
-        cp "$script" "/etc/rc.d/init.d/$name" 2> /dev/null
-        chmod 755 "/etc/rc.d/init.d/$name" 2> /dev/null
-    elif test -d /etc/init.d
-    then
-        cp "$script" "/etc/init.d/$name" 2> /dev/null
-        chmod 755 "/etc/init.d/$name" 2> /dev/null
+
+    test -x "${script}" && test ! "${name}" = "" ||
+        { echo "${self}: invalid arguments" >&2; return 1; }
+    ln -s "${script}" "/sbin/rc${name}"
+    test -x "`which systemctl 2>/dev/null`" &&
+        { systemd_wrap_init_script "$script" "$name"; return; }
+    if test -d /etc/rc.d/init.d; then
+        cp "${script}" "/etc/rc.d/init.d/${name}" &&
+            chmod 755 "/etc/rc.d/init.d/${name}"
+    elif test -d /etc/init.d; then
+        cp "${script}" "/etc/init.d/${name}" &&
+            chmod 755 "/etc/init.d/${name}"
+    else
+        { echo "${self}: error: unknown init type" >&2; return 1; }
     fi
-    return 0
 }
 
 ## Remove the init script "name"
@@ -256,17 +182,13 @@ remove_init_script()
     self="remove_init_script"
     ## Name of the service to remove.
     name="$1"
-    test ! "$name" = "" || \
-        { log "$self: missing argument" && return 1; }
+
+    test -n "${name}" ||
+        { echo "$self: missing argument"; return 1; }
+    rm -f "/sbin/rc${name}"
     rm -f /lib/systemd/system/"$name".service /usr/lib/systemd/system/"$name".service
-    if test -d /etc/rc.d/init.d
-    then
-        rm -f "/etc/rc.d/init.d/$name" > /dev/null 2>&1
-    elif test -d /etc/init.d
-    then
-        rm -f "/etc/init.d/$name" > /dev/null 2>&1
-    fi
-    return 0
+    rm -f "/etc/rc.d/init.d/$name"
+    rm -f "/etc/init.d/$name"
 }
 
 ## Perform an action on a service
@@ -277,22 +199,18 @@ do_sysvinit_action()
     name="${1}"
     ## The action to perform, normally "start", "stop" or "status".
     action="${2}"
-    test ! -z "${name}" && test ! -z "${action}" || \
-        { log "${self}: missing argument" && return 1; }
-    if test -x "`which systemctl 2>/dev/null`"
-    then
-        systemctl ${action} "${name}"
-    elif test -x "`which service 2>/dev/null`"
-    then
+
+    test ! -z "${name}" && test ! -z "${action}" ||
+        { echo "${self}: missing argument" >&2; return 1; }
+    if test -x "`which systemctl 2>/dev/null`"; then
+        systemctl -q ${action} "${name}"
+    elif test -x "`which service 2>/dev/null`"; then
         service "${name}" ${action}
-    elif test -x "`which invoke-rc.d 2>/dev/null`"
-    then
+    elif test -x "`which invoke-rc.d 2>/dev/null`"; then
         invoke-rc.d "${name}" ${action}
-    elif test -x "/etc/rc.d/init.d/${name}"
-    then
+    elif test -x "/etc/rc.d/init.d/${name}"; then
         "/etc/rc.d/init.d/${name}" "${action}"
-    elif test -x "/etc/init.d/${name}"
-    then
+    elif test -x "/etc/init.d/${name}"; then
         "/etc/init.d/${name}" "${action}"
     fi
 }
@@ -314,6 +232,7 @@ get_chkconfig_info()
 {
     ## The script to extract the information from.
     script="${1}"
+
     set `sed -n 's/# *chkconfig: *\([0-9]*\) *\(.*\)/\1 \2/p' "${script}"`
     ## Which runlevels should we start in?
     runlevels="${1}"
@@ -322,16 +241,17 @@ get_chkconfig_info()
     ## How soon in the shutdown process will we stop, from 99 (first) to 00
     stop_order="${3}"
     test ! -z "${name}" || \
-        { log "${self}: missing name" && return 1; }
+        { echo "${self}: missing name" >&2; return 1; }
     expr "${start_order}" + 0 > /dev/null 2>&1 && \
         expr 0 \<= "${start_order}" > /dev/null 2>&1 && \
         test `expr length "${start_order}"` -eq 2 > /dev/null 2>&1 || \
-        { log "${self}: start sequence number must be between 00 and 99" && return 1; }
+        { echo "${self}: start sequence number must be between 00 and 99" >&2;
+            return 1; }
     expr "${stop_order}" + 0 > /dev/null 2>&1 && \
         expr 0 \<= "${stop_order}" > /dev/null 2>&1 && \
         test `expr length "${stop_order}"` -eq 2 > /dev/null 2>&1 || \
-        { log "${self}: stop sequence number must be between 00 and 99" && return 1; }
-    return 0
+        { echo "${self}: stop sequence number must be between 00 and 99" >&2;
+            return 1; }
 }
 
 ## Add a service to a runlevel
@@ -340,40 +260,32 @@ addrunlevel()
     self="addrunlevel"
     ## Service name.
     name="${1}"
+
     test -n "${name}" || \
-        { log "${self}: missing argument" && return 1; }
+        { echo "${self}: missing argument" >&2; return 1; }
     test -x "`which systemctl 2>/dev/null`" && \
-        { systemctl enable "${name}"; return; }
-    if test -x "/etc/rc.d/init.d/${name}"
-    then
+        { systemctl -q enable "${name}"; return; }
+    if test -x "/etc/rc.d/init.d/${name}"; then
         init_d_path=/etc/rc.d
-    elif test -x "/etc/init.d/${name}"
-    then
+    elif test -x "/etc/init.d/${name}"; then
         init_d_path=/etc
     else
-        log "${self}: error: unknown init type or unknown service ${name}"
-        return 1
+        { echo "${self}: error: unknown init type" >&2; return 1; }
     fi
     get_chkconfig_info "${init_d_path}/init.d/${name}" || return 1
     # Redhat based sysvinit systems
-    if test -x "`which chkconfig 2>/dev/null`"
-    then
-        chkconfig --add "${name}" || {
-            log "Failed to set up init script ${name}" && return 1
-        }
+    if test -x "`which chkconfig 2>/dev/null`"; then
+        chkconfig --add "${name}"
     # SUSE-based sysvinit systems
-    elif test -x "`which insserv 2>/dev/null`"
-    then
-        insserv "${name}" > /dev/null
+    elif test -x "`which insserv 2>/dev/null`"; then
+        insserv "${name}"
     # Debian/Ubuntu-based systems
-    elif test -x "`which update-rc.d 2>/dev/null`"
-    then
+    elif test -x "`which update-rc.d 2>/dev/null`"; then
         # Old Debians did not support dependencies
-        update-rc.d "${name}" defaults "${start_order}" "${stop_order}" \
-            > /dev/null 2>&1
+        update-rc.d "${name}" defaults "${start_order}" "${stop_order}"
     # Gentoo Linux
     elif test -x "`which rc-update 2>/dev/null`"; then
-        rc-update add "${name}" default > /dev/null 2>&1
+        rc-update add "${name}" default
     # Generic sysvinit
     elif test -n "${init_d_path}/rc0.d"
     then
@@ -383,13 +295,11 @@ addrunlevel()
             expr "${runlevels}" : ".*${locali}" >/dev/null && \
                 target="${init_d_path}/rc${locali}.d/S${start_order}${name}"
             test -e "${init_d_path}/rc${locali}.d/"[KS][0-9]*"${name}" || \
-                ln -fs "${init_d_path}/init.d/${name}" "${target}" 2> /dev/null
+                ln -fs "${init_d_path}/init.d/${name}" "${target}"
         done
     else
-        log "${self}: error: unknown init type"
-        return 1
+        { echo "${self}: error: unknown init type" >&2; return 1; }
     fi
-    return 0
 }
 
 
@@ -399,39 +309,21 @@ delrunlevel()
     self="delrunlevel"
     ## Service name.
     name="${1}"
-    test -n "${name}" || \
-        { log "${self}: missing argument" && return 1; }
-    if test -x "`which systemctl 2>/dev/null`"
-    then
-        systemctl disable "${name}"
+
+    test -n "${name}" ||
+        { echo "${self}: missing argument" >&2; return 1; }
+    systemctl -q disable "${name}" >/dev/null 2>&1
     # Redhat-based systems
-    elif test -x "/sbin/chkconfig"
-    then
-        /sbin/chkconfig --del "${name}" > /dev/null 2>&1
+    chkconfig --del "${name}" >/dev/null 2>&1
     # SUSE-based sysvinit systems
-    elif test -x /sbin/insserv
-    then
-        /sbin/insserv -r "${name}" > /dev/null 2>&1
+    insserv -r "${name}" >/dev/null 2>&1
     # Debian/Ubuntu-based systems
-    elif test -x "`which update-rc.d 2>/dev/null`"
-    then
-        update-rc.d -f "${name}" remove > /dev/null 2>&1
+    update-rc.d -f "${name}" remove >/dev/null 2>&1
     # Gentoo Linux
-    elif test -x "`which rc-update 2>/dev/null`"
-    then
-        rc-update del "${name}" > /dev/null 2>&1
+    rc-update del "${name}" >/dev/null 2>&1
     # Generic sysvinit
-    elif test -d /etc/rc.d/init.d
-    then
-        rm /etc/rc.d/rc?.d/[SK]??"${name}" > /dev/null 2>&1
-    elif test -d /etc/init.d
-    then
-        rm /etc/rc?.d/[SK]??"${name}" > /dev/null 2>&1
-    else
-        log "${self}: error: unknown init type"
-        return 1
-    fi
-    return 0
+    rm -f /etc/rc.d/rc?.d/[SK]??"${name}"
+    rm -f /etc/rc?.d/[SK]??"${name}"
 }
 
 
diff --git a/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec b/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec
index dff326f..ef6fcec 100644
--- a/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec
+++ b/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec
@@ -115,17 +115,19 @@ cd icons
 cd -
 rmdir icons
 mv virtualbox.xml $RPM_BUILD_ROOT/usr/share/mime/packages
-for i in VBoxManage VBoxSVC VBoxSDL VirtualBox VBoxHeadless VBoxDTrace VBoxExtPackHelperApp VBoxBalloonCtrl VBoxAutostart vbox-img; do
+for i in VBoxManage VBoxSVC VirtualBox VBoxHeadless VBoxDTrace VBoxExtPackHelperApp VBoxBalloonCtrl VBoxAutostart vbox-img; do
   mv $i $RPM_BUILD_ROOT/usr/lib/virtualbox; done
 if %WEBSVC%; then
   for i in vboxwebsrv webtest; do
     mv $i $RPM_BUILD_ROOT/usr/lib/virtualbox; done
 fi
-for i in VBoxSDL VirtualBox VBoxHeadless VBoxNetDHCP VBoxNetNAT VBoxNetAdpCtl; do
+test -f VBoxSDL && mv VBoxSDL $RPM_BUILD_ROOT/usr/lib/virtualbox
+for i in VirtualBox VBoxHeadless VBoxNetDHCP VBoxNetNAT VBoxNetAdpCtl; do
   chmod 4511 $RPM_BUILD_ROOT/usr/lib/virtualbox/$i; done
 if [ -f $RPM_BUILD_ROOT/usr/lib/virtualbox/VBoxVolInfo ]; then
   chmod 4511 $RPM_BUILD_ROOT/usr/lib/virtualbox/VBoxVolInfo
 fi
+test -f VBoxSDL && chmod 4511 $RPM_BUILD_ROOT/usr/lib/virtualbox/VBoxSDL
 if [ -d ExtensionPacks/VNC ]; then
   mv ExtensionPacks/VNC $RPM_BUILD_ROOT/usr/lib/virtualbox/ExtensionPacks
 fi
@@ -168,22 +170,19 @@ for i in additions/VBoxGuestAdditions.iso; do
 if [ -d accessible ]; then
   mv accessible $RPM_BUILD_ROOT/usr/lib/virtualbox
 fi
-install -D -m 755 vboxdrv.init $RPM_BUILD_ROOT%{_initrddir}/vboxdrv
-ln -sf %{_initrddir}/vboxdrv $RPM_BUILD_ROOT/sbin/rcvboxdrv
-install -D -m 755 vboxballoonctrl-service.init $RPM_BUILD_ROOT%{_initrddir}/vboxballoonctrl-service
-install -D -m 755 vboxautostart-service.init $RPM_BUILD_ROOT%{_initrddir}/vboxautostart-service
-install -D -m 755 vboxweb-service.init $RPM_BUILD_ROOT%{_initrddir}/vboxweb-service
-%if %{?rpm_suse:1}%{!?rpm_suse:0}
-ln -sf ../etc/init.d/vboxballoonctrl-service $RPM_BUILD_ROOT/sbin/rcvboxballoonctrl-service
-ln -sf ../etc/init.d/vboxautostart-service $RPM_BUILD_ROOT/sbin/rcvboxautostart-service
-ln -sf ../etc/init.d/vboxweb-service $RPM_BUILD_ROOT/sbin/rcvboxweb-service
-%endif
+mv vboxdrv.sh $RPM_BUILD_ROOT/usr/lib/virtualbox
+mv vboxballoonctrl-service.sh $RPM_BUILD_ROOT/usr/lib/virtualbox
+mv vboxautostart-service.sh $RPM_BUILD_ROOT/usr/lib/virtualbox
+mv vboxweb-service.sh $RPM_BUILD_ROOT/usr/lib/virtualbox
+mv postinst-common.sh $RPM_BUILD_ROOT/usr/lib/virtualbox
+mv prerm-common.sh $RPM_BUILD_ROOT/usr/lib/virtualbox
+mv routines.sh $RPM_BUILD_ROOT/usr/lib/virtualbox
 ln -s VBox $RPM_BUILD_ROOT/usr/bin/VirtualBox
 ln -s VBox $RPM_BUILD_ROOT/usr/bin/virtualbox
 ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxManage
 ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxmanage
-ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxSDL
-ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxsdl
+test -f VBoxSDL && ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxSDL
+test -f VBoxSDL && ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxsdl
 ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxVRDP
 ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxHeadless
 ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxheadless
@@ -204,22 +203,27 @@ mv VBox.png $RPM_BUILD_ROOT/usr/share/pixmaps/VBox.png
 # defaults
 [ -r /etc/default/virtualbox ] && . /etc/default/virtualbox
 
+# check for old installation
+if [ -r /etc/vbox/vbox.cfg ]; then
+  . /etc/vbox/vbox.cfg
+  if [ "x$INSTALL_DIR" != "x" -a -d "$INSTALL_DIR" ]; then
+    echo "An old installation of VirtualBox was found. To install this package the"
+    echo "old package has to be removed first. Have a look at /etc/vbox/vbox.cfg to"
+    echo "determine the installation directory of the previous installation. After"
+    echo "uninstalling the old package remove the file /etc/vbox/vbox.cfg."
+    exit 1
+  fi
+fi
+
 # check for active VMs of the installed (old) package
+# Execute the installed packages pre-uninstaller if present.
+/usr/lib/virtualbox/prerm-common.sh 2>/dev/null
+# Stop services from older versions without pre-uninstaller.
+/etc/init.d/vboxballoonctrl-service stop 2>/dev/null
+/etc/init.d/vboxautostart-service stop 2>/dev/null
+/etc/init.d/vboxweb-service stop 2>/dev/null
 VBOXSVC_PID=`pidof VBoxSVC 2>/dev/null || true`
 if [ -n "$VBOXSVC_PID" ]; then
-  # executed before the new package is installed!
-  if [ -f /etc/init.d/vboxballoonctrl-service ]; then
-    # try graceful termination; terminate the balloon control service first
-    /etc/init.d/vboxballoonctrl-service stop 2>/dev/null || true
-  fi
-  if [ -f /etc/init.d/vboxautostart-service ]; then
-    # try graceful termination; terminate the autostart service first
-    /etc/init.d/vboxautostart-service stop 2>/dev/null || true
-  fi
-  if [ -f /etc/init.d/vboxweb-service ]; then
-    # try graceful termination; terminate the webservice first
-    /etc/init.d/vboxweb-service stop 2>/dev/null || true
-  fi
   # ask the daemon to terminate immediately
   kill -USR1 $VBOXSVC_PID
   sleep 1
@@ -231,18 +235,6 @@ if [ -n "$VBOXSVC_PID" ]; then
   fi
 fi
 
-# check for old installation
-if [ -r /etc/vbox/vbox.cfg ]; then
-  . /etc/vbox/vbox.cfg
-  if [ "x$INSTALL_DIR" != "x" -a -d "$INSTALL_DIR" ]; then
-    echo "An old installation of VirtualBox was found. To install this package the"
-    echo "old package has to be removed first. Have a look at /etc/vbox/vbox.cfg to"
-    echo "determine the installation directory of the previous installation. After"
-    echo "uninstalling the old package remove the file /etc/vbox/vbox.cfg."
-    exit 1
-  fi
-fi
-
 # XXX remove old modules from previous versions (disable with INSTALL_NO_VBOXDRV=1 in /etc/default/virtualbox)
 if [ "$INSTALL_NO_VBOXDRV" != "1" ]; then
   find /lib/modules -name "vboxdrv\.*" 2>/dev/null|xargs rm -f 2> /dev/null || true
@@ -287,21 +279,8 @@ fi
 # install udev rule (disable with INSTALL_NO_UDEV=1 in /etc/default/virtualbox)
 # and /dev/vboxdrv and /dev/vboxusb/*/* device nodes
 install_device_node_setup root 0600 /usr/share/virtualbox "${usb_group}"
-%if %{?rpm_redhat:1}%{!?rpm_redhat:0}
-/sbin/chkconfig --add vboxdrv
-/sbin/chkconfig --add vboxballoonctrl-service
-/sbin/chkconfig --add vboxautostart-service
-/sbin/chkconfig --add vboxweb-service
-%endif
-%if %{?rpm_suse:1}%{!?rpm_suse:0}
-%{fillup_and_insserv -f -y -Y vboxdrv vboxballoonctrl-service vboxautostart-service vboxweb-service}
-%endif
 %if %{?rpm_mdv:1}%{!?rpm_mdv:0}
 /sbin/ldconfig
-%_post_service vboxdrv
-%_post_service vboxballoonctrl-service
-%_post_service vboxautostart-service
-%_post_service vboxweb-service
 %update_menus
 %endif
 update-mime-database /usr/share/mime &> /dev/null || :
@@ -332,97 +311,34 @@ if [ "$INSTALL_NO_VBOXDRV" = "1" ]; then
   rm -f /lib/modules/*/misc/vboxpci.ko
 fi
 if [ $BUILD_MODULES -eq 1 ]; then
-  /etc/init.d/vboxdrv setup || true
+  /usr/lib/virtualbox/vboxdrv.sh setup || true
 else
   if lsmod | grep -q "vboxdrv[^_-]"; then
-    /etc/init.d/vboxdrv stop || true
-  fi
-  if [ $REGISTER_MODULES -eq 1 ]; then
-    DKMS=`which dkms 2>/dev/null`
-    if [ -n "$DKMS" ]; then
-      $DKMS remove -m vboxhost -v %VER% --all > /dev/null 2>&1 || true
-    fi
+    /usr/lib/virtualbox/vboxdrv.sh stop || true
   fi
-  /etc/init.d/vboxdrv start > /dev/null
 fi
-/etc/init.d/vboxballoonctrl-service start > /dev/null
-/etc/init.d/vboxautostart-service start > /dev/null
-/etc/init.d/vboxweb-service start > /dev/null
+# Install and start the new service scripts.
+PRERM_DKMS=
+test "${REGISTER_MODULES}" = 1 && PRERM_DKMS="--dkms %VER%"
+POSTINST_START=--start
+test "${INSTALL_NO_VBOXDRV}" = 1 && POSTINST_START=
+/usr/lib/virtualbox/prerm-common.sh ${PRERM_DKMS} || true
+/usr/lib/virtualbox/postinst-common.sh /usr/lib/virtualbox "${POSTINST_START}" > /dev/null || true
 
 
 %preun
+# Called before the package is removed, or during upgrade after (not before)
+# the new version's "post" scriptlet. 
 # $1==0: remove the last version of the package
-# $1==1: install the first time
-# $1>=2: upgrade
-%if %{?rpm_suse:1}%{!?rpm_suse:0}
-%stop_on_removal vboxballoonctrl-service
-%stop_on_removal vboxautostart-service
-%stop_on_removal vboxweb-service
-%endif
-%if %{?rpm_mdv:1}%{!?rpm_mdv:0}
-%_preun_service vboxballoonctrl-service
-%_preun_service vboxautostart-service
-%_preun_service vboxweb-service
-%endif
-%if %{?rpm_redhat:1}%{!?rpm_redhat:0}
-if [ "$1" = 0 ]; then
-  /sbin/service vboxballoonctrl-service stop > /dev/null
-  /sbin/chkconfig --del vboxballoonctrl-service
-  /sbin/service vboxautostart-service stop > /dev/null
-  /sbin/chkconfig --del vboxautostart-service
-  /sbin/service vboxweb-service stop > /dev/null
-  /sbin/chkconfig --del vboxweb-service
-fi
-%endif
-
-if [ "$1" = 0 ]; then
-  # check for active VMs
-  VBOXSVC_PID=`pidof VBoxSVC 2>/dev/null || true`
-  if [ -n "$VBOXSVC_PID" ]; then
-    kill -USR1 $VBOXSVC_PID
-    sleep 1
-    if pidof VBoxSVC > /dev/null 2>&1; then
-      echo "A copy of VirtualBox is currently running.  Please close it and try again."
-      echo "Please note that it can take up to ten seconds for VirtualBox (in particular"
-      echo "the VBoxSVC daemon) to finish running."
-      exit 1
-    fi
-  fi
-fi
-%if %{?rpm_suse:1}%{!?rpm_suse:0}
-%stop_on_removal vboxdrv
-%endif
-%if %{?rpm_mdv:1}%{!?rpm_mdv:0}
-%_preun_service vboxdrv
-%endif
+# $1>=1: upgrade
 if [ "$1" = 0 ]; then
-%if %{?rpm_redhat:1}%{!?rpm_redhat:0}
-  /sbin/service vboxdrv stop > /dev/null
-  /sbin/chkconfig --del vboxdrv
-%endif
+  /usr/lib/virtualbox/prerm-common.sh --dkms || exit 1
   rm -f /etc/udev/rules.d/60-vboxdrv.rules
   rm -f /etc/vbox/license_agreed
   rm -f /etc/vbox/module_not_compiled
 fi
-DKMS=`which dkms 2>/dev/null`
-if [ -n "$DKMS" ]; then
-  $DKMS remove -m vboxhost -v %VER% --all > /dev/null 2>&1 || true
-fi
-
 
 %postun
-%if %{?rpm_redhat:1}%{!?rpm_redhat:0}
-if [ "$1" -ge 1 ]; then
-  /sbin/service vboxdrv restart > /dev/null 2>&1
-  /sbin/service vboxballoonctrl-service restart > /dev/null 2>&1
-  /sbin/service vboxautostart-service restart > /dev/null 2>&1
-  /sbin/service vboxweb-service restart > /dev/null 2>&1
-fi
-%endif
-%if %{?rpm_suse:1}%{!?rpm_suse:0}
-%restart_on_update vboxdrv vboxballoonctrl-service vboxautostart-service vboxweb-service
-%insserv_cleanup
-%endif
 %if %{?rpm_mdv:1}%{!?rpm_mdv:0}
 /sbin/ldconfig
 %{clean_desktop_database}
@@ -444,16 +360,8 @@ rm -rf $RPM_BUILD_ROOT
 %doc %{!?is_ose: LICENSE}
 %doc UserManual*.pdf
 %doc %{!?is_ose: VirtualBox*.chm}
-%{_initrddir}/vboxdrv
-%{_initrddir}/vboxballoonctrl-service
-%{_initrddir}/vboxautostart-service
-%{_initrddir}/vboxweb-service
 %{?rpm_suse: %{py_sitedir}/*}
 %{!?rpm_suse: %{python_sitelib}/*}
-/sbin/rcvboxdrv
-%{?rpm_suse: /sbin/rcvboxballoonctrl-service}
-%{?rpm_suse: /sbin/rcvboxautostart-service}
-%{?rpm_suse: /sbin/rcvboxweb-service}
 /etc/vbox
 /usr/bin/*
 /usr/src/vbox*
diff --git a/src/VBox/Installer/linux/rpm/rules b/src/VBox/Installer/linux/rpm/rules
index 229795d..f34b847 100755
--- a/src/VBox/Installer/linux/rpm/rules
+++ b/src/VBox/Installer/linux/rpm/rules
@@ -20,9 +20,10 @@
 #  NOSUBVER=1       disable generation of the sub-version field (which is
 #                   either the subversion rev [if available] or the build date)
 #  NODOCS=1         don't build docs, use precompiled UserManual.pdf and
-#                   VirtualBox.chm from $HOME
+#                   VirtualBox.chm from $(vboxroot)/prebuild
 #  NOMODS=1         don't build any module
 #  NOQT=1           don't build the Qt GUI
+#  NOSDL=1          don't build VBoxSDL
 #  EFI=1            include the EFI binary from prebuild
 #  VERSUFFIX=<suffix> set a particular package version suffix (e.g. _customer)
 #  HEADLESS=1       build the headless version
@@ -31,6 +32,13 @@
 #  STAGEDISO=<path> don't build the VBoxAdditions, use the precompiled .iso
 #  PKGDIR=<path>    where to store the final package(s)
 #  BLEEDING_EDGE=xyz
+#  svn_revision=xxx do not depend on subversion being available, but use this
+#                   hard-coded revision number instead
+#
+# NODOCS will also be set if UserManual*.pdf and VirtualBox*.chm are placed in
+# $(vboxroot)/prebuild.  STAGEDISO will be set if VBoxGuestAdditions.iso is
+# placed there.  Wine will not be required to be available if both NODOCS and
+# STAGEDISO are set.
 
 ifeq ($(wildcard rpm/rules),)
 $(error call rpm/rules from src/VBox/Installer/linux)
@@ -54,8 +62,8 @@ endif
 
 verpkg   := VirtualBox-5.0
 current  := $(shell pwd)
-vboxroot := $(shell cd ../../../..; pwd)
-pkgdir   := $(if $(PKGDIR),$(PKGDIR),$(shell cd ../../../../..; pwd))
+vboxroot := $(shell while ! test -r configure && ! test "$PWD" = "/"; do cd ..; done; pwd)
+pkgdir   := $(if $(PKGDIR),$(PKGDIR),$(shell cd $(vboxroot)/..; pwd))
 builddir := $(current)/rpm/builddir
 rpmlib   := $(shell if [ `uname -m` = "x86_64" ]; then echo "lib64"; else echo "lib"; fi)
 arch     := $(shell if [ `uname -m` = "x86_64" ]; then echo "amd64"; else echo "i386"; fi)
@@ -67,6 +75,8 @@ svnrev   :=$(if $(svn_revision),$(svn_revision),)
 NOMODS   ?= $(ose)
 NOQT     ?= $(HEADLESS)
 NOWEBSVC ?= $(ose)
+NODOCS   ?= $(if $(wildcard $(vboxroot)/prebuild/UserManual*.pdf),$(if $(wildcard $(vboxroot)/prebuild/VirtualBox*.chm),1,),)
+STAGEDISO ?= $(if $(wildcard $(vboxroot)/prebuild/VBoxGuestAdditions.iso),$(vboxroot)/prebuild,)
 NOWINE   := $(if $(NODOCS),$(if $(STAGEDISO),1,),)$(ose)
 
 ifneq ($(MAKECMDGOALS),clean)
@@ -76,6 +86,18 @@ ifneq ($(MAKECMDGOALS),clean)
   rpmrel  := $(shell cat /etc/fedora-release | sed -e 's/^Fedora  *release  *\([1-9][0-9]*\) .*/fedora\1/')
  endif
  ifeq ($(rpmrel),)
+ # look for OL
+  rpmrel  := $(shell cat /etc/enterprise-release | sed -ne 's/^Enterprise Linux[a-zA-Z ]*\([1-9][0-9]*\).*/ol\1/p')
+ endif
+ ifeq ($(rpmrel),)
+ # look for CentOS
+  rpmrel  := $(shell cat /etc/redhat-release | sed -ne 's/^CentOS[a-zA-Z ]*\([1-9][0-9]*\).*/centos\1/p')
+ endif
+ ifeq ($(rpmrel),)
+ # look for Red Hat
+  rpmrel  := $(shell cat /etc/redhat-release | sed -ne 's/^Red Hat[a-zA-Z ]*\([1-9][0-9]*\).*/centos\1/p')
+ endif
+ ifeq ($(rpmrel),)
   $(error failed to detect the release type. Add /etc/distname or hack the detection.)
  endif
 
@@ -132,13 +154,12 @@ else
 endif
 
 cfg_flags := $(if $(NOQT),--disable-qt,) \
+	     $(if $(NOSDL),--disable-vboxsdl,) \
 	     $(if $(filter sles10.1,$(rpmrel)),--build-libxml2,) \
-	     $(if $(filter el5 el6 sles10.1 sles11.0 mdv2011.0,$(rpmrel)),--build-libvpx,) \
+	     $(if $(filter el5 ol5 centos5 el6 ol6 centos6 sles10.1 sles11.0 mdv2011.0,$(rpmrel)),--build-libvpx,) \
 	     $(if $(filter el5 ol5 centos5 sles10.1 sles11.0,$(rpmrel)),--build-libcurl,) \
-	     $(if $(filter el5 centos5 sles10.1,$(rpmrel)),--disable-sdl-ttf,) \
-	     $(if $(filter sles10.1,$(rpmrel)),--disable-pulse,) \
-	     $(if $(filter el5 ol5 centos5,$(rpmrel)),--enable-pulse,) \
-	     $(if $(filter el5 ol5 centos5 el6 ol6 centos6 sles10.1 sles11.0,$(rpmrel)),--with-qt4-dir=/home/vbox/Qt-4.8.6-stdc++6-$(arch)) \
+	     $(if $(filter el5 ol5 centos5 sles10.1,$(rpmrel)),--disable-sdl-ttf,) \
+	     $(if $(filter el5 ol5 centos5 sles10.1,$(rpmrel)),--disable-pulse,) \
 	     $(if $(ose),--ose,) $(if $(LINUX),--with-linux=$(LINUX),) \
 	     $(if $(HEADLESS),--build-headless,) \
 	     $(if $(DEBUG),--build-debug,) \
@@ -152,7 +173,7 @@ bld_flags := AUTOCFG=$(current)/rpm/AutoConfig.kmk \
 	     PATH_OUT=$(builddir) \
 	     VBOX_WITHOUT_EXTPACK_PUEL_PACKING=1 \
 	     VBOX_WITHOUT_EXTPACK_VNC_PACKING=1 \
-	     $(if $(filter el5 el6 sles10.1 sles11.0,$(rpmrel)),,VBOX_WITH_VMSVGA3D=1) \
+	     $(if $(filter el5 ol5 centos5 el6 ol6 centos6 sles10.1 sles11.0,$(rpmrel)),,VBOX_WITH_VMSVGA3D=1) \
 	     VBOX_DO_STRIP= \
 	     VBOX_WITH_MULTIVERSION_PYTHON= \
 	     $(doc_dir) \
@@ -227,18 +248,19 @@ binary: rpm/build-stamp
 	    -e 's|%PACKAGE%|virtualbox|g' \
 	    -e "s|%VERSION%|$(VBOX_VERSION_STRING)|g" \
 	    -e "s|%GROUP%|$(if $(VBOX_WITHOUT_HARDENING),vboxusers,root)|g" \
-	    vboxdrv.sh.in > $(archdir)/vboxdrv.init
-	cp vboxballoonctrl-service.sh $(archdir)/vboxballoonctrl-service.init
-	cp vboxautostart-service.sh $(archdir)/vboxautostart-service.init
-	cp vboxweb-service.sh $(archdir)/vboxweb-service.init
+	    vboxdrv.sh.in > $(archdir)/vboxdrv.sh
+	cp vboxballoonctrl-service.sh $(archdir)
+	cp vboxautostart-service.sh $(archdir)
+	cp vboxweb-service.sh $(archdir)
 	cp VBox.sh $(archdir)
 	mv rpm/VirtualBox-$(ver) rpm/$(rpmname)
 	tar -cf rpm/VirtualBox.tar -C rpm $(rpmname)
-	rm -f /usr/src/packages/RPMS/*/VirtualBox*rpm
-	rm -f /usr/src/packages/SPECS/*
-	(cd rpm; rpmbuild -tb --clean VirtualBox.tar)
-	mv /usr/src/packages/RPMS/*/$(verpkg)-debug* $(pkgdir) || true
-	file=`find /usr/src/packages/RPMS -name $(verpkg)*rpm -print`; \
+	rm -f rpmbuild/RPMS/*/VirtualBox*rpm
+	rm -f rpmbuild/SPECS/*
+	mkdir -p rpmbuild/BUILD rpmbuild/RPMS/i386 rpmbuild/RPMS/x86_64 rpmbuild/SOURCES rpmbuild/SPECS rpmbuild/SRPMS
+	(cd rpm; rpmbuild --define '_topdir $(current)/rpmbuild' -tb --clean VirtualBox.tar)
+	mv rpmbuild/RPMS/*/$(verpkg)-debug* $(pkgdir) || true
+	file=`find rpmbuild/RPMS -name $(verpkg)*rpm -print`; \
 	    mv $$file $(pkgdir)
 # Note! if rpmbuild fails: sudo chmod a+rw /usr/src/redhat/* /usr/src/redhat/RPMS/*
 # Note! if find/mv fails:  sudo ln -s redhat/ /usr/src/packages
diff --git a/src/VBox/Installer/linux/run-inst.sh b/src/VBox/Installer/linux/run-inst.sh
index f9def54..b29326e 100755
--- a/src/VBox/Installer/linux/run-inst.sh
+++ b/src/VBox/Installer/linux/run-inst.sh
@@ -177,8 +177,6 @@ EOF
 
 info "$PACKAGE_NAME installer"
 
-check_bzip2
-
 # Check architecture
 cpu=`uname -m`;
 case "$cpu" in
diff --git a/src/VBox/Installer/linux/uninstall.sh b/src/VBox/Installer/linux/uninstall.sh
index 4f0bc08..9c1369a 100755
--- a/src/VBox/Installer/linux/uninstall.sh
+++ b/src/VBox/Installer/linux/uninstall.sh
@@ -47,32 +47,11 @@ if [ "$PREV_INSTALLATION" = "" ]; then
     abort "Couldn't find a VirtualBox installation to uninstall."
 fi
 
-# Stop the ballon control service
-stop_init_script vboxballoonctrl-service
-# Stop the autostart service
-stop_init_script vboxautostart-service
-# Stop the web service
-stop_init_script vboxweb-service
-# Do this check here after we terminated the web service
-check_running
-# Terminate VBoxNetDHCP if running
-terminate_proc VBoxNetDHCP
-# Terminate VBoxNetNAT if running
-terminate_proc VBoxNetNAT
-delrunlevel vboxballoonctrl-service > /dev/null 2>&1
-remove_init_script vboxballoonctrl-service
-delrunlevel vboxautostart-service > /dev/null 2>&1
-remove_init_script vboxautostart-service
-delrunlevel vboxweb-service > /dev/null 2>&1
-remove_init_script vboxweb-service
-# Stop kernel module and uninstall runlevel script
-stop_init_script vboxdrv
-delrunlevel vboxdrv > /dev/null 2>&1
-remove_init_script vboxdrv
-# Stop host networking and uninstall runlevel script (obsolete)
-stop_init_script vboxnet
-delrunlevel vboxnet > /dev/null 2>&1
-remove_init_script vboxnet
+# Do pre-removal common to all installer types, currently service script
+# clean-up.
+test "${BUILD_MODULE}" = true && DO_DKMS="--dkms ${INSTALL_VER}"
+`dirname $0`/prerm-common.sh ${DO_DKMS} || exit 1  # Arguments intentionally not quoted.
+
 # Remove kernel module installed
 if [ -n "$DKMS" ]; then
     $DKMS remove -m vboxhost -v $INSTALL_VER --all > /dev/null 2>&1
@@ -81,6 +60,7 @@ if [ -z "$VBOX_DONT_REMOVE_OLD_MODULES" ]; then
     find /lib/modules/`uname -r` -name "vboxdrv\.*" 2>/dev/null|xargs rm -f 2> /dev/null
     find /lib/modules/`uname -r` -name "vboxnetflt\.*" 2>/dev/null|xargs rm -f 2> /dev/null
     find /lib/modules/`uname -r` -name "vboxnetadp\.*" 2>/dev/null|xargs rm -f 2> /dev/null
+    find /lib/modules/`uname -r` -name "vboxpci\.*" 2>/dev/null|xargs rm -f 2> /dev/null
     # Remove directories we have installed to in the past
     find /lib/modules/`uname -r` -name vbox\* 2>/dev/null|xargs rmdir -p 2> /dev/null
     find /lib/modules/`uname -r` -name misc\* 2>/dev/null|xargs rmdir -p 2> /dev/null
@@ -88,6 +68,7 @@ if [ -z "$VBOX_DONT_REMOVE_OLD_MODULES" ]; then
     rm -f /usr/src/vboxdrv-$INSTALL_VER 2> /dev/null
     rm -f /usr/src/vboxnetflt-$INSTALL_VER 2> /dev/null
     rm -f /usr/src/vboxnetadp-$INSTALL_VER 2> /dev/null
+    rm -f /usr/src/vboxpci-$INSTALL_VER 2> /dev/null
 fi
 
 # Remove symlinks
@@ -153,6 +134,10 @@ if [ -f $PREV_INSTALLATION/src/vboxnetadp/Makefile ]; then
     cd $PREV_INSTALLATION/src/vboxnetadp
     make clean > /dev/null 2>&1
 fi
+if [ -f $PREV_INSTALLATION/src/vboxpci/Makefile ]; then
+    cd $PREV_INSTALLATION/src/vboxpci
+    make clean > /dev/null 2>&1
+fi
 cd $PREV_INSTALLATION
 if [ -r $CONFIG_DIR/$CONFIG_FILES ]; then
     rm -f `cat $CONFIG_DIR/$CONFIG_FILES` 2> /dev/null
diff --git a/src/VBox/Installer/linux/vboxdrv.sh.in b/src/VBox/Installer/linux/vboxdrv.sh.in
index 2b0f3da..27da5c4 100755
--- a/src/VBox/Installer/linux/vboxdrv.sh.in
+++ b/src/VBox/Installer/linux/vboxdrv.sh.in
@@ -172,11 +172,11 @@ start()
     fi
     # ensure the character special exists
     if [ ! -c $DEVICE ]; then
-        MAJOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/devices`
+        MAJOR=`sed -n 's;\([0-9]\+\) vboxdrv$;\1;p' /proc/devices`
         if [ ! -z "$MAJOR" ]; then
             MINOR=0
         else
-            MINOR=`sed -n 's;\([0-9]\+\) vboxdrv;\1;p' /proc/misc`
+            MINOR=`sed -n 's;\([0-9]\+\) vboxdrv$;\1;p' /proc/misc`
             if [ ! -z "$MINOR" ]; then
                 MAJOR=10
             fi
diff --git a/src/VBox/Main/glue/constants-python.xsl b/src/VBox/Main/glue/constants-python.xsl
old mode 100755
new mode 100644
diff --git a/src/VBox/Main/glue/vboxapi.py b/src/VBox/Main/glue/vboxapi.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Main/idl/VirtualBox.xidl b/src/VBox/Main/idl/VirtualBox.xidl
index a004601..30982b7 100644
--- a/src/VBox/Main/idl/VirtualBox.xidl
+++ b/src/VBox/Main/idl/VirtualBox.xidl
@@ -17254,7 +17254,7 @@ Snapshot 1 (B.vdi)            Snapshot 1 (B.vdi)
       <desc>
         Host parallel device name. If this parallel port is enabled, setting a
         @c null or an empty string as this attribute's value will result in
-        an error.
+        the parallel port behaving as if not connected to any device.
       </desc>
     </attribute>
 
diff --git a/src/VBox/Main/include/HostUSBDeviceImpl.h b/src/VBox/Main/include/HostUSBDeviceImpl.h
index 66aa1c2..4af2ec7 100644
--- a/src/VBox/Main/include/HostUSBDeviceImpl.h
+++ b/src/VBox/Main/include/HostUSBDeviceImpl.h
@@ -239,7 +239,7 @@ protected:
     bool i_startTransition (HostUSBDeviceState aNewState, HostUSBDeviceState aFinalState,
                             HostUSBDeviceSubState aNewSubState = kHostUSBDeviceSubState_Default);
     bool i_advanceTransition(bool aSkipReAttach = false);
-    bool i_failTransition();
+    bool i_failTransition(HostUSBDeviceState a_enmStateHint);
     USBDeviceState_T i_canonicalState() const;
 
 private:
diff --git a/src/VBox/Main/include/MachineImpl.h b/src/VBox/Main/include/MachineImpl.h
index 4e82d79..26553c6 100644
--- a/src/VBox/Main/include/MachineImpl.h
+++ b/src/VBox/Main/include/MachineImpl.h
@@ -536,8 +536,8 @@ public:
     void i_copyPathRelativeToMachine(const Utf8Str &strSource, Utf8Str &strTarget);
 
     void i_getLogFolder(Utf8Str &aLogFolder);
-    Utf8Str i_queryLogFilename(ULONG idx);
-    Utf8Str i_getStartupLogFilename(void);
+    Utf8Str i_getLogFilename(ULONG idx);
+    Utf8Str i_getHardeningLogFilename(void);
 
     void i_composeSavedStateFilename(Utf8Str &strStateFilePath);
 
diff --git a/src/VBox/Main/include/NATEngineImpl.h b/src/VBox/Main/include/NATEngineImpl.h
index 975220e..52c1f6c 100644
--- a/src/VBox/Main/include/NATEngineImpl.h
+++ b/src/VBox/Main/include/NATEngineImpl.h
@@ -6,7 +6,7 @@
  */
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -33,8 +33,7 @@ namespace settings
 class ATL_NO_VTABLE NATEngine :
     public NATEngineWrap
 {
-    public:
-    typedef std::map<Utf8Str, settings::NATRule> NATRuleMap;
+public:
 
     DECLARE_EMPTY_CTOR_DTOR(NATEngine)
 
@@ -47,8 +46,9 @@ class ATL_NO_VTABLE NATEngine :
     void uninit();
 
     bool i_isModified();
-    bool i_rollback();
+    void i_rollback();
     void i_commit();
+    void i_copyFrom(NATEngine *aThat);
     HRESULT i_loadSettings(const settings::NAT &data);
     HRESULT i_saveSettings(settings::NAT &data);
 
@@ -102,10 +102,8 @@ private:
 
     struct Data;
     Data *mData;
-    bool m_fModified;
     const ComObjPtr<NATEngine> mPeer;
     Machine * const mParent;
-    NATRuleMap mNATRules;
     INetworkAdapter * const mAdapter;
 };
 #endif
diff --git a/src/VBox/Main/include/NetworkAdapterImpl.h b/src/VBox/Main/include/NetworkAdapterImpl.h
index da75cba..c252e22 100644
--- a/src/VBox/Main/include/NetworkAdapterImpl.h
+++ b/src/VBox/Main/include/NetworkAdapterImpl.h
@@ -6,7 +6,7 @@
  */
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -154,7 +154,6 @@ private:
     const ComObjPtr<NetworkAdapter> mPeer;
     const ComObjPtr<NATEngine> mNATEngine;
 
-    bool                m_fModified;
     Backupable<Data>    mData;
 };
 
diff --git a/src/VBox/Main/include/ParallelPortImpl.h b/src/VBox/Main/include/ParallelPortImpl.h
index b4cc563..be77adc 100644
--- a/src/VBox/Main/include/ParallelPortImpl.h
+++ b/src/VBox/Main/include/ParallelPortImpl.h
@@ -50,6 +50,7 @@ public:
     void i_rollback();
     void i_commit();
     void i_copyFrom(ParallelPort *aThat);
+    void i_applyDefaults();
 
 private:
 
@@ -64,8 +65,6 @@ private:
     HRESULT getPath(com::Utf8Str &aPath);
     HRESULT setPath(const com::Utf8Str &aPath);
 
-    HRESULT i_checkSetPath(const Utf8Str &str);
-
     struct Data;
     Data *m;
 };
diff --git a/src/VBox/Main/include/USBProxyService.h b/src/VBox/Main/include/USBProxyService.h
index 127a7ce..f289d82 100644
--- a/src/VBox/Main/include/USBProxyService.h
+++ b/src/VBox/Main/include/USBProxyService.h
@@ -153,10 +153,8 @@ public:
     HRESULT init(void);
     ~USBProxyServiceDarwin();
 
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     virtual void *insertFilter(PCUSBFILTER aFilter);
     virtual void removeFilter(void *aId);
-#endif
 
     virtual int captureDevice(HostUSBDevice *aDevice);
     virtual void captureDeviceCompleted(HostUSBDevice *aDevice, bool aSuccess);
@@ -182,10 +180,6 @@ private:
     /** A hack to work around the problem with the usb device enumeration
      * not including newly attached devices. */
     bool mWaitABitNextTime;
-#ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-    /** Whether we've got a fake async event and should return without entering the runloop. */
-    bool volatile mFakeAsync;
-#endif
     /** Whether we've successfully initialized the USBLib and should call USBLibTerm in the destructor. */
     bool mUSBLibInitialized;
 };
diff --git a/src/VBox/Main/src-client/ConsoleImpl2.cpp b/src/VBox/Main/src-client/ConsoleImpl2.cpp
index 3498750..ee099d0 100644
--- a/src/VBox/Main/src-client/ConsoleImpl2.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl2.cpp
@@ -2624,6 +2624,9 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
         /*
          * Parallel (LPT) Ports
          */
+        /* parallel enabled mask to be passed to dev ACPI */
+        uint16_t auParallelIoPortBase[SchemaDefs::ParallelPortCount] = {0};
+        uint8_t auParallelIrq[SchemaDefs::ParallelPortCount] = {0};
         InsertConfigNode(pDevices, "parallel", &pDev);
         for (ULONG ulInstance = 0; ulInstance < SchemaDefs::ParallelPortCount; ++ulInstance)
         {
@@ -2643,14 +2646,20 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
             ULONG ulIRQ;
             hrc = parallelPort->COMGETTER(IRQ)(&ulIRQ);                                     H();
             InsertConfigInteger(pCfg, "IRQ", ulIRQ);
+            auParallelIrq[ulInstance] = (uint8_t)ulIRQ;
             ULONG ulIOBase;
             hrc = parallelPort->COMGETTER(IOBase)(&ulIOBase);                               H();
             InsertConfigInteger(pCfg,   "IOBase", ulIOBase);
-            InsertConfigNode(pInst,     "LUN#0", &pLunL0);
-            InsertConfigString(pLunL0,  "Driver", "HostParallel");
-            InsertConfigNode(pLunL0,    "Config", &pLunL1);
+            auParallelIoPortBase[ulInstance] = (uint16_t)ulIOBase;
+
             hrc = parallelPort->COMGETTER(Path)(bstr.asOutParam());                         H();
-            InsertConfigString(pLunL1,  "DevicePath", bstr);
+            if (!bstr.isEmpty())
+            {
+                InsertConfigNode(pInst,     "LUN#0", &pLunL0);
+                InsertConfigString(pLunL0,  "Driver", "HostParallel");
+                InsertConfigNode(pLunL0,    "Config", &pLunL1);
+                InsertConfigString(pLunL1,  "DevicePath", bstr);
+            }
         }
 
         /*
@@ -3075,6 +3084,12 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
             InsertConfigInteger(pCfg,  "Serial1IoPortBase", auSerialIoPortBase[1]);
             InsertConfigInteger(pCfg,  "Serial1Irq", auSerialIrq[1]);
 
+            InsertConfigInteger(pCfg,  "Parallel0IoPortBase", auParallelIoPortBase[0]);
+            InsertConfigInteger(pCfg,  "Parallel0Irq", auParallelIrq[0]);
+
+            InsertConfigInteger(pCfg,  "Parallel1IoPortBase", auParallelIoPortBase[1]);
+            InsertConfigInteger(pCfg,  "Parallel1Irq", auParallelIrq[1]);
+
             InsertConfigNode(pInst,    "LUN#0", &pLunL0);
             InsertConfigString(pLunL0, "Driver",               "ACPIHost");
             InsertConfigNode(pLunL0,   "Config", &pCfg);
diff --git a/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp b/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp
index 142809a..23e3dca 100644
--- a/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp
+++ b/src/VBox/Main/src-server/HostUSBDeviceImpl.cpp
@@ -441,8 +441,7 @@ HRESULT HostUSBDevice::i_requestCaptureForVM(SessionMachine *aMachine, bool aSet
      * when the request succeeds (i.e. asynchronously).
      */
     LogFlowThisFunc(("{%s} capturing the device.\n", mName));
-#if (defined(RT_OS_DARWIN) && defined(VBOX_WITH_NEW_USB_CODE_ON_DARWIN)) /* PORTME */ \
- || defined(RT_OS_WINDOWS) || defined(RT_OS_SOLARIS)
+#if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS) || defined(RT_OS_SOLARIS) /* PORTME */
     i_setState(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_UsedByVM, kHostUSBDeviceSubState_AwaitingDetach);
 #else
     i_setState(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_UsedByVM);
@@ -455,7 +454,7 @@ HRESULT HostUSBDevice::i_requestCaptureForVM(SessionMachine *aMachine, bool aSet
     if (RT_FAILURE(rc))
     {
         alock.acquire();
-        i_failTransition();
+        i_failTransition(kHostUSBDeviceState_Invalid);
         mMachine.setNull();
         if (rc == VERR_SHARING_VIOLATION)
             return setError(E_FAIL,
@@ -704,8 +703,7 @@ HRESULT HostUSBDevice::i_requestReleaseToHost()
     /*
      * Try release it.
      */
-#if (defined(RT_OS_DARWIN) && defined(VBOX_WITH_NEW_USB_CODE_ON_DARWIN)) /* PORTME */ \
- || defined(RT_OS_WINDOWS)
+#if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS) /* PORTME */
     i_startTransition(kHostUSBDeviceState_ReleasingToHost, kHostUSBDeviceState_Unused, kHostUSBDeviceSubState_AwaitingDetach);
 #else
     i_startTransition(kHostUSBDeviceState_ReleasingToHost, kHostUSBDeviceState_Unused);
@@ -715,7 +713,7 @@ HRESULT HostUSBDevice::i_requestReleaseToHost()
     if (RT_FAILURE(rc))
     {
         alock.acquire();
-        i_failTransition();
+        i_failTransition(kHostUSBDeviceState_Invalid);
         return E_FAIL;
     }
     return S_OK;
@@ -758,8 +756,7 @@ HRESULT HostUSBDevice::i_requestHold()
     /*
      * Do the job.
      */
-#if (defined(RT_OS_DARWIN) && defined(VBOX_WITH_NEW_USB_CODE_ON_DARWIN)) /* PORTME */ \
- || defined(RT_OS_WINDOWS)
+#if defined(RT_OS_DARWIN) || defined(RT_OS_WINDOWS) /* PORTME */
     i_startTransition(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_HeldByProxy, kHostUSBDeviceSubState_AwaitingDetach);
 #else
     i_startTransition(kHostUSBDeviceState_Capturing, kHostUSBDeviceState_HeldByProxy);
@@ -769,7 +766,7 @@ HRESULT HostUSBDevice::i_requestHold()
     if (RT_FAILURE(rc))
     {
         alock.acquire();
-        i_failTransition();
+        i_failTransition(kHostUSBDeviceState_Invalid);
         return E_FAIL;
     }
     return S_OK;
@@ -816,7 +813,7 @@ bool HostUSBDevice::i_wasActuallyDetached()
                     if (elapsedNanoseconds > UINT64_C(60000000000)) /* 60 seconds */
                     {
                         LogRel(("USB: Async operation timed out for device %s (state: %s)\n", mName, i_getStateName()));
-                        i_failTransition();
+                        i_failTransition(kHostUSBDeviceState_PhysDetached);
                     }
 #endif
                     return false; /* not physically detached. */
@@ -1198,9 +1195,9 @@ bool HostUSBDevice::i_updateState(PCUSBDEVICE aDev, bool *aRunFilters, SessionMa
 
                     /* Can only mean that we've failed capturing it. */
                     case kHostUSBDeviceState_Capturing:
-                        LogThisFunc(("{%s} capture failed!\n", mName));
+                        LogThisFunc(("{%s} capture failed! (#1)\n", mName));
                         mUSBProxyService->captureDeviceCompleted(this, false /* aSuccess */);
-                        *aRunFilters = i_failTransition();
+                        *aRunFilters = i_failTransition(kHostUSBDeviceState_UsedByHost);
                         mMachine.setNull();
                         break;
 
@@ -1266,9 +1263,9 @@ bool HostUSBDevice::i_updateState(PCUSBDEVICE aDev, bool *aRunFilters, SessionMa
 
                     /* Can only mean that we've failed capturing it. */
                     case kHostUSBDeviceState_Capturing:
-                        LogThisFunc(("{%s} capture failed!\n", mName));
+                        LogThisFunc(("{%s} capture failed! (#2)\n", mName));
                         mUSBProxyService->captureDeviceCompleted(this, false /* aSuccess */);
-                        *aRunFilters = i_failTransition();
+                        *aRunFilters = i_failTransition(kHostUSBDeviceState_Capturable);
                         mMachine.setNull();
                         break;
 
@@ -1334,9 +1331,9 @@ bool HostUSBDevice::i_updateState(PCUSBDEVICE aDev, bool *aRunFilters, SessionMa
                         else
 #endif
                         {
-                            LogThisFunc(("{%s} capture failed!\n", mName));
+                            LogThisFunc(("{%s} capture failed! (#3)\n", mName));
                             mUSBProxyService->captureDeviceCompleted(this, false /* aSuccess */);
-                            *aRunFilters = i_failTransition();
+                            *aRunFilters = i_failTransition(kHostUSBDeviceState_Unused);
                             mMachine.setNull();
                         }
                         break;
@@ -1471,9 +1468,8 @@ bool HostUSBDevice::i_updateState(PCUSBDEVICE aDev, bool *aRunFilters, SessionMa
     else if (   mUniSubState == kHostUSBDeviceSubState_AwaitingDetach
              && i_hasAsyncOperationTimedOut())
     {
-        LogRel(("USB: timeout in %s for {%RTuuid} / {%s}\n",
-                i_getStateName(), mId.raw(), mName));
-        *aRunFilters = i_failTransition();
+        LogRel(("USB: timeout in %s for {%RTuuid} / {%s}\n", i_getStateName(), mId.raw(), mName));
+        *aRunFilters = i_failTransition(kHostUSBDeviceState_Invalid);
         fIsImportant = true;
     }
     else
@@ -2021,7 +2017,7 @@ bool HostUSBDevice::i_setState(HostUSBDeviceState aNewState,
                 case kHostUSBDeviceState_UsedByHost:
                 case kHostUSBDeviceState_Capturable:
                 case kHostUSBDeviceState_Unused:
-                    Assert(aNewState == mPrevUniState);
+                    Assert(aNewState == mPrevUniState); /** @todo This is kind of wrong, see i_failTransition. */
                     Assert(aNewPendingState == kHostUSBDeviceState_Invalid);
                     Assert(aNewSubState == kHostUSBDeviceSubState_Default);
                     break;
@@ -2414,10 +2410,12 @@ bool HostUSBDevice::i_advanceTransition(bool aSkipReAttach /* = false */)
  * A convenience for failing a transitional state.
  *
  * @return true if filters should be applied to the device, false if not.
+ * @param   a_enmStateHint  USB device state hint. kHostUSBDeviceState_Invalid
+ *                          if the caller doesn't have a clue to give.
  *
  * @note    The caller must own the write lock for this object.
  */
-bool HostUSBDevice::i_failTransition()
+bool HostUSBDevice::i_failTransition(HostUSBDeviceState a_enmStateHint)
 {
     AssertReturn(isWriteLockOnCurrentThread(), false);
     HostUSBDeviceSubState enmSub = mUniSubState;
@@ -2443,7 +2441,10 @@ bool HostUSBDevice::i_failTransition()
                     break;
                 case kHostUSBDeviceSubState_AwaitingReAttach:
                     enmSub = kHostUSBDeviceSubState_Default;
-                    enmState = kHostUSBDeviceState_PhysDetached;
+                    if (a_enmStateHint != kHostUSBDeviceState_Invalid)
+                        enmState = mPrevUniState; /** @todo enmState = a_enmStateHint is more correct, but i_setState doesn't like it. It will usually correct itself shortly. */
+                    else
+                        enmState = kHostUSBDeviceState_PhysDetached;
                     break;
                 default:
                     AssertReleaseMsgFailedReturn(("this=%p mUniState=%d\n", this, mUniState), false);
diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp
index 3d634b7..6fe11d2 100644
--- a/src/VBox/Main/src-server/MachineImpl.cpp
+++ b/src/VBox/Main/src-server/MachineImpl.cpp
@@ -353,6 +353,10 @@ HRESULT Machine::init(VirtualBox *aParent,
             for (ULONG slot = 0; slot < RT_ELEMENTS(mSerialPorts); ++slot)
                 mSerialPorts[slot]->i_applyDefaults(aOsType);
 
+            /* Apply parallel port defaults */
+            for (ULONG slot = 0; slot < RT_ELEMENTS(mParallelPorts); ++slot)
+                mParallelPorts[slot]->i_applyDefaults();
+
             /* Let the OS type select 64-bit ness. */
             mHWData->mLongMode = aOsType->i_is64Bit()
                                ? settings::Hardware::LongMode_Enabled : settings::Hardware::LongMode_Disabled;
@@ -5338,8 +5342,9 @@ void Machine::i_deleteConfigHandler(DeleteConfigTask &task)
                     RTFileDelete(log.c_str());
                 }
 #if defined(RT_OS_WINDOWS)
-                log = Utf8StrFmt("%s%cVBoxStartup.log",
-                                 logFolder.c_str(), RTPATH_DELIMITER);
+                log = Utf8StrFmt("%s%cVBoxStartup.log", logFolder.c_str(), RTPATH_DELIMITER);
+                RTFileDelete(log.c_str());
+                log = Utf8StrFmt("%s%cVBoxHardening.log", logFolder.c_str(), RTPATH_DELIMITER);
                 RTFileDelete(log.c_str());
 #endif
 
@@ -6586,7 +6591,7 @@ HRESULT Machine::queryLogFilename(ULONG aIdx, com::Utf8Str &aFilename)
 {
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    Utf8Str log = i_queryLogFilename(aIdx);
+    Utf8Str log = i_getLogFilename(aIdx);
     if (!RTFileExists(log.c_str()))
         log.setNull();
     aFilename = log;
@@ -6602,7 +6607,7 @@ HRESULT Machine::readLog(ULONG aIdx, LONG64 aOffset, LONG64 aSize, std::vector<B
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
 
     HRESULT rc = S_OK;
-    Utf8Str log = i_queryLogFilename(aIdx);
+    Utf8Str log = i_getLogFilename(aIdx);
 
     /* do not unnecessarily hold the lock while doing something which does
      * not need the lock and potentially takes a long time. */
@@ -7284,31 +7289,36 @@ void Machine::i_getLogFolder(Utf8Str &aLogFolder)
 /**
  *  Returns the full path to the machine's log file for an given index.
  */
-Utf8Str Machine::i_queryLogFilename(ULONG idx) /** @todo r=bird: Misnamed. Should be i_getLogFilename as it cannot fail.
-                                                   See VBox-CodingGuidelines.cpp, Compulsory seciont, line 79. */
+Utf8Str Machine::i_getLogFilename(ULONG idx)
 {
     Utf8Str logFolder;
     getLogFolder(logFolder);
     Assert(logFolder.length());
+
     Utf8Str log;
     if (idx == 0)
-        log = Utf8StrFmt("%s%cVBox.log",
-                         logFolder.c_str(), RTPATH_DELIMITER);
+        log = Utf8StrFmt("%s%cVBox.log", logFolder.c_str(), RTPATH_DELIMITER);
+#if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_HARDENING)
+    else if (idx == 1)
+        log = Utf8StrFmt("%s%cVBoxHardening.log", logFolder.c_str(), RTPATH_DELIMITER);
     else
-        log = Utf8StrFmt("%s%cVBox.log.%d",
-                         logFolder.c_str(), RTPATH_DELIMITER, idx);
+        log = Utf8StrFmt("%s%cVBox.log.%u", logFolder.c_str(), RTPATH_DELIMITER, idx - 1);
+#else
+    else
+        log = Utf8StrFmt("%s%cVBox.log.%u", logFolder.c_str(), RTPATH_DELIMITER, idx);
+#endif
     return log;
 }
 
 /**
- * Returns the full path to the machine's (hardened) startup log file.
+ * Returns the full path to the machine's hardened log file.
  */
-Utf8Str Machine::i_getStartupLogFilename(void)
+Utf8Str Machine::i_getHardeningLogFilename(void)
 {
     Utf8Str strFilename;
     getLogFolder(strFilename);
     Assert(strFilename.length());
-    strFilename.append(RTPATH_SLASH_STR "VBoxStartup.log");
+    strFilename.append(RTPATH_SLASH_STR "VBoxHardening.log");
     return strFilename;
 }
 
@@ -7494,24 +7504,30 @@ HRESULT Machine::i_launchVMProcess(IInternalSessionControl *aControl,
             RTStrFree(newEnvStr);
     }
 
-    /* Hardened startup logging */
+    /* Hardening logging */
 #if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_HARDENING)
-    Utf8Str strSupStartLogArg("--sup-startup-log=");
+    Utf8Str strSupHardeningLogArg("--sup-hardening-log=");
     {
-        Utf8Str strStartupLogFile = i_getStartupLogFilename();
-        int vrc2 = RTFileDelete(strStartupLogFile.c_str());
+        Utf8Str strHardeningLogFile = i_getHardeningLogFilename();
+        int vrc2 = RTFileDelete(strHardeningLogFile.c_str());
         if (vrc2 == VERR_PATH_NOT_FOUND || vrc2 == VERR_FILE_NOT_FOUND)
         {
-            Utf8Str strStartupLogDir = strStartupLogFile;
+            Utf8Str strStartupLogDir = strHardeningLogFile;
             strStartupLogDir.stripFilename();
             RTDirCreateFullPath(strStartupLogDir.c_str(), 0755); /** @todo add a variant for creating the path to a
                                                                      file without stripping the file. */
         }
-        strSupStartLogArg.append(strStartupLogFile);
+        strSupHardeningLogArg.append(strHardeningLogFile);
+
+        /* Remove legacy log filename to avoid confusion. */
+        Utf8Str strOldStartupLogFile;
+        getLogFolder(strOldStartupLogFile);
+        strOldStartupLogFile.append(RTPATH_SLASH_STR "VBoxStartup.log");
+        RTFileDelete(strOldStartupLogFile.c_str());
     }
-    const char *pszSupStartupLogArg = strSupStartLogArg.c_str();
+    const char *pszSupHardeningLogArg = strSupHardeningLogArg.c_str();
 #else
-    const char *pszSupStartupLogArg = NULL;
+    const char *pszSupHardeningLogArg = NULL;
 #endif
 
     Utf8Str strCanonicalName;
@@ -7575,7 +7591,7 @@ HRESULT Machine::i_launchVMProcess(IInternalSessionControl *aControl,
         unsigned iArg = 6;
         if (fSeparate)
             apszArgs[iArg++] = "--separate";
-        apszArgs[iArg++] = pszSupStartupLogArg;
+        apszArgs[iArg++] = pszSupHardeningLogArg;
 
         vrc = RTProcCreate(szPath, apszArgs, env, 0, &pid);
     }
@@ -7610,7 +7626,7 @@ HRESULT Machine::i_launchVMProcess(IInternalSessionControl *aControl,
         unsigned iArg = 5;
         if (fSeparate)
             apszArgs[iArg++] = "--separate";
-        apszArgs[iArg++] = pszSupStartupLogArg;
+        apszArgs[iArg++] = pszSupHardeningLogArg;
 
         vrc = RTProcCreate(szPath, apszArgs, env, 0, &pid);
     }
@@ -7653,7 +7669,7 @@ HRESULT Machine::i_launchVMProcess(IInternalSessionControl *aControl,
         unsigned iArg = 7;
         if (!strFrontend.compare("capture", Utf8Str::CaseInsensitive))
             apszArgs[iArg++] = "--capture";
-        apszArgs[iArg++] = pszSupStartupLogArg;
+        apszArgs[iArg++] = pszSupHardeningLogArg;
 
 # ifdef RT_OS_WINDOWS
         vrc = RTProcCreate(szPath, apszArgs, env, RTPROC_FLAGS_NO_WINDOW, &pid);
@@ -7856,11 +7872,11 @@ bool Machine::i_checkForSpawnFailure()
         /* If the startup logfile exists and is of non-zero length, tell the
            user to look there for more details to encourage them to attach it
            when reporting startup issues. */
-        Utf8Str strStartupLogFile = i_getStartupLogFilename();
+        Utf8Str strHardeningLogFile = i_getHardeningLogFilename();
         uint64_t cbStartupLogFile = 0;
-        int vrc2 = RTFileQuerySize(strStartupLogFile.c_str(), &cbStartupLogFile);
+        int vrc2 = RTFileQuerySize(strHardeningLogFile.c_str(), &cbStartupLogFile);
         if (RT_SUCCESS(vrc2) && cbStartupLogFile > 0)
-            strExtraInfo.append(Utf8StrFmt(tr(".  More details may be available in '%s'"), strStartupLogFile.c_str()));
+            strExtraInfo.append(Utf8StrFmt(tr(".  More details may be available in '%s'"), strHardeningLogFile.c_str()));
 #endif
 
         if (RT_SUCCESS(vrc) && status.enmReason == RTPROCEXITREASON_NORMAL)
diff --git a/src/VBox/Main/src-server/NATEngineImpl.cpp b/src/VBox/Main/src-server/NATEngineImpl.cpp
index 8fd272f..46a7eb8 100644
--- a/src/VBox/Main/src-server/NATEngineImpl.cpp
+++ b/src/VBox/Main/src-server/NATEngineImpl.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2010-2014 Oracle Corporation
+ * Copyright (C) 2010-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,6 +28,8 @@
 #include <VBox/settings.h>
 #include <VBox/com/array.h>
 
+typedef std::map<Utf8Str, settings::NATRule> NATRuleMap;
+
 struct NATEngineData
 {
     NATEngineData() : mMtu(0),
@@ -58,6 +60,8 @@ struct NATEngineData
     BOOL mDNSUseHostResolver;
     /* Alias service */
     ULONG mAliasMode;
+    /* Port forwarding rules */
+    NATRuleMap mNATRules;
 };
 
 struct NATEngine::Data
@@ -89,7 +93,6 @@ HRESULT NATEngine::init(Machine *aParent, INetworkAdapter *aAdapter)
     AutoInitSpan autoInitSpan(this);
     AssertReturn(autoInitSpan.isOk(), E_FAIL);
     autoInitSpan.setSucceeded();
-    m_fModified = false;
     mData = new Data();
     mData->m.allocate();
     mData->m->mNetwork.setNull();
@@ -112,12 +115,6 @@ HRESULT NATEngine::init(Machine *aParent, INetworkAdapter *aAdapter, NATEngine *
 
     mData = new Data();
     mData->m.share(aThat->mData->m);
-    NATRuleMap::iterator it;
-    mNATRules.clear();
-    for (it = aThat->mNATRules.begin(); it != aThat->mNATRules.end(); ++it)
-    {
-        mNATRules.insert(std::make_pair(it->first, it->second));
-    }
     unconst(mParent) = aParent;
     unconst(mAdapter) = aAdapter;
     unconst(mPeer) = aThat;
@@ -139,12 +136,6 @@ HRESULT NATEngine::initCopy(Machine *aParent, INetworkAdapter *aAdapter, NATEngi
 
     mData = new Data();
     mData->m.attachCopy(aThat->mData->m);
-    NATRuleMap::iterator it;
-    mNATRules.clear();
-    for (it = aThat->mNATRules.begin(); it != aThat->mNATRules.end(); ++it)
-    {
-        mNATRules.insert(std::make_pair(it->first, it->second));
-    }
     unconst(mAdapter) = aAdapter;
     unconst(mParent) = aParent;
     autoInitSpan.setSucceeded();
@@ -158,7 +149,6 @@ void NATEngine::uninit()
     if (autoUninitSpan.uninitDone())
         return;
 
-    mNATRules.clear();
     mData->m.free();
     delete mData;
     mData = NULL;
@@ -168,27 +158,19 @@ void NATEngine::uninit()
 
 bool NATEngine::i_isModified()
 {
-    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-    bool fModified = m_fModified;
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+    bool fModified = mData->m.isBackedUp();
     return fModified;
 }
 
-bool NATEngine::i_rollback()
+void NATEngine::i_rollback()
 {
     AutoCaller autoCaller(this);
-    AssertComRCReturn(autoCaller.rc(), false);
+    AssertComRCReturnVoid(autoCaller.rc());
 
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-    bool fChanged = m_fModified;
 
-    if (m_fModified)
-    {
-        /* we need to check all data to see whether anything will be changed
-         * after rollback */
-        mData->m.rollback();
-    }
-    m_fModified = false;
-    return fChanged;
+    mData->m.rollback();
 }
 
 void NATEngine::i_commit()
@@ -203,21 +185,33 @@ void NATEngine::i_commit()
     /* lock both for writing since we modify both (mPeer is "master" so locked
      * first) */
     AutoMultiWriteLock2 alock(mPeer, this COMMA_LOCKVAL_SRC_POS);
-    if (m_fModified)
+    if (mData->m.isBackedUp())
     {
         mData->m.commit();
         if (mPeer)
-        {
             mPeer->mData->m.attach(mData->m);
-            mPeer->mNATRules.clear();
-            NATRuleMap::iterator it;
-            for (it = mNATRules.begin(); it != mNATRules.end(); ++it)
-            {
-                mPeer->mNATRules.insert(std::make_pair(it->first, it->second));
-            }
-        }
     }
-    m_fModified = false;
+}
+
+void NATEngine::i_copyFrom(NATEngine *aThat)
+{
+    AssertReturnVoid(aThat != NULL);
+
+    /* sanity */
+    AutoCaller autoCaller(this);
+    AssertComRCReturnVoid(autoCaller.rc());
+
+    /* sanity too */
+    AutoCaller thatCaller(aThat);
+    AssertComRCReturnVoid(thatCaller.rc());
+
+    /* peer is not modified, lock it for reading (aThat is "master" so locked
+     * first) */
+    AutoReadLock rl(aThat COMMA_LOCKVAL_SRC_POS);
+    AutoWriteLock wl(this COMMA_LOCKVAL_SRC_POS);
+
+    /* this will back up current data */
+    mData->m.assignCopy(aThat->mData->m);
 }
 
 HRESULT NATEngine::getNetworkSettings(ULONG *aMtu, ULONG *aSockSnd, ULONG *aSockRcv, ULONG *aTcpWndSnd, ULONG *aTcpWndRcv)
@@ -244,7 +238,7 @@ HRESULT NATEngine::setNetworkSettings(ULONG aMtu, ULONG aSockSnd, ULONG aSockRcv
         || aTcpWndSnd || aTcpWndRcv)
     {
         mData->m.backup();
-        m_fModified = true;
+        mParent->i_setModified(Machine::IsModified_NetworkAdapters);
     }
     if (aMtu)
         mData->m->mMtu = aMtu;
@@ -257,8 +251,6 @@ HRESULT NATEngine::setNetworkSettings(ULONG aMtu, ULONG aSockSnd, ULONG aSockRcv
     if (aTcpWndRcv)
         mData->m->mTcpRcv = aTcpWndRcv;
 
-    if (m_fModified)
-        mParent->i_setModified(Machine::IsModified_NetworkAdapters);
     return S_OK;
 }
 
@@ -267,10 +259,10 @@ HRESULT NATEngine::getRedirects(std::vector<com::Utf8Str> &aRedirects)
 {
     AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    aRedirects.resize(mNATRules.size());
+    aRedirects.resize(mData->m->mNATRules.size());
     size_t i = 0;
     NATRuleMap::const_iterator it;
-    for (it = mNATRules.begin(); it != mNATRules.end(); ++it, ++i)
+    for (it = mData->m->mNATRules.begin(); it != mData->m->mNATRules.end(); ++it, ++i)
     {
         settings::NATRule r = it->second;
         aRedirects[i] = Utf8StrFmt("%s,%d,%s,%d,%s,%d",
@@ -306,7 +298,7 @@ HRESULT NATEngine::addRedirect(const com::Utf8Str &aName, NATProtocol_T aProto,
         name = Utf8StrFmt("%s_%d_%d", proto, aHostPort, aGuestPort);
 
     NATRuleMap::iterator it;
-    for (it = mNATRules.begin(); it != mNATRules.end(); ++it)
+    for (it = mData->m->mNATRules.begin(); it != mData->m->mNATRules.end(); ++it)
     {
         r = it->second;
         if (it->first == name)
@@ -319,15 +311,15 @@ HRESULT NATEngine::addRedirect(const com::Utf8Str &aName, NATProtocol_T aProto,
                             tr("A NAT rule for this host port and this host IP already exists"));
     }
 
+    mData->m.backup();
     r.strName = name.c_str();
     r.proto = aProto;
     r.strHostIP = aHostIP;
     r.u16HostPort = aHostPort;
     r.strGuestIP = aGuestIP;
     r.u16GuestPort = aGuestPort;
-    mNATRules.insert(std::make_pair(name, r));
+    mData->m->mNATRules.insert(std::make_pair(name, r));
     mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-    m_fModified = true;
 
     ULONG ulSlot;
     mAdapter->COMGETTER(Slot)(&ulSlot);
@@ -341,10 +333,15 @@ HRESULT NATEngine::addRedirect(const com::Utf8Str &aName, NATProtocol_T aProto,
 HRESULT NATEngine::removeRedirect(const com::Utf8Str &aName)
 {
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-    NATRuleMap::iterator it = mNATRules.find(aName);
-    if (it == mNATRules.end())
+    NATRuleMap::iterator it = mData->m->mNATRules.find(aName);
+    if (it == mData->m->mNATRules.end())
         return E_INVALIDARG;
     mData->m.backup();
+    /*
+     * NB: "it" may now point to the backup!  In that case it's ok to
+     * get data from the backup copy of mNATRules via it, but we can't
+     * erase(it) from potentially new mNATRules.
+     */
     settings::NATRule r = it->second;
     Utf8Str strHostIP = r.strHostIP;
     Utf8Str strGuestIP = r.strGuestIP;
@@ -354,10 +351,8 @@ HRESULT NATEngine::removeRedirect(const com::Utf8Str &aName)
     ULONG ulSlot;
     mAdapter->COMGETTER(Slot)(&ulSlot);
 
-    mNATRules.erase(it);
+    mData->m->mNATRules.erase(aName); /* NB: erase by key, "it" may not be valid */
     mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-    m_fModified = true;
-    mData->m.commit();
     alock.release();
     mParent->i_onNATRedirectRuleChange(ulSlot, TRUE, Bstr(aName).raw(), proto, Bstr(strHostIP).raw(),
                                        u16HostPort, Bstr(strGuestIP).raw(), u16GuestPort);
@@ -390,13 +385,12 @@ HRESULT NATEngine::i_loadSettings(const settings::NAT &data)
     mData->m->mAliasMode |= (data.fAliasLog          ? NATAliasMode_AliasLog          : 0);
     mData->m->mAliasMode |= (data.fAliasProxyOnly    ? NATAliasMode_AliasProxyOnly    : 0);
     /* port forwarding */
-    mNATRules.clear();
+    mData->m->mNATRules.clear();
     for (settings::NATRuleList::const_iterator it = data.llRules.begin();
         it != data.llRules.end(); ++it)
     {
-        mNATRules.insert(std::make_pair(it->strName, *it));
+        mData->m->mNATRules.insert(std::make_pair(it->strName, *it));
     }
-    m_fModified = false;
     return rc;
 }
 
@@ -428,10 +422,9 @@ HRESULT NATEngine::i_saveSettings(settings::NAT &data)
     data.fAliasProxyOnly = !!(mData->m->mAliasMode & NATAliasMode_AliasProxyOnly);
     data.fAliasUseSamePorts = !!(mData->m->mAliasMode & NATAliasMode_AliasUseSamePorts);
 
-    for (NATRuleMap::iterator it = mNATRules.begin();
-        it != mNATRules.end(); ++it)
+    for (NATRuleMap::iterator it = mData->m->mNATRules.begin();
+        it != mData->m->mNATRules.end(); ++it)
         data.llRules.push_back(it->second);
-    m_fModified = false;
     return rc;
 }
 
@@ -443,7 +436,6 @@ HRESULT NATEngine::setNetwork(const com::Utf8Str &aNetwork)
         mData->m.backup();
         mData->m->mNetwork = aNetwork;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -468,7 +460,6 @@ HRESULT NATEngine::setHostIP(const com::Utf8Str &aHostIP)
         mData->m.backup();
         mData->m->mBindIP = aHostIP;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -490,7 +481,6 @@ HRESULT NATEngine::setTFTPPrefix(const com::Utf8Str &aTFTPPrefix)
         mData->m.backup();
         mData->m->mTFTPPrefix = aTFTPPrefix;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -516,7 +506,6 @@ HRESULT NATEngine::setTFTPBootFile(const com::Utf8Str &aTFTPBootFile)
         mData->m.backup();
         mData->m->mTFTPBootFile = aTFTPBootFile;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -542,7 +531,6 @@ HRESULT NATEngine::setTFTPNextServer(const com::Utf8Str &aTFTPNextServer)
         mData->m.backup();
         mData->m->mTFTPNextServer = aTFTPNextServer;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -568,7 +556,6 @@ HRESULT NATEngine::setDNSPassDomain(BOOL aDNSPassDomain)
         mData->m.backup();
         mData->m->mDNSPassDomain = aDNSPassDomain;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -590,7 +577,6 @@ HRESULT NATEngine::setDNSProxy(BOOL aDNSProxy)
         mData->m.backup();
         mData->m->mDNSProxy = aDNSProxy;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -618,7 +604,6 @@ HRESULT NATEngine::setDNSUseHostResolver(BOOL aDNSUseHostResolver)
         mData->m.backup();
         mData->m->mDNSUseHostResolver = aDNSUseHostResolver;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
@@ -632,7 +617,6 @@ HRESULT NATEngine::setAliasMode(ULONG aAliasMode)
         mData->m.backup();
         mData->m->mAliasMode = aAliasMode;
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
-        m_fModified = true;
     }
     return S_OK;
 }
diff --git a/src/VBox/Main/src-server/NetworkAdapterImpl.cpp b/src/VBox/Main/src-server/NetworkAdapterImpl.cpp
index 6f7c3ae..5c9702d 100644
--- a/src/VBox/Main/src-server/NetworkAdapterImpl.cpp
+++ b/src/VBox/Main/src-server/NetworkAdapterImpl.cpp
@@ -81,8 +81,6 @@ HRESULT NetworkAdapter::init(Machine *aParent, ULONG aSlot)
     mNATEngine->init(aParent, this);
     /* mPeer is left null */
 
-    m_fModified = false;
-
     mData.allocate();
 
     /* initialize data */
@@ -128,6 +126,8 @@ HRESULT NetworkAdapter::init(Machine *aParent, NetworkAdapter *aThat, bool aResh
     AssertReturn(autoInitSpan.isOk(), E_FAIL);
 
     unconst(mParent) = aParent;
+    /* mPeer is left null */
+
     unconst(mNATEngine).createObject();
     mNATEngine->init(aParent, this, aThat->mNATEngine);
 
@@ -179,6 +179,7 @@ HRESULT NetworkAdapter::initCopy(Machine *aParent, NetworkAdapter *aThat)
     unconst(mNATEngine).createObject();
     mNATEngine->initCopy(aParent, this, aThat->mNATEngine);
 
+    /* sanity */
     AutoCaller thatCaller(aThat);
     AssertComRCReturnRC(thatCaller.rc());
 
@@ -255,7 +256,6 @@ HRESULT NetworkAdapter::setAdapterType(NetworkAdapterType_T aAdapterType)
         mData.backup();
         mData->mAdapterType = aAdapterType;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -303,7 +303,6 @@ HRESULT NetworkAdapter::setEnabled(BOOL aEnabled)
         mData.backup();
         mData->mEnabled = aEnabled;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -393,11 +392,9 @@ HRESULT NetworkAdapter::setMACAddress(const com::Utf8Str &aMACAddress)
     HRESULT rc = i_updateMacAddress(aMACAddress);
     if (SUCCEEDED(rc))
     {
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
-
         AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);       // mParent is const, no need to lock
         mParent->i_setModified(Machine::IsModified_NetworkAdapters);
         mlock.release();
@@ -448,7 +445,6 @@ HRESULT NetworkAdapter::setAttachmentType(NetworkAttachmentType_T aAttachmentTyp
         NetworkAttachmentType_T oldAttachmentType = mData->mAttachmentType;
         mData->mAttachmentType = aAttachmentType;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -500,7 +496,6 @@ HRESULT NetworkAdapter::setBridgedInterface(const com::Utf8Str &aBridgedInterfac
         mData.backup();
         mData->mBridgedInterface = aBridgedInterface;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -548,8 +543,6 @@ HRESULT NetworkAdapter::setHostOnlyInterface(const com::Utf8Str &aHostOnlyInterf
         mData.backup();
         mData->mHostOnlyInterface = aHostOnlyInterface;
 
-        m_fModified = true;
-
         // leave the lock before informing callbacks
         alock.release();
 
@@ -596,7 +589,6 @@ HRESULT NetworkAdapter::setInternalNetwork(const com::Utf8Str &aInternalNetwork)
         mData.backup();
         mData->mInternalNetwork = aInternalNetwork;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -645,7 +637,6 @@ HRESULT NetworkAdapter::setNATNetwork(const com::Utf8Str &aNATNetwork)
         Bstr oldNatNetworkName = mData->mNATNetwork;
         mData->mNATNetwork = aNATNetwork;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -719,7 +710,6 @@ HRESULT NetworkAdapter::setCableConnected(BOOL aConnected)
         mData.backup();
         mData->mCableConnected = aConnected;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -757,7 +747,6 @@ HRESULT NetworkAdapter::setLineSpeed(ULONG aSpeed)
         mData.backup();
         mData->mLineSpeed = aSpeed;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -807,7 +796,6 @@ HRESULT NetworkAdapter::setPromiscModePolicy(NetworkAdapterPromiscModePolicy_T a
         {
             mData.backup();
             mData->mPromiscModePolicy = aPromiscModePolicy;
-            m_fModified = true;
 
             alock.release();
             mParent->i_setModifiedLock(Machine::IsModified_NetworkAdapters);
@@ -842,7 +830,6 @@ HRESULT NetworkAdapter::setTraceEnabled(BOOL aEnabled)
         mData.backup();
         mData->mTraceEnabled = aEnabled;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -880,7 +867,6 @@ HRESULT NetworkAdapter::setTraceFile(const com::Utf8Str &aTraceFile)
         mData.backup();
         mData->mTraceFile = aTraceFile;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -926,7 +912,6 @@ HRESULT NetworkAdapter::setBootPriority(ULONG aBootPriority)
         mData.backup();
         mData->mBootPriority = aBootPriority;
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
@@ -1092,9 +1077,6 @@ HRESULT NetworkAdapter::i_loadSettings(BandwidthControl *bwctl,
     rc = COMSETTER(AttachmentType)(data.mode);
     if (FAILED(rc)) return rc;
 
-    // after loading settings, we are no longer different from the XML on disk
-    m_fModified = false;
-
     return S_OK;
 }
 
@@ -1133,7 +1115,6 @@ HRESULT NetworkAdapter::i_saveSettings(settings::NetworkAdapter &data)
 
     data.mode = mData->mAttachmentType;
 
-    mNATEngine->i_commit();
     mNATEngine->i_saveSettings(data.nat);
 
     data.strBridgedName = mData->mBridgedInterface;
@@ -1147,9 +1128,6 @@ HRESULT NetworkAdapter::i_saveSettings(settings::NetworkAdapter &data)
 
     data.strNATNetworkName = mData->mNATNetwork;
 
-    // after saving settings, we are no longer different from the XML on disk
-    m_fModified = false;
-
     return S_OK;
 }
 
@@ -1161,7 +1139,7 @@ bool NetworkAdapter::i_isModified() {
 
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    bool fChanged = m_fModified;
+    bool fChanged = mData.isBackedUp();
     fChanged |= (mData->mAdapterType == NetworkAttachmentType_NAT? mNATEngine->i_isModified() : false);
     return fChanged;
 }
@@ -1177,6 +1155,8 @@ void NetworkAdapter::i_rollback()
 
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
 
+    mNATEngine->i_rollback();
+
     mData.rollback();
 }
 
@@ -1198,6 +1178,8 @@ void NetworkAdapter::i_commit()
      * first) */
     AutoMultiWriteLock2 alock(mPeer, this COMMA_LOCKVAL_SRC_POS);
 
+    mNATEngine->i_commit();
+
     if (mData.isBackedUp())
     {
         mData.commit();
@@ -1225,6 +1207,8 @@ void NetworkAdapter::i_copyFrom(NetworkAdapter *aThat)
     AutoCaller thatCaller(aThat);
     AssertComRCReturnVoid(thatCaller.rc());
 
+    mNATEngine->i_copyFrom(aThat->mNATEngine);
+
     /* peer is not modified, lock it for reading (aThat is "master" so locked
      * first) */
     AutoReadLock rl(aThat COMMA_LOCKVAL_SRC_POS);
@@ -1344,7 +1328,6 @@ HRESULT NetworkAdapter::setBandwidthGroup(const ComPtr<IBandwidthGroup> &aBandwi
 
         i_updateBandwidthGroup(pBwGroup);
 
-        m_fModified = true;
         // leave the lock before informing callbacks
         alock.release();
 
diff --git a/src/VBox/Main/src-server/ParallelPortImpl.cpp b/src/VBox/Main/src-server/ParallelPortImpl.cpp
index 3b2a1ef..e5c66c4 100644
--- a/src/VBox/Main/src-server/ParallelPortImpl.cpp
+++ b/src/VBox/Main/src-server/ParallelPortImpl.cpp
@@ -214,12 +214,6 @@ HRESULT ParallelPort::setEnabled(BOOL aEnabled)
 
     if (m->bd->fEnabled != !!aEnabled)
     {
-        if (aEnabled &&
-            m->bd->strPath.isEmpty())
-            return setError(E_INVALIDARG,
-                            tr("Cannot enable the parallel port %d because the port path is empty or null"),
-                            m->bd->ulSlot);
-
         m->bd.backup();
         m->bd->fEnabled = !!aEnabled;
 
@@ -351,9 +345,6 @@ HRESULT ParallelPort::setPath(const com::Utf8Str &aPath)
 
     if (aPath != m->bd->strPath)
     {
-        HRESULT rc = i_checkSetPath(aPath);
-        if (FAILED(rc)) return rc;
-
         m->bd.backup();
         m->bd->strPath = aPath;
 
@@ -497,22 +488,33 @@ void ParallelPort::i_copyFrom(ParallelPort *aThat)
 }
 
 /**
- *  Validates COMSETTER(Path) arguments.
+ * Applies the defaults for the given parallel port.
  */
-HRESULT ParallelPort::i_checkSetPath(const Utf8Str &str)
+void ParallelPort::i_applyDefaults()
 {
-    AssertReturn(isWriteLockOnCurrentThread(), E_FAIL);
+    /* sanity */
+    AutoCaller autoCaller(this);
+    AssertComRCReturnVoid (autoCaller.rc());
 
-    if (    m->bd->fEnabled
-         && str.isEmpty()
-       )
-        return setError(E_INVALIDARG,
-                        tr("Path of the parallel port %d may not be empty or null "
-                           "when the port is enabled"),
-                        m->bd->ulSlot);
+    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
 
-    return S_OK;
+    /* Set some more defaults based on the slot. */
+    switch (m->bd->ulSlot)
+    {
+        case 0:
+        {
+            m->bd->ulIOBase = 0x378;
+            m->bd->ulIRQ = 7;
+            break;
+        }
+        case 1:
+        {
+            m->bd->ulIOBase = 0x278;
+            m->bd->ulIRQ = 5;
+            break;
+        }
+        default: break;
+    }
 }
 
-
 /* vi: set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/src/VBox/Main/src-server/USBProxyService.cpp b/src/VBox/Main/src-server/USBProxyService.cpp
index 84de980..95cccd2 100644
--- a/src/VBox/Main/src-server/USBProxyService.cpp
+++ b/src/VBox/Main/src-server/USBProxyService.cpp
@@ -1220,8 +1220,8 @@ USBProxyService::initFilterFromDevice(PUSBFILTER aFilter, HostUSBDevice *aDevice
     vrc = USBFilterSetNumExact(aFilter, USBFILTERIDX_DEVICE_CLASS,      pDev->bDeviceClass,     true); AssertRC(vrc);
     vrc = USBFilterSetNumExact(aFilter, USBFILTERIDX_DEVICE_SUB_CLASS,  pDev->bDeviceSubClass,  true); AssertRC(vrc);
     vrc = USBFilterSetNumExact(aFilter, USBFILTERIDX_DEVICE_PROTOCOL,   pDev->bDeviceProtocol,  true); AssertRC(vrc);
-    vrc = USBFilterSetNumExact(aFilter, USBFILTERIDX_PORT,              pDev->bPort,            true); AssertRC(vrc);
-    vrc = USBFilterSetNumExact(aFilter, USBFILTERIDX_BUS,               pDev->bBus,             true); AssertRC(vrc);
+    vrc = USBFilterSetNumExact(aFilter, USBFILTERIDX_PORT,              pDev->bPort,            false); AssertRC(vrc);
+    vrc = USBFilterSetNumExact(aFilter, USBFILTERIDX_BUS,               pDev->bBus,             false); AssertRC(vrc);
     if (pDev->pszSerialNumber)
     {
         vrc = USBFilterSetStringExact(aFilter, USBFILTERIDX_SERIAL_NUMBER_STR, pDev->pszSerialNumber, true);
diff --git a/src/VBox/Main/src-server/darwin/USBProxyServiceDarwin.cpp b/src/VBox/Main/src-server/darwin/USBProxyServiceDarwin.cpp
index df16a5e..9f33ba0 100644
--- a/src/VBox/Main/src-server/darwin/USBProxyServiceDarwin.cpp
+++ b/src/VBox/Main/src-server/darwin/USBProxyServiceDarwin.cpp
@@ -52,7 +52,6 @@ USBProxyServiceDarwin::USBProxyServiceDarwin(Host *aHost)
  */
 HRESULT USBProxyServiceDarwin::init(void)
 {
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     /*
      * Initialize the USB library.
      */
@@ -63,7 +62,6 @@ HRESULT USBProxyServiceDarwin::init(void)
         return S_OK;
     }
     mUSBLibInitialized = true;
-#endif
 
     /*
      * Start the poller thread.
@@ -86,7 +84,6 @@ USBProxyServiceDarwin::~USBProxyServiceDarwin()
     if (isActive())
         stop();
 
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     /*
      * Terminate the USB library - it'll
      */
@@ -95,11 +92,9 @@ USBProxyServiceDarwin::~USBProxyServiceDarwin()
         USBLibTerm();
         mUSBLibInitialized = false;
     }
-#endif
 }
 
 
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
 void *USBProxyServiceDarwin::insertFilter(PCUSBFILTER aFilter)
 {
     return USBLibAddFilter(aFilter);
@@ -110,7 +105,6 @@ void USBProxyServiceDarwin::removeFilter(void *aId)
 {
     USBLibRemoveFilter(aId);
 }
-#endif /* VBOX_WITH_NEW_USB_CODE_ON_DARWIN */
 
 
 int USBProxyServiceDarwin::captureDevice(HostUSBDevice *aDevice)
@@ -126,16 +120,6 @@ int USBProxyServiceDarwin::captureDevice(HostUSBDevice *aDevice)
 
     Assert(aDevice->i_getUnistate() == kHostUSBDeviceState_Capturing);
 
-#ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-    /*
-     * Fake it.
-     */
-    ASMAtomicWriteBool(&mFakeAsync, true);
-    devLock.release();
-    interruptWait();
-    return VINF_SUCCESS;
-
-#else
     /*
      * Create a one-shot capture filter for the device (don't
      * match on port) and trigger a re-enumeration of it.
@@ -158,14 +142,13 @@ int USBProxyServiceDarwin::captureDevice(HostUSBDevice *aDevice)
     }
     LogFlowThisFunc(("returns %Rrc pvId=%p\n", rc, pvId));
     return rc;
-#endif
 }
 
 
 void USBProxyServiceDarwin::captureDeviceCompleted(HostUSBDevice *aDevice, bool aSuccess)
 {
     AssertReturnVoid(aDevice->isWriteLockOnCurrentThread());
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
+
     /*
      * Remove the one-shot filter if necessary.
      */
@@ -173,7 +156,6 @@ void USBProxyServiceDarwin::captureDeviceCompleted(HostUSBDevice *aDevice, bool
     if (!aSuccess && aDevice->mOneShotId)
         USBLibRemoveFilter(aDevice->mOneShotId);
     aDevice->mOneShotId = NULL;
-#endif
 }
 
 
@@ -190,16 +172,6 @@ int USBProxyServiceDarwin::releaseDevice(HostUSBDevice *aDevice)
 
     Assert(aDevice->i_getUnistate() == kHostUSBDeviceState_ReleasingToHost);
 
-#ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-    /*
-     * Fake it.
-     */
-    ASMAtomicWriteBool(&mFakeAsync, true);
-    devLock.release();
-    interruptWait();
-    return VINF_SUCCESS;
-
-#else
     /*
      * Create a one-shot ignore filter for the device
      * and trigger a re-enumeration of it.
@@ -224,14 +196,13 @@ int USBProxyServiceDarwin::releaseDevice(HostUSBDevice *aDevice)
     }
     LogFlowThisFunc(("returns %Rrc pvId=%p\n", rc, pvId));
     return rc;
-#endif
 }
 
 
 void USBProxyServiceDarwin::releaseDeviceCompleted(HostUSBDevice *aDevice, bool aSuccess)
 {
     AssertReturnVoid(aDevice->isWriteLockOnCurrentThread());
-#ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
+
     /*
      * Remove the one-shot filter if necessary.
      */
@@ -239,18 +210,13 @@ void USBProxyServiceDarwin::releaseDeviceCompleted(HostUSBDevice *aDevice, bool
     if (!aSuccess && aDevice->mOneShotId)
         USBLibRemoveFilter(aDevice->mOneShotId);
     aDevice->mOneShotId = NULL;
-#endif
 }
 
 
 /** @todo unused */
 void USBProxyServiceDarwin::detachingDevice(HostUSBDevice *aDevice)
 {
-#ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-    aDevice->setLogicalReconnect(HostUSBDevice::kDetachingPendingDetach);
-#else
     NOREF(aDevice);
-#endif
 }
 
 
@@ -258,24 +224,13 @@ bool USBProxyServiceDarwin::updateDeviceState(HostUSBDevice *aDevice, PUSBDEVICE
 {
     AssertReturn(aDevice, false);
     AssertReturn(!aDevice->isWriteLockOnCurrentThread(), false);
-#ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-    /* We're faking async state stuff. */
-    return updateDeviceStateFake(aDevice, aUSBDevice, aRunFilters, aIgnoreMachine);
-#else
-    /* Nothing special here so far, so fall back on parent */
+    /* Nothing special here so far, so fall back on parent. */
     return USBProxyService::updateDeviceState(aDevice, aUSBDevice, aRunFilters, aIgnoreMachine);
-#endif
 }
 
 
 int USBProxyServiceDarwin::wait(RTMSINTERVAL aMillies)
 {
-#ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
-    if (    mFakeAsync
-        &&  ASMAtomicXchgBool(&mFakeAsync, false))
-        return VINF_SUCCESS;
-#endif
-
     SInt32 rc = CFRunLoopRunInMode(CFSTR(VBOX_IOKIT_MODE_STRING),
                                    mWaitABitNextTime && aMillies >= 1000
                                    ? 1.0 /* seconds */
diff --git a/src/VBox/Main/src-server/linux/HostPowerLinux.cpp b/src/VBox/Main/src-server/linux/HostPowerLinux.cpp
index bd5c314..c39d607 100644
--- a/src/VBox/Main/src-server/linux/HostPowerLinux.cpp
+++ b/src/VBox/Main/src-server/linux/HostPowerLinux.cpp
@@ -84,12 +84,17 @@ HostPowerServiceLinux::HostPowerServiceLinux(VirtualBox *aVirtualBox)
 
 HostPowerServiceLinux::~HostPowerServiceLinux()
 {
+    int rc;
+    RTMSINTERVAL cMillies = 5000;
+
     /* Closing the connection should cause the event loop to exit. */
     LogFunc((": Stopping thread\n"));
     if (mpConnection)
         dbus_connection_close(mpConnection);
 
-    RTThreadWait(mThread, 5000, NULL);
+    rc = RTThreadWait(mThread, cMillies, NULL);
+    if (rc != VINF_SUCCESS)
+        LogRelThisFunc(("RTThreadWait() for %u ms failed with %Rrc\n", cMillies, rc));
     mThread = NIL_RTTHREAD;
 }
 
@@ -98,9 +103,10 @@ DECLCALLBACK(int) HostPowerServiceLinux::powerChangeNotificationThread(RTTHREAD
 {
     NOREF(hThreadSelf);
     HostPowerServiceLinux *pPowerObj = static_cast<HostPowerServiceLinux *>(pInstance);
+    DBusConnection *pConnection = pPowerObj->mpConnection;
 
     Log(("HostPowerServiceLinux: Thread started\n"));
-    while (dbus_connection_read_write(pPowerObj->mpConnection, -1))
+    while (dbus_connection_read_write(pConnection, -1))
     {
         DBusMessage *pMessage = NULL;
 
@@ -109,7 +115,7 @@ DECLCALLBACK(int) HostPowerServiceLinux::powerChangeNotificationThread(RTTHREAD
             DBusMessageIter args;
             dbus_bool_t fSuspend;
 
-            pMessage = dbus_connection_pop_message(pPowerObj->mpConnection);
+            pMessage = dbus_connection_pop_message(pConnection);
             if (pMessage == NULL)
                 break;
             /* The systemd-logind interface notification. */
@@ -139,10 +145,9 @@ DECLCALLBACK(int) HostPowerServiceLinux::powerChangeNotificationThread(RTTHREAD
         }
     }
     /* Close the socket or whatever underlying the connection. */
-    dbus_connection_close(pPowerObj->mpConnection);
+    dbus_connection_close(pConnection);
     /* Free in-process resources used for the now-closed connection. */
-    dbus_connection_unref(pPowerObj->mpConnection);
-    pPowerObj->mpConnection = NULL;
+    dbus_connection_unref(pConnection);
     Log(("HostPowerServiceLinux: Exiting thread\n"));
     return VINF_SUCCESS;
 }
diff --git a/src/VBox/Runtime/Makefile.kmk b/src/VBox/Runtime/Makefile.kmk
index 57a57e4..06f0fbb 100644
--- a/src/VBox/Runtime/Makefile.kmk
+++ b/src/VBox/Runtime/Makefile.kmk
@@ -571,6 +571,7 @@ RuntimeR3_SOURCES       = \
 	common/vfs/vfsmemory.cpp \
 	common/vfs/vfsmisc.cpp \
 	common/vfs/vfsstdfile.cpp \
+	common/vfs/vfsstdpipe.cpp \
 	common/zip/tar.cpp \
 	common/zip/tarcmd.cpp \
 	common/zip/unzipcmd.cpp \
@@ -597,7 +598,6 @@ RuntimeR3_SOURCES       = \
 	generic/RTLogWriteUser-generic.cpp \
 	generic/RTPathGetCurrentDrive-generic.cpp \
 	generic/RTPathIsSame-generic.cpp \
-	generic/RTProcessQueryUsernameA-generic.cpp \
 	generic/RTTimerLRCreate-generic.cpp \
 	generic/mempool-generic.cpp \
 	generic/semfastmutex-generic.cpp \
@@ -779,8 +779,12 @@ RuntimeR3_SOURCES.win = \
 	win/RTErrConvertFromWin32.cpp \
 	common/string/mempcpy.asm
 
-RuntimeR3_SOURCES.win.amd64 := $(RuntimeWin64ASM_SOURCES)
-RuntimeR3_SOURCES.win.x86   := $(RuntimeWin32ASM_SOURCES)
+RuntimeR3_SOURCES.win.amd64 := \
+	$(RuntimeWin64ASM_SOURCES) \
+	common/string/memrchr.asm
+RuntimeR3_SOURCES.win.x86   := \
+	$(RuntimeWin32ASM_SOURCES) \
+	common/string/memrchr.asm
 
 RuntimeR3_SOURCES.linux = \
 	generic/cdrom-generic.cpp \
@@ -870,6 +874,7 @@ else
 endif
 
 RuntimeR3_SOURCES.os2   = \
+	common/string/memrchr.asm \
 	generic/cdrom-generic.cpp \
 	generic/RTCrStoreCreateSnapshotById-generic.cpp \
 	generic/RTDirQueryInfo-generic.cpp \
@@ -1012,6 +1017,8 @@ RuntimeR3_SOURCES.darwin = \
 	r3/posix/timelocal-posix.cpp \
 	r3/posix/tls-posix.cpp \
 	r3/posix/utf8-posix.cpp
+RuntimeR3_SOURCES.darwin.x86   += common/string/memrchr.asm
+RuntimeR3_SOURCES.darwin.amd64 += common/string/memrchr.asm
 
 ## @todo Make BSD sched, implement RTMP*.
 RuntimeR3_SOURCES.freebsd = \
@@ -1085,6 +1092,8 @@ RuntimeR3_SOURCES.freebsd = \
 	r3/posix/timer-posix.cpp \
 	r3/posix/tls-posix.cpp \
 	r3/posix/utf8-posix.cpp
+RuntimeR3_SOURCES.freebsd.x86   += common/string/memrchr.asm
+RuntimeR3_SOURCES.freebsd.amd64 += common/string/memrchr.asm
 
 RuntimeR3_SOURCES.solaris = \
 	generic/cdrom-generic.cpp \
@@ -1152,9 +1161,11 @@ RuntimeR3_SOURCES.solaris = \
 	r3/solaris/RTSystemShutdown-solaris.cpp \
 	r3/solaris/thread-affinity-solaris.cpp
 RuntimeR3_SOURCES.solaris.amd64 = \
+	common/string/memrchr.asm \
 	r3/solaris/coredumper-solaris.cpp \
 	r3/solaris/RTSystemQueryDmiString-solaris.cpp
 RuntimeR3_SOURCES.solaris.x86 = \
+	common/string/memrchr.asm \
 	r3/solaris/coredumper-solaris.cpp \
 	r3/solaris/RTSystemQueryDmiString-solaris.cpp
 RuntimeR3_SOURCES.solaris.sparc32 = \
@@ -1223,6 +1234,8 @@ RuntimeR3_SOURCES.haiku = \
 	r3/posix/timelocal-posix.cpp \
 	r3/posix/tls-posix.cpp \
 	r3/posix/utf8-posix.cpp
+RuntimeR3_SOURCES.haiku.x86   += common/string/memrchr.asm
+RuntimeR3_SOURCES.haiku.amd64 += common/string/memrchr.asm
 
 ## PORTME: Porters add their selection of platform specific files for Ring-3 here.
 
@@ -1287,7 +1300,11 @@ RuntimeGuestR3_SOURCES.$(KBUILD_TARGET).amd64:= $(RuntimeR3_SOURCES.$(KBUILD_TAR
 RuntimeGuestR3_SOURCES.$(KBUILD_HOST).$(KBUILD_TARGET_ARCH)   := $(RuntimeR3_SOURCES.$(KBUILD_HOST).$(KBUILD_TARGET_ARCH))
 RuntimeGuestR3_SOURCES.win.x86               += \
  	r3/win/vcc100-kernel32-fakes.cpp \
- 	r3/win/vcc100-kernel32-fakesA.asm
+ 	r3/win/vcc100-kernel32-fakesA.asm \
+	r3/win/vcc100-ntdll-fakes.cpp \
+	r3/win/vcc100-ntdll-fakesA.asm \
+ 	r3/win/vcc100-ws2_32-fakes.cpp \
+ 	r3/win/vcc100-ws2_32-fakesA.asm
 
 #
 # RuntimeGuestR3-x86 - Same as RuntimeGuestR3, except that it's targeting x86.
@@ -1321,7 +1338,9 @@ ifdef VBOX_WITH_LIBCURL
 endif
 VBoxRT_SDKS                   += VBOX_OPENSSL
 VBoxRT_SDKS.win                = $(VBOX_WINPSDK) $(VBOX_WINDDK) VBOX_NTDLL
-if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win$(VBOX_WITH_HARDENING))
+if1of ($(KBUILD_TARGET), win)
+VBoxRT_INST                    = $(INST_DLL) $(INST_TESTCASE) $(VBOX_INST_TOOLS)
+else if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win$(VBOX_WITH_HARDENING))
 VBoxRT_INST                    = $(INST_DLL) $(INST_TESTCASE)
 endif
 VBoxRT_DEFS                   := $(filter-out RT_NO_GIP, $(RuntimeR3_DEFS)) \
@@ -1345,8 +1364,9 @@ VBoxRT_SOURCES                := \
 	common/checksum/crc32-zlib.cpp \
 	common/misc/aiomgr.cpp
 ifdef VBOX_WITH_LIBCURL
- VBoxRT_SOURCES               += common/misc/s3.cpp
- VBoxRT_SOURCES               += common/misc/http.cpp
+ VBoxRT_SOURCES               += \
+ 	common/misc/s3.cpp \
+ 	generic/http-curl.cpp
 endif
 VBoxRT_SOURCES.$(KBUILD_TARGET) = $(RuntimeR3_SOURCES.$(KBUILD_TARGET))
 VBoxRT_SOURCES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH) := $(RuntimeR3_SOURCES.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
@@ -1423,6 +1443,7 @@ VBoxRT_LDFLAGS.darwin          = \
 	-framework CoreFoundation \
 	-framework CoreServices \
 	-framework Security \
+	-framework SystemConfiguration \
 	-install_name $(VBOX_DYLD_EXECUTABLE_PATH)/VBoxRT.dylib
 VBoxRT_LDFLAGS.win             = /MANIFEST \
 	/delayload:gdi32.dll \
@@ -1435,7 +1456,9 @@ VBoxRT_LDFLAGS.win             = /MANIFEST \
 if1of ($(DLLS), VBoxRT)
 $$(VBoxRT_0_OUTDIR)/VBoxRT.def: \
 		$(PATH_SUB_CURRENT)/r3/win/VBoxRT-$$(if-expr $$(KBUILD_TARGET_ARCH) == amd64,win64,win32).def \
-		$(PATH_SUB_CURRENT)/r3/win/$(if $(VBOX_OSE),VBoxRT-openssl-ose.def,VBoxRT-openssl.def)
+		$(PATH_SUB_CURRENT)/r3/win/$(if $(VBOX_OSE),VBoxRT-openssl-ose.def,VBoxRT-openssl.def) \
+		$(if-expr "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86" && defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES)\
+		,$(PATH_SUB_CURRENT)/r3/win/VBoxRT-msvcr100-win32.def ,) #$(PATH_SUB_CURRENT)/r3/win/VBoxRT-msvcp100-win32.def
 	$(RM) -f -- $@
 	$(REDIRECT) -wto $@ -- $(CAT_EXT) $^
 endif
@@ -1445,6 +1468,37 @@ if1of (VBoxRT,$(DLLS))
 endif
 
 
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
+ #
+ # Hacks for running tests on NT 4.  Really ugly!
+ #
+ # We put most of the CRT in VBoxRT because we cannot even load msvcr100.dll
+ # or msvcp100.dll on NT4 because of kernel32.dll dependencies.  More hacks
+ # in RuntimeR3VccTricks.
+ #
+ TEMPLATE_VBoxR3RuntimeDllItself = xx
+ TEMPLATE_VBoxR3RuntimeDllItself_EXTENDS = VBoxR3RuntimeDll
+ TEMPLATE_VBoxR3RuntimeDllItself_LIBS.win.x86 = \
+ 	$(filter-out $(PATH_STAGE_LIB)/RuntimeR3VccTricks%, $(TEMPLATE_VBoxR3RuntimeDll_LIBS.win.x86))
+ TEMPLATE_VBoxR3RuntimeDllItself_SOURCES = \
+ 	r3/win/vcc100-kernel32-fakes.cpp \
+ 	r3/win/vcc100-kernel32-fakesA.asm \
+ 	r3/win/vcc100-ws2_32-fakes.cpp \
+ 	r3/win/vcc100-ws2_32-fakesA.asm \
+	r3/win/vcc100-ntdll-fakes.cpp \
+	r3/win/vcc100-ntdll-fakesA.asm \
+	r3/win/vcc100-msvcrt-fakes.cpp
+ VBoxRT_TEMPLATE         = VBoxR3RuntimeDllItself
+ VBoxRT_TEMPLATE.win.x86 = VBoxR3RuntimeDllItself
+ VBoxRT_DEFS.win.x86     = $(TEMPLATE_VBoxR3RuntimeDll_DEFS.win.x86) _CRTIMP_PURE="__declspec(dllexport)"
+ VBoxRT_LDFLAGS.win.x86  = /IGNORE:4049 /IGNORE:4217
+ VBoxRT_LIBS.win.x86 = \
+ 	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/oldnames.lib \
+ 	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/libcmt.lib \
+ 	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/libcpmt.lib
+endif
+
+
 #
 # HACK ALERT!  Make testcase run during build on SELinux boxes.
 #              Create a dummy DLL that ensure that VBoxRT is installed
@@ -2476,6 +2530,33 @@ RuntimeR3VccTricks_SOURCES  = \
  	r3/win/vcc100-kernel32-fakes.cpp \
  	r3/win/vcc100-kernel32-fakesA.asm
 
+if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86" # Ugly hacks... :-)
+LIBRARIES += RuntimeR3VccTricks2
+RuntimeR3VccTricks2_TEMPLATE = VBoxR3Dll
+RuntimeR3VccTricks2_SOURCES  = $(RuntimeR3VccTricks_SOURCES)
+RuntimeR3VccTricks2_SOURCES += $(RuntimeR3VccTricks2_0_OUTDIR)/dynobjs.lib
+RuntimeR3VccTricks2_CLEAN    = $(RuntimeR3VccTricks2_0_OUTDIR)/dynobjs.lib
+RuntimeR3VccTricks2_VBOX_LIBCMT_NEEDED =
+
+$$(RuntimeR3VccTricks2_0_OUTDIR)/dynobjs.lib: \
+		$$(PATH_TOOL_$$(TEMPLATE_VBoxR3Dll_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
+		$$(PATH_TOOL_$$(TEMPLATE_VBoxR3Dll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+		$$(LIB_RUNTIME) \
+		$(MAKEFILE) | $$(dir $$@)
+	$(RM) -f -- "$@"
+#	$(REDIRECT) -C $(dir $@) -- $(KBUILD_DEVTOOLS)/common/openwatcom/v1.9-r2/binnt/wlib \
+#               $(PATH_TOOL_$(TEMPLATE_VBoxR3Dll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+#               $(foreach file, $(RuntimeR3VccTricks2_VBOX_LIBCMT_NEEDED), *$(file))
+	$(KBUILD_DEVTOOLS)/common/openwatcom/v1.9-r2/binnt/wlib -o=$@.tmp.lib $< \
+		-MSVCR100.dll \
+		$(addprefix $(RuntimeR3VccTricks2_0_OUTDIR)/, $(RuntimeR3VccTricks2_VBOX_LIBCMT_NEEDED)) \
+               -chandler4gs.obj
+	$(KBUILD_DEVTOOLS)/common/openwatcom/v1.9-r2/binnt/wlib -o=$@ \
+               $(LIB_RUNTIME) \
+		+$@.tmp.lib
+	$(RM) -f -- $@.tmp.lib $(addprefix $(RuntimeR3VccTricks2_0_OUTDIR)/, $(RuntimeR3VccTricks_VBOX_LIBCMT_NEEDED))
+endif
+
 
 #
 # errmsg.cpp depends on a generated header.
diff --git a/src/VBox/Runtime/common/crypto/RTCrStoreCertAddWantedFromFishingExpedition.cpp b/src/VBox/Runtime/common/crypto/RTCrStoreCertAddWantedFromFishingExpedition.cpp
index 0f476b7..68f7ae4 100644
--- a/src/VBox/Runtime/common/crypto/RTCrStoreCertAddWantedFromFishingExpedition.cpp
+++ b/src/VBox/Runtime/common/crypto/RTCrStoreCertAddWantedFromFishingExpedition.cpp
@@ -142,8 +142,14 @@ RTDECL(int) RTCrStoreCertAddWantedFromFishingExpedition(RTCRSTORE hStore, uint32
             "/System/Library/Java/JavaVirtualMachines/*/Contents/Home/lib/security/cacerts",
 #endif
 #ifdef RT_OS_LINUX
+            PREFIX_UNIXROOT "/etc/ssl/certs/java/cacerts",
+            PREFIX_UNIXROOT "/usr/lib/j*/*/jre/lib/security/cacerts",
             PREFIX_UNIXROOT "/opt/*/jre/lib/security/cacerts",
 #endif
+#ifdef RT_OS_SOLARIS
+            PREFIX_UNIXROOT "/usr/java/jre/lib/security/cacerts",
+            PREFIX_UNIXROOT "/usr/jdk/instances/*/jre/lib/security/cacerts",
+#endif
 #ifdef RT_OS_WINDOWS
             "${AllProgramFiles}/Git/bin/curl-ca-bundle.crt",
             "${AllProgramFiles}/Mercurial/hgrc.d/cacert.pem",
@@ -183,7 +189,11 @@ RTDECL(int) RTCrStoreCertAddWantedFromFishingExpedition(RTCRSTORE hStore, uint32
         {
             PREFIX_UNIXROOT "/usr/share/ca-certificates/mozilla/",
 #ifdef RT_OS_DARWIN
-            "/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/ssl_certs/"
+            "/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/ssl_certs/",
+#endif
+#ifdef RT_OS_SOLARIS
+            "/etc/certs/",
+            "/etc/crypto/certs/",
 #endif
 #ifdef RT_OS_WINDOWS
             "${AllProgramFiles}/Git/ssl/certs/",
diff --git a/src/VBox/Runtime/common/crypto/tsp-template.h b/src/VBox/Runtime/common/crypto/tsp-template.h
index 25dc242..b2a760b 100644
--- a/src/VBox/Runtime/common/crypto/tsp-template.h
+++ b/src/VBox/Runtime/common/crypto/tsp-template.h
@@ -59,15 +59,15 @@ RTASN1TMPL_END_SEQCORE();
 #define RTASN1TMPL_EXT_NAME     RTCrTspAccuracy
 #define RTASN1TMPL_INT_NAME     rtCrTspAccuracy
 RTASN1TMPL_BEGIN_SEQCORE();
-RTASN1TMPL_MEMBER_EX(           Seconds,    RTASN1INTEGER,  RTAsn1Integer,
-                                RTASN1TMPL_MEMBER_CONSTR_U64_MIN_MAX(Millis, 1, UINT64_MAX, RT_NOTHING));
+RTASN1TMPL_MEMBER_OPT_ITAG_EX(  Seconds, RTASN1INTEGER, RTAsn1Integer, ASN1_TAG_INTEGER, RTASN1TMPL_ITAG_F_UP,
+                                RTASN1TMPL_MEMBER_CONSTR_U64_MIN_MAX(Seconds, 0, UINT64_MAX, RT_NOTHING));
 /** @todo The Millis and Micros fields makes no sense if Seconds > 1, while the
  *        Micros field makes no sense with Millis > 1.  Add constraints
  *        expressing this dependency. */
 RTASN1TMPL_MEMBER_OPT_ITAG_EX(  Millis,     RTASN1INTEGER,  RTAsn1Integer, 0, RTASN1TMPL_ITAG_F_CP,
                                 RTASN1TMPL_MEMBER_CONSTR_U64_MIN_MAX(Millis, 1, 999, RT_NOTHING));
 RTASN1TMPL_MEMBER_OPT_ITAG_EX(  Micros,     RTASN1INTEGER,  RTAsn1Integer, 1, RTASN1TMPL_ITAG_F_CP,
-                                RTASN1TMPL_MEMBER_CONSTR_U64_MIN_MAX(Millis, 1, 999, RT_NOTHING));
+                                RTASN1TMPL_MEMBER_CONSTR_U64_MIN_MAX(Micros, 1, 999, RT_NOTHING));
 RTASN1TMPL_END_SEQCORE();
 #undef RTASN1TMPL_TYPE
 #undef RTASN1TMPL_EXT_NAME
diff --git a/src/VBox/Runtime/common/misc/http.cpp b/src/VBox/Runtime/common/misc/http.cpp
deleted file mode 100644
index 13db91a..0000000
--- a/src/VBox/Runtime/common/misc/http.cpp
+++ /dev/null
@@ -1,898 +0,0 @@
-/* $Id: http.cpp $ */
-/** @file
- * IPRT - HTTP communication API.
- */
-
-/*
- * Copyright (C) 2012-2015 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-
-/*********************************************************************************************************************************
-*   Header Files                                                                                                                 *
-*********************************************************************************************************************************/
-#include <iprt/http.h>
-#include "internal/iprt.h"
-
-#include <iprt/asm.h>
-#include <iprt/assert.h>
-#include <iprt/crypto/store.h>
-#include <iprt/env.h>
-#include <iprt/err.h>
-#include <iprt/file.h>
-#include <iprt/mem.h>
-#include <iprt/path.h>
-#include <iprt/stream.h>
-#include <iprt/string.h>
-
-#include "internal/magics.h"
-
-#include <curl/curl.h>
-
-
-/*********************************************************************************************************************************
-*   Structures and Typedefs                                                                                                      *
-*********************************************************************************************************************************/
-/**
- * Internal HTTP client instance.
- */
-typedef struct RTHTTPINTERNAL
-{
-    /** Magic value. */
-    uint32_t            u32Magic;
-    /** cURL handle. */
-    CURL               *pCurl;
-    /** The last response code. */
-    long                lLastResp;
-    /** Custom headers/ */
-    struct curl_slist  *pHeaders;
-    /** CA certificate file for HTTPS authentication. */
-    char               *pszCaFile;
-    /** Whether to delete the CA on destruction. */
-    bool                fDeleteCaFile;
-    /** Abort the current HTTP request if true. */
-    bool volatile       fAbort;
-    /** Set if someone is preforming an HTTP operation. */
-    bool volatile       fBusy;
-    /** The location field for 301 responses. */
-    char               *pszRedirLocation;
-
-    /** Output callback data. */
-    union
-    {
-        /** For file destination.  */
-        RTFILE          hFile;
-        /** For memory destination. */
-        struct
-        {
-            /** The current size (sans terminator char). */
-            size_t      cb;
-            /** The currently allocated size. */
-            size_t      cbAllocated;
-            /** Pointer to the buffer. */
-            uint8_t    *pb;
-        } Mem;
-    } Output;
-    /** Output callback status. */
-    int                 rcOutput;
-    /** Download size hint set by the progress callback. */
-    uint64_t            cbDownloadHint;
-} RTHTTPINTERNAL;
-/** Pointer to an internal HTTP client instance. */
-typedef RTHTTPINTERNAL *PRTHTTPINTERNAL;
-
-
-/*********************************************************************************************************************************
-*   Defined Constants And Macros                                                                                                 *
-*********************************************************************************************************************************/
-/** @def RTHTTP_MAX_MEM_DOWNLOAD
- * The max size we are allowed to download to a memory buffer.
- *
- * @remarks The minus 1 is for the trailing zero terminator we always add.
- */
-#if ARCH_BITS == 64
-# define RTHTTP_MAX_MEM_DOWNLOAD_SIZE       (UINT32_C(64)*_1M - 1)
-#else
-# define RTHTTP_MAX_MEM_DOWNLOAD_SIZE       (UINT32_C(32)*_1M - 1)
-#endif
-
-/** Checks whether a cURL return code indicates success. */
-#define CURL_SUCCESS(rcCurl)    RT_LIKELY(rcCurl == CURLE_OK)
-/** Checks whether a cURL return code indicates failure. */
-#define CURL_FAILURE(rcCurl)    RT_UNLIKELY(rcCurl != CURLE_OK)
-
-/** Validates a handle and returns VERR_INVALID_HANDLE if not valid. */
-#define RTHTTP_VALID_RETURN_RC(hHttp, rcCurl) \
-    do { \
-        AssertPtrReturn((hHttp), (rcCurl)); \
-        AssertReturn((hHttp)->u32Magic == RTHTTP_MAGIC, (rcCurl)); \
-    } while (0)
-
-/** Validates a handle and returns VERR_INVALID_HANDLE if not valid. */
-#define RTHTTP_VALID_RETURN(hHTTP) RTHTTP_VALID_RETURN_RC((hHttp), VERR_INVALID_HANDLE)
-
-/** Validates a handle and returns (void) if not valid. */
-#define RTHTTP_VALID_RETURN_VOID(hHttp) \
-    do { \
-        AssertPtrReturnVoid(hHttp); \
-        AssertReturnVoid((hHttp)->u32Magic == RTHTTP_MAGIC); \
-    } while (0)
-
-
-/*********************************************************************************************************************************
-*   Internal Functions                                                                                                           *
-*********************************************************************************************************************************/
-static void rtHttpUnsetCaFile(PRTHTTPINTERNAL pThis);
-
-
-RTR3DECL(int) RTHttpCreate(PRTHTTP phHttp)
-{
-    AssertPtrReturn(phHttp, VERR_INVALID_PARAMETER);
-
-    /** @todo r=bird: rainy day: curl_global_init is not thread safe, only a
-     *        problem if multiple threads get here at the same time. */
-    int rc = VERR_HTTP_INIT_FAILED;
-    CURLcode rcCurl = curl_global_init(CURL_GLOBAL_ALL);
-    if (!CURL_FAILURE(rcCurl))
-    {
-        CURL *pCurl = curl_easy_init();
-        if (pCurl)
-        {
-            PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)RTMemAllocZ(sizeof(RTHTTPINTERNAL));
-            if (pThis)
-            {
-                pThis->u32Magic = RTHTTP_MAGIC;
-                pThis->pCurl    = pCurl;
-
-                *phHttp = (RTHTTP)pThis;
-
-                return VINF_SUCCESS;
-            }
-            rc = VERR_NO_MEMORY;
-        }
-        else
-            rc = VERR_HTTP_INIT_FAILED;
-    }
-    curl_global_cleanup();
-    return rc;
-}
-
-
-RTR3DECL(void) RTHttpDestroy(RTHTTP hHttp)
-{
-    if (hHttp == NIL_RTHTTP)
-        return;
-
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN_VOID(pThis);
-
-    Assert(!pThis->fBusy);
-
-    pThis->u32Magic = RTHTTP_MAGIC_DEAD;
-
-    curl_easy_cleanup(pThis->pCurl);
-    pThis->pCurl = NULL;
-
-    if (pThis->pHeaders)
-        curl_slist_free_all(pThis->pHeaders);
-
-    rtHttpUnsetCaFile(pThis);
-    Assert(!pThis->pszCaFile);
-
-    if (pThis->pszRedirLocation)
-        RTStrFree(pThis->pszRedirLocation);
-
-    RTMemFree(pThis);
-
-    curl_global_cleanup();
-}
-
-
-RTR3DECL(int) RTHttpAbort(RTHTTP hHttp)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-
-    pThis->fAbort = true;
-
-    return VINF_SUCCESS;
-}
-
-
-RTR3DECL(int) RTHttpGetRedirLocation(RTHTTP hHttp, char **ppszRedirLocation)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-    Assert(!pThis->fBusy);
-
-    if (!pThis->pszRedirLocation)
-        return VERR_HTTP_NOT_FOUND;
-
-    return RTStrDupEx(ppszRedirLocation, pThis->pszRedirLocation);
-}
-
-
-RTR3DECL(int) RTHttpUseSystemProxySettings(RTHTTP hHttp)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-
-    /*
-     * Very limited right now, just enought to make it work for ourselves.
-     */
-    char szProxy[_1K];
-    int rc = RTEnvGetEx(RTENV_DEFAULT, "http_proxy", szProxy, sizeof(szProxy), NULL);
-    if (RT_SUCCESS(rc))
-    {
-        int rcCurl;
-        if (!strncmp(szProxy, RT_STR_TUPLE("http://")))
-        {
-            rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXY, &szProxy[sizeof("http://") - 1]);
-            if (CURL_FAILURE(rcCurl))
-                return VERR_INVALID_PARAMETER;
-            rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYPORT, 80);
-            if (CURL_FAILURE(rcCurl))
-                return VERR_INVALID_PARAMETER;
-        }
-        else
-        {
-            rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXY, &szProxy[sizeof("http://") - 1]);
-            if (CURL_FAILURE(rcCurl))
-                return VERR_INVALID_PARAMETER;
-        }
-    }
-    else if (rc == VERR_ENV_VAR_NOT_FOUND)
-        rc = VINF_SUCCESS;
-
-    return rc;
-}
-
-
-RTR3DECL(int) RTHttpSetProxy(RTHTTP hHttp, const char *pcszProxy, uint32_t uPort,
-                             const char *pcszProxyUser, const char *pcszProxyPwd)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-    AssertPtrReturn(pcszProxy, VERR_INVALID_PARAMETER);
-
-    int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXY, pcszProxy);
-    if (CURL_FAILURE(rcCurl))
-        return VERR_INVALID_PARAMETER;
-
-    if (uPort != 0)
-    {
-        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYPORT, (long)uPort);
-        if (CURL_FAILURE(rcCurl))
-            return VERR_INVALID_PARAMETER;
-    }
-
-    if (pcszProxyUser && pcszProxyPwd)
-    {
-        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYUSERNAME, pcszProxyUser);
-        if (CURL_FAILURE(rcCurl))
-            return VERR_INVALID_PARAMETER;
-
-        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYPASSWORD, pcszProxyPwd);
-        if (CURL_FAILURE(rcCurl))
-            return VERR_INVALID_PARAMETER;
-    }
-
-    return VINF_SUCCESS;
-}
-
-
-RTR3DECL(int) RTHttpSetHeaders(RTHTTP hHttp, size_t cHeaders, const char * const *papszHeaders)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-
-    if (!cHeaders)
-    {
-        if (pThis->pHeaders)
-            curl_slist_free_all(pThis->pHeaders);
-        pThis->pHeaders = 0;
-        return VINF_SUCCESS;
-    }
-
-    struct curl_slist *pHeaders = NULL;
-    for (size_t i = 0; i < cHeaders; i++)
-        pHeaders = curl_slist_append(pHeaders, papszHeaders[i]);
-
-    pThis->pHeaders = pHeaders;
-    int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_HTTPHEADER, pHeaders);
-    if (CURL_FAILURE(rcCurl))
-        return VERR_INVALID_PARAMETER;
-
-    return VINF_SUCCESS;
-}
-
-
-/**
- * Set the CA file to NULL, deleting any temporary file if necessary.
- *
- * @param   pThis           The HTTP/HTTPS client instance.
- */
-static void rtHttpUnsetCaFile(PRTHTTPINTERNAL pThis)
-{
-    if (pThis->pszCaFile)
-    {
-        if (pThis->fDeleteCaFile)
-        {
-            int rc2 = RTFileDelete(pThis->pszCaFile);
-            AssertMsg(RT_SUCCESS(rc2) || !RTFileExists(pThis->pszCaFile), ("rc=%Rrc '%s'\n", rc2, pThis->pszCaFile));
-        }
-        RTStrFree(pThis->pszCaFile);
-        pThis->pszCaFile = NULL;
-    }
-}
-
-
-RTR3DECL(int) RTHttpSetCAFile(RTHTTP hHttp, const char *pszCaFile)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-
-    rtHttpUnsetCaFile(pThis);
-
-    pThis->fDeleteCaFile = false;
-    if (pszCaFile)
-        return RTStrDupEx(&pThis->pszCaFile, pszCaFile);
-    return VINF_SUCCESS;
-}
-
-
-RTR3DECL(int) RTHttpUseTemporaryCaFile(RTHTTP hHttp, PRTERRINFO pErrInfo)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-
-    /*
-     * Create a temporary file.
-     */
-    int rc = VERR_NO_STR_MEMORY;
-    char *pszCaFile = RTStrAlloc(RTPATH_MAX);
-    if (pszCaFile)
-    {
-        RTFILE hFile;
-        rc = RTFileOpenTemp(&hFile, pszCaFile, RTPATH_MAX,
-                            RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_DENY_NONE | (0600 << RTFILE_O_CREATE_MODE_SHIFT));
-        if (RT_SUCCESS(rc))
-        {
-            /*
-             * Gather certificates into a temporary store and export them to the temporary file.
-             */
-            RTCRSTORE hStore;
-            rc = RTCrStoreCreateInMem(&hStore, 256);
-            if (RT_SUCCESS(rc))
-            {
-                rc = RTHttpGatherCaCertsInStore(hStore, 0 /*fFlags*/, pErrInfo);
-                if (RT_SUCCESS(rc))
-                    /** @todo Consider adding an API for exporting to a RTFILE... */
-                    rc = RTCrStoreCertExportAsPem(hStore, 0 /*fFlags*/, pszCaFile);
-                RTCrStoreRelease(hStore);
-            }
-            RTFileClose(hFile);
-            if (RT_SUCCESS(rc))
-            {
-                /*
-                 * Set the CA file for the instance.
-                 */
-                rtHttpUnsetCaFile(pThis);
-
-                pThis->fDeleteCaFile = true;
-                pThis->pszCaFile = pszCaFile;
-                return VINF_SUCCESS;
-            }
-
-            int rc2 = RTFileDelete(pszCaFile);
-            AssertRC(rc2);
-        }
-        else
-            RTErrInfoAddF(pErrInfo, rc, "Error creating temorary file: %Rrc", rc);
-
-        RTStrFree(pszCaFile);
-    }
-    return rc;
-}
-
-
-RTR3DECL(int) RTHttpGatherCaCertsInStore(RTCRSTORE hStore, uint32_t fFlags, PRTERRINFO pErrInfo)
-{
-    uint32_t const cBefore = RTCrStoreCertCount(hStore);
-    AssertReturn(cBefore != UINT32_MAX, VERR_INVALID_HANDLE);
-
-    /*
-     * Add the user store, quitely ignoring any errors.
-     */
-    RTCRSTORE hSrcStore;
-    int rcUser = RTCrStoreCreateSnapshotById(&hSrcStore, RTCRSTOREID_USER_TRUSTED_CAS_AND_CERTIFICATES, pErrInfo);
-    if (RT_SUCCESS(rcUser))
-    {
-        rcUser = RTCrStoreCertAddFromStore(hStore, RTCRCERTCTX_F_ADD_IF_NOT_FOUND | RTCRCERTCTX_F_ADD_CONTINUE_ON_ERROR,
-                                           hSrcStore);
-        RTCrStoreRelease(hSrcStore);
-    }
-
-    /*
-     * Ditto for the system store.
-     */
-    int rcSystem = RTCrStoreCreateSnapshotById(&hSrcStore, RTCRSTOREID_SYSTEM_TRUSTED_CAS_AND_CERTIFICATES, pErrInfo);
-    if (RT_SUCCESS(rcSystem))
-    {
-        rcSystem = RTCrStoreCertAddFromStore(hStore, RTCRCERTCTX_F_ADD_IF_NOT_FOUND | RTCRCERTCTX_F_ADD_CONTINUE_ON_ERROR,
-                                             hSrcStore);
-        RTCrStoreRelease(hSrcStore);
-    }
-
-    /*
-     * If the number of certificates increased, we consider it a success.
-     */
-    if (RTCrStoreCertCount(hStore) > cBefore)
-    {
-        if (RT_FAILURE(rcSystem))
-            return -rcSystem;
-        if (RT_FAILURE(rcUser))
-            return -rcUser;
-        return rcSystem != VINF_SUCCESS ? rcSystem : rcUser;
-    }
-
-    if (RT_FAILURE(rcSystem))
-        return rcSystem;
-    if (RT_FAILURE(rcUser))
-        return rcUser;
-    return VERR_NOT_FOUND;
-}
-
-
-RTR3DECL(int) RTHttpGatherCaCertsInFile(const char *pszCaFile, uint32_t fFlags, PRTERRINFO pErrInfo)
-{
-    RTCRSTORE hStore;
-    int rc = RTCrStoreCreateInMem(&hStore, 256);
-    if (RT_SUCCESS(rc))
-    {
-        rc = RTHttpGatherCaCertsInStore(hStore, fFlags, pErrInfo);
-        if (RT_SUCCESS(rc))
-            rc = RTCrStoreCertExportAsPem(hStore, 0 /*fFlags*/, pszCaFile);
-        RTCrStoreRelease(hStore);
-    }
-    return rc;
-}
-
-
-
-/**
- * Figures out the IPRT status code for a GET.
- *
- * @returns IPRT status code.
- * @param   pThis           The HTTP/HTTPS client instance.
- * @param   rcCurl          What curl returned.
- */
-static int rtHttpGetCalcStatus(PRTHTTPINTERNAL pThis, int rcCurl)
-{
-    int rc = VERR_INTERNAL_ERROR;
-
-    if (pThis->pszRedirLocation)
-    {
-        RTStrFree(pThis->pszRedirLocation);
-        pThis->pszRedirLocation = NULL;
-    }
-    if (rcCurl == CURLE_OK)
-    {
-        curl_easy_getinfo(pThis->pCurl, CURLINFO_RESPONSE_CODE, &pThis->lLastResp);
-        switch (pThis->lLastResp)
-        {
-            case 200:
-                /* OK, request was fulfilled */
-            case 204:
-                /* empty response */
-                rc = VINF_SUCCESS;
-                break;
-            case 301:
-            {
-                const char *pszRedirect;
-                curl_easy_getinfo(pThis->pCurl, CURLINFO_REDIRECT_URL, &pszRedirect);
-                size_t cb = strlen(pszRedirect);
-                if (cb > 0 && cb < 2048)
-                    pThis->pszRedirLocation = RTStrDup(pszRedirect);
-                rc = VERR_HTTP_REDIRECTED;
-                break;
-            }
-            case 400:
-                /* bad request */
-                rc = VERR_HTTP_BAD_REQUEST;
-                break;
-            case 403:
-                /* forbidden, authorization will not help */
-                rc = VERR_HTTP_ACCESS_DENIED;
-                break;
-            case 404:
-                /* URL not found */
-                rc = VERR_HTTP_NOT_FOUND;
-                break;
-        }
-    }
-    else
-    {
-        switch (rcCurl)
-        {
-            case CURLE_URL_MALFORMAT:
-            case CURLE_COULDNT_RESOLVE_HOST:
-                rc = VERR_HTTP_NOT_FOUND;
-                break;
-            case CURLE_COULDNT_CONNECT:
-                rc = VERR_HTTP_COULDNT_CONNECT;
-                break;
-            case CURLE_SSL_CONNECT_ERROR:
-                rc = VERR_HTTP_SSL_CONNECT_ERROR;
-                break;
-            case CURLE_SSL_CACERT:
-                /* The peer certificate cannot be authenticated with the CA certificates
-                 * set by RTHttpSetCAFile(). We need other or additional CA certificates. */
-                rc = VERR_HTTP_CACERT_CANNOT_AUTHENTICATE;
-                break;
-            case CURLE_SSL_CACERT_BADFILE:
-                /* CAcert file (see RTHttpSetCAFile()) has wrong format */
-                rc = VERR_HTTP_CACERT_WRONG_FORMAT;
-                break;
-            case CURLE_ABORTED_BY_CALLBACK:
-                /* forcefully aborted */
-                rc = VERR_HTTP_ABORTED;
-                break;
-            case CURLE_COULDNT_RESOLVE_PROXY:
-                rc = VERR_HTTP_PROXY_NOT_FOUND;
-                break;
-            case CURLE_WRITE_ERROR:
-                rc = RT_FAILURE_NP(pThis->rcOutput) ? pThis->rcOutput : VERR_WRITE_ERROR;
-                break;
-            //case CURLE_READ_ERROR
-
-            default:
-                break;
-        }
-    }
-
-    return rc;
-}
-
-
-/**
- * cURL callback for reporting progress, we use it for checking for abort.
- */
-static int rtHttpProgress(void *pData, double rdTotalDownload, double rdDownloaded, double rdTotalUpload, double rdUploaded)
-{
-    PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)pData;
-    AssertReturn(pThis->u32Magic == RTHTTP_MAGIC, 1);
-
-    pThis->cbDownloadHint = (uint64_t)rdTotalDownload;
-
-    return pThis->fAbort ? 1 : 0;
-}
-
-
-/**
- * Whether we're likely to need SSL to handle the give URL.
- *
- * @returns true if we need, false if we probably don't.
- * @param   pszUrl              The URL.
- */
-static bool rtHttpNeedSsl(const char *pszUrl)
-{
-    return RTStrNICmp(pszUrl, RT_STR_TUPLE("https:")) == 0;
-}
-
-
-/**
- * Applies recoded settings to the cURL instance before doing work.
- *
- * @returns IPRT status code.
- * @param   pThis           The HTTP/HTTPS client instance.
- * @param   pszUrl          The URL.
- */
-static int rtHttpApplySettings(PRTHTTPINTERNAL pThis, const char *pszUrl)
-{
-    /*
-     * The URL.
-     */
-    int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_URL, pszUrl);
-    if (CURL_FAILURE(rcCurl))
-        return VERR_INVALID_PARAMETER;
-
-    /*
-     * Setup SSL.  Can be a bit of work.
-     */
-    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_SSLVERSION, (long)CURL_SSLVERSION_TLSv1);
-    if (CURL_FAILURE(rcCurl))
-        return VERR_INVALID_PARAMETER;
-
-    const char *pszCaFile = pThis->pszCaFile;
-    if (   !pszCaFile
-        && rtHttpNeedSsl(pszUrl))
-    {
-        int rc = RTHttpUseTemporaryCaFile(pThis, NULL);
-        if (RT_SUCCESS(rc))
-            pszCaFile = pThis->pszCaFile;
-        else
-            return rc; /* Non-portable alternative: pszCaFile = "/etc/ssl/certs/ca-certificates.crt"; */
-    }
-    if (pszCaFile)
-    {
-        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_CAINFO, pszCaFile);
-        if (CURL_FAILURE(rcCurl))
-            return VERR_INTERNAL_ERROR;
-    }
-
-    /*
-     * Progress/abort.
-     */
-    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROGRESSFUNCTION, &rtHttpProgress);
-    if (CURL_FAILURE(rcCurl))
-        return VERR_INTERNAL_ERROR;
-    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROGRESSDATA, (void *)pThis);
-    if (CURL_FAILURE(rcCurl))
-        return VERR_INTERNAL_ERROR;
-    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_NOPROGRESS, (long)0);
-    if (CURL_FAILURE(rcCurl))
-        return VERR_INTERNAL_ERROR;
-
-    return VINF_SUCCESS;
-}
-
-
-/**
- * cURL callback for writing data.
- */
-static size_t rtHttpWriteData(void *pvBuf, size_t cbUnit, size_t cUnits, void *pvUser)
-{
-    PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)pvUser;
-
-    /*
-     * Do max size and overflow checks.
-     */
-    size_t const cbToAppend = cbUnit * cUnits;
-    size_t const cbCurSize  = pThis->Output.Mem.cb;
-    size_t const cbNewSize  = cbCurSize + cbToAppend;
-    if (   cbToAppend < RTHTTP_MAX_MEM_DOWNLOAD_SIZE
-        && cbNewSize  < RTHTTP_MAX_MEM_DOWNLOAD_SIZE)
-    {
-        if (cbNewSize + 1 <= pThis->Output.Mem.cbAllocated)
-        {
-            memcpy(&pThis->Output.Mem.pb[cbCurSize], pvBuf, cbToAppend);
-            pThis->Output.Mem.cb = cbNewSize;
-            pThis->Output.Mem.pb[cbNewSize] = '\0';
-            return cbToAppend;
-        }
-
-        /*
-         * We need to reallocate the output buffer.
-         */
-        /** @todo this could do with a better strategy wrt growth. */
-        size_t cbAlloc = RT_ALIGN_Z(cbNewSize + 1, 64);
-        if (   cbAlloc <= pThis->cbDownloadHint
-            && pThis->cbDownloadHint < RTHTTP_MAX_MEM_DOWNLOAD_SIZE)
-            cbAlloc = RT_ALIGN_Z(pThis->cbDownloadHint + 1, 64);
-
-        uint8_t *pbNew = (uint8_t *)RTMemRealloc(pThis->Output.Mem.pb, cbAlloc);
-        if (pbNew)
-        {
-            memcpy(&pbNew[cbCurSize], pvBuf, cbToAppend);
-            pbNew[cbNewSize] = '\0';
-
-            pThis->Output.Mem.cbAllocated = cbAlloc;
-            pThis->Output.Mem.pb = pbNew;
-            pThis->Output.Mem.cb = cbNewSize;
-            return cbToAppend;
-        }
-
-        pThis->rcOutput = VERR_NO_MEMORY;
-    }
-    else
-        pThis->rcOutput = VERR_TOO_MUCH_DATA;
-
-    /*
-     * Failure - abort.
-     */
-    RTMemFree(pThis->Output.Mem.pb);
-    pThis->Output.Mem.pb = NULL;
-    pThis->Output.Mem.cb = RTHTTP_MAX_MEM_DOWNLOAD_SIZE;
-    pThis->fAbort        = true;
-    return 0;
-}
-
-
-/**
- * Internal worker that performs a HTTP GET.
- *
- * @returns IPRT status code.
- * @param   hHttp               The HTTP/HTTPS client instance.
- * @param   pszUrl              The URL.
- * @param   ppvResponse         Where to return the pointer to the allocated
- *                              response data (RTMemFree).  There will always be
- *                              an zero terminator char after the response, that
- *                              is not part of the size returned via @a pcb.
- * @param   pcb                 The size of the response data.
- *
- * @remarks We ASSUME the API user doesn't do concurrent GETs in different
- *          threads, because that will probably blow up!
- */
-static int rtHttpGetToMem(RTHTTP hHttp, const char *pszUrl, uint8_t **ppvResponse, size_t *pcb)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-
-    /*
-     * Reset the return values in case of more "GUI programming" on the client
-     * side (i.e. a programming style not bothering checking return codes).
-     */
-    *ppvResponse = NULL;
-    *pcb         = 0;
-
-    /*
-     * Set the busy flag (paranoia).
-     */
-    bool fBusy = ASMAtomicXchgBool(&pThis->fBusy, true);
-    AssertReturn(!fBusy, VERR_WRONG_ORDER);
-
-    /*
-     * Reset the state and apply settings.
-     */
-    pThis->fAbort = false;
-    pThis->rcOutput = VINF_SUCCESS;
-    pThis->cbDownloadHint = 0;
-
-    int rc = rtHttpApplySettings(hHttp, pszUrl);
-    if (RT_SUCCESS(rc))
-    {
-        RT_ZERO(pThis->Output.Mem);
-        int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEFUNCTION, &rtHttpWriteData);
-        if (!CURL_FAILURE(rcCurl))
-            rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEDATA, (void *)pThis);
-        if (!CURL_FAILURE(rcCurl))
-        {
-            /*
-             * Perform the HTTP operation.
-             */
-            rcCurl = curl_easy_perform(pThis->pCurl);
-            rc = rtHttpGetCalcStatus(pThis, rcCurl);
-            if (RT_SUCCESS(rc))
-                rc = pThis->rcOutput;
-            if (RT_SUCCESS(rc))
-            {
-                *ppvResponse = pThis->Output.Mem.pb;
-                *pcb         = pThis->Output.Mem.cb;
-            }
-            else if (pThis->Output.Mem.pb)
-                RTMemFree(pThis->Output.Mem.pb);
-            RT_ZERO(pThis->Output.Mem);
-        }
-        else
-            rc = VERR_INTERNAL_ERROR_3;
-    }
-
-    ASMAtomicWriteBool(&pThis->fBusy, false);
-    return rc;
-}
-
-
-RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pszUrl, char **ppszNotUtf8)
-{
-    uint8_t *pv;
-    size_t   cb;
-    int rc = rtHttpGetToMem(hHttp, pszUrl, &pv, &cb);
-    if (RT_SUCCESS(rc))
-    {
-        if (pv) /* paranoia */
-            *ppszNotUtf8 = (char *)pv;
-        else
-            *ppszNotUtf8 = (char *)RTMemDup("", 1);
-    }
-    else
-        *ppszNotUtf8 = NULL;
-    return rc;
-}
-
-
-RTR3DECL(void) RTHttpFreeResponseText(char *pszNotUtf8)
-{
-    RTMemFree(pszNotUtf8);
-}
-
-
-RTR3DECL(int) RTHttpGetBinary(RTHTTP hHttp, const char *pszUrl, void **ppvResponse, size_t *pcb)
-{
-    return rtHttpGetToMem(hHttp, pszUrl, (uint8_t **)ppvResponse, pcb);
-}
-
-
-RTR3DECL(void) RTHttpFreeResponse(void *pvResponse)
-{
-    RTMemFree(pvResponse);
-}
-
-
-/**
- * cURL callback for writing data to a file.
- */
-static size_t rtHttpWriteDataToFile(void *pvBuf, size_t cbUnit, size_t cUnits, void *pvUser)
-{
-    PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)pvUser;
-    size_t cbWritten = 0;
-    int rc = RTFileWrite(pThis->Output.hFile, pvBuf, cbUnit * cUnits, &cbWritten);
-    if (RT_SUCCESS(rc))
-        return cbWritten;
-    pThis->rcOutput = rc;
-    return 0;
-}
-
-
-RTR3DECL(int) RTHttpGetFile(RTHTTP hHttp, const char *pszUrl, const char *pszDstFile)
-{
-    PRTHTTPINTERNAL pThis = hHttp;
-    RTHTTP_VALID_RETURN(pThis);
-
-    /*
-     * Set the busy flag (paranoia).
-     */
-    bool fBusy = ASMAtomicXchgBool(&pThis->fBusy, true);
-    AssertReturn(!fBusy, VERR_WRONG_ORDER);
-
-    /*
-     * Reset the state and apply settings.
-     */
-    pThis->fAbort = false;
-    pThis->rcOutput = VINF_SUCCESS;
-    pThis->cbDownloadHint = 0;
-
-    int rc = rtHttpApplySettings(hHttp, pszUrl);
-    if (RT_SUCCESS(rc))
-    {
-        pThis->Output.hFile = NIL_RTFILE;
-        int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEFUNCTION, &rtHttpWriteDataToFile);
-        if (!CURL_FAILURE(rcCurl))
-            rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEDATA, (void *)pThis);
-        if (!CURL_FAILURE(rcCurl))
-        {
-            /*
-             * Open the output file.
-             */
-            rc = RTFileOpen(&pThis->Output.hFile, pszDstFile, RTFILE_O_CREATE_REPLACE | RTFILE_O_WRITE | RTFILE_O_DENY_READWRITE);
-            if (RT_SUCCESS(rc))
-            {
-                /*
-                 * Perform the HTTP operation.
-                 */
-                rcCurl = curl_easy_perform(pThis->pCurl);
-                rc = rtHttpGetCalcStatus(pThis, rcCurl);
-                if (RT_SUCCESS(rc))
-                     rc = pThis->rcOutput;
-
-                int rc2 = RTFileClose(pThis->Output.hFile);
-                if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
-                    rc = rc2;
-            }
-            pThis->Output.hFile = NIL_RTFILE;
-        }
-        else
-            rc = VERR_INTERNAL_ERROR_3;
-    }
-
-    ASMAtomicWriteBool(&pThis->fBusy, false);
-    return rc;
-}
-
diff --git a/src/VBox/Runtime/common/misc/uri.cpp b/src/VBox/Runtime/common/misc/uri.cpp
index 6bc8b05..85fc1aa 100644
--- a/src/VBox/Runtime/common/misc/uri.cpp
+++ b/src/VBox/Runtime/common/misc/uri.cpp
@@ -30,10 +30,18 @@
 *********************************************************************************************************************************/
 #include <iprt/uri.h>
 
-#include <iprt/string.h>
-#include <iprt/mem.h>
+#include <iprt/assert.h>
+#include <iprt/ctype.h>
 #include <iprt/path.h>
-#include <iprt/stream.h>
+#include <iprt/string.h>
+
+
+/*********************************************************************************************************************************
+*   Defined Constants And Macros                                                                                                 *
+*********************************************************************************************************************************/
+/** Internal magic value we use to check if a RTURIPARSED structure has made it thru RTUriParse. */
+#define RTURIPARSED_MAGIC   UINT32_C(0x439e0745)
+
 
 /* General URI format:
 
@@ -47,22 +55,19 @@
 */
 
 
-/*********************************************************************************************************************************
-*   Private RTUri helper                                                                                                         *
-*********************************************************************************************************************************/
-
-/* The following defines characters which have to be % escaped:
-   control = 00-1F
-   space   = ' '
-   delims  = '<' , '>' , '#' , '%' , '"'
-   unwise  = '{' , '}' , '|' , '\' , '^' , '[' , ']' , '`'
-*/
+/**
+ * The following defines characters which have to be % escaped:
+ *  control = 00-1F
+ *  space   = ' '
+ *  delims  = '<' , '>' , '#' , '%' , '"'
+ *  unwise  = '{' , '}' , '|' , '\' , '^' , '[' , ']' , '`'
+ */
 #define URI_EXCLUDED(a) \
-     ((a) >= 0x0  && (a) <= 0x20) \
-  || ((a) >= 0x5B && (a) <= 0x5E) \
-  || ((a) >= 0x7B && (a) <= 0x7D) \
-  || (a) == '<' || (a) == '>' || (a) == '#' \
-  || (a) == '%' || (a) == '"' || (a) == '`'
+  (   ((a) >= 0x0  && (a) <= 0x20) \
+   || ((a) >= 0x5B && (a) <= 0x5E) \
+   || ((a) >= 0x7B && (a) <= 0x7D) \
+   || (a) == '<' || (a) == '>' || (a) == '#' \
+   || (a) == '%' || (a) == '"' || (a) == '`' )
 
 static char *rtUriPercentEncodeN(const char *pszString, size_t cchMax)
 {
@@ -73,13 +78,14 @@ static char *rtUriPercentEncodeN(const char *pszString, size_t cchMax)
 
     size_t cbLen = RT_MIN(strlen(pszString), cchMax);
     /* The new string can be max 3 times in size of the original string. */
-    char *pszNew = (char*)RTMemAlloc(cbLen * 3 + 1);
+    char *pszNew = RTStrAlloc(cbLen * 3 + 1);
     if (!pszNew)
         return NULL;
+
     char *pszRes = NULL;
     size_t iIn = 0;
     size_t iOut = 0;
-    while(iIn < cbLen)
+    while (iIn < cbLen)
     {
         if (URI_EXCLUDED(pszString[iIn]))
         {
@@ -111,196 +117,470 @@ static char *rtUriPercentEncodeN(const char *pszString, size_t cchMax)
     return pszRes;
 }
 
-static char *rtUriPercentDecodeN(const char *pszString, size_t cchMax)
-{
-    if (!pszString)
-        return NULL;
 
-    int rc = VINF_SUCCESS;
-    size_t cbLen = RT_MIN(strlen(pszString), cchMax);
-    /* The new string can only get smaller. */
-    char *pszNew = (char*)RTMemAlloc(cbLen + 1);
-    if (!pszNew)
-        return NULL;
-    char *pszRes = NULL;
-    size_t iIn = 0;
-    size_t iOut = 0;
-    while(iIn < cbLen)
+static char *rtUriPercentDecodeN(const char *pszString, size_t cchString)
+{
+    AssertPtr(pszString);
+    Assert(strlen(pszString) >= cchString);
+
+    /*
+     * The new string can only get smaller, so use the input length as a
+     * staring buffer size.
+     */
+    char *pszDecoded = RTStrAlloc(cchString + 1);
+    if (pszDecoded)
     {
-        if (pszString[iIn] == '%')
+        /*
+         * Knowing that the pszString itself is valid UTF-8, we only have to
+         * validate the escape sequences.
+         */
+        size_t      cchLeft = cchString;
+        char const *pchSrc  = pszString;
+        char       *pchDst  = pszDecoded;
+        while (cchLeft > 0)
         {
-            /* % encoding means the percent sign and exactly 2 hexadecimal
-             * digits describing the ASCII number of the character. */
-            ++iIn;
-            char szNum[3];
-            szNum[0] = pszString[iIn++];
-            szNum[1] = pszString[iIn++];
-            szNum[2] = '\0';
-
-            uint8_t u8;
-            rc = RTStrToUInt8Ex(szNum, NULL, 16, &u8);
-            if (RT_FAILURE(rc))
+            const char *pchPct = (const char *)memchr(pchSrc, '%', cchLeft);
+            if (pchPct)
+            {
+                size_t cchBefore = pchPct - pchSrc;
+                if (cchBefore)
+                {
+                    memcpy(pchDst, pchSrc, cchBefore);
+                    pchDst  += cchBefore;
+                    pchSrc  += cchBefore;
+                    cchLeft -= cchBefore;
+                }
+
+                char chHigh, chLow;
+                if (   cchLeft >= 3
+                    && RT_C_IS_XDIGIT(chHigh = pchSrc[1])
+                    && RT_C_IS_XDIGIT(chLow  = pchSrc[2]))
+                {
+                    uint8_t b = RT_C_IS_DIGIT(chHigh) ? chHigh - '0' : (chHigh & ~0x20) - 'A' + 10;
+                    b <<= 4;
+                    b |= RT_C_IS_DIGIT(chLow) ? chLow - '0' : (chLow & ~0x20) - 'A' + 10;
+                    *pchDst++ = (char)b;
+                    pchSrc  += 3;
+                    cchLeft -= 3;
+                }
+                else
+                {
+                    AssertFailed();
+                    *pchDst++ = *pchSrc++;
+                    cchLeft--;
+                }
+            }
+            else
+            {
+                memcpy(pchDst, pchSrc, cchLeft);
+                pchDst += cchLeft;
+                pchSrc += cchLeft;
+                cchLeft = 0;
                 break;
-            pszNew[iOut] = u8;
+            }
         }
-        else
-            pszNew[iOut] = pszString[iIn++];
-        ++iOut;
+
+        *pchDst = '\0';
+
+        /*
+         * If we've got lof space room in the result string, reallocate it.
+         */
+        size_t cchDecoded = pchDst - pszDecoded;
+        Assert(cchDecoded <= cchString);
+        // if (cchString - cchDecoded > 64)  -  enable later!
+            RTStrRealloc(&pszDecoded, cchDecoded + 1);
     }
-    if (RT_SUCCESS(rc))
+    return pszDecoded;
+}
+
+
+static int rtUriParse(const char *pszUri, PRTURIPARSED pParsed)
+{
+    /*
+     * Validate the input and clear the output.
+     */
+    AssertPtrReturn(pParsed, VERR_INVALID_POINTER);
+    RT_ZERO(*pParsed);
+    pParsed->uAuthorityPort = UINT32_MAX;
+
+    AssertPtrReturn(pszUri, VERR_INVALID_POINTER);
+
+    size_t const cchUri = strlen(pszUri);
+    if (RT_LIKELY(cchUri >= 3)) { /* likely */ }
+    else return cchUri ? VERR_URI_TOO_SHORT : VERR_URI_EMPTY;
+
+    /*
+     * Validating escaped text sequences is much simpler if we know that
+     * that the base URI string is valid.  Also, we don't necessarily trust
+     * the developer calling us to remember to do this.
+     */
+    int rc = RTStrValidateEncoding(pszUri);
+    AssertRCReturn(rc, rc);
+
+    /*
+     * RFC-3986, section 3.1:
+     *      scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+     *
+     * The scheme ends with a ':', which we also skip here.
+     */
+    size_t off = 0;
+    char ch = pszUri[off++];
+    if (RT_LIKELY(RT_C_IS_ALPHA(ch))) { /* likely */ }
+    else return VERR_URI_INVALID_SCHEME;
+    for (;;)
     {
-        pszNew[iOut] = '\0';
-        if (iOut != iIn)
+        ch = pszUri[off];
+        if (ch == ':')
+            break;
+        if (RT_LIKELY(RT_C_IS_ALNUM(ch) || ch == '.' || ch == '-' || ch == '+')) { /* likely */ }
+        else return VERR_URI_INVALID_SCHEME;
+        off++;
+    }
+    pParsed->cchScheme = off;
+
+    /* Require the scheme length to be at least two chars so we won't confuse
+       it with a path starting with a DOS drive letter specification. */
+    if (RT_LIKELY(off >= 2)) { /* likely */ }
+    else return VERR_URI_INVALID_SCHEME;
+
+    off++;                              /* (skip colon) */
+
+    /*
+     * Find the end of the path, we'll need this several times.
+     * Also, while we're potentially scanning the whole thing, check for '%'.
+     */
+    size_t const offHash         = RTStrOffCharOrTerm(&pszUri[off], '#') + off;
+    size_t const offQuestionMark = RTStrOffCharOrTerm(&pszUri[off], '?') + off;
+
+    if (memchr(pszUri, '%', cchUri) != NULL)
+        pParsed->fFlags |= RTURIPARSED_F_CONTAINS_ESCAPED_CHARS;
+
+    /*
+     * RFC-3986, section 3.2:
+     *      The authority component is preceeded by a double slash ("//")...
+     */
+    if (   pszUri[off] == '/'
+        && pszUri[off + 1] == '/')
+    {
+        off += 2;
+        pParsed->offAuthority = pParsed->offAuthorityUsername = pParsed->offAuthorityPassword = pParsed->offAuthorityHost = off;
+        pParsed->fFlags |= RTURIPARSED_F_HAVE_AUTHORITY;
+
+        /*
+         * RFC-3986, section 3.2:
+         *      ...and is terminated by the next slash ("/"), question mark ("?"),
+         *       or number sign ("#") character, or by the end of the URI.
+         */
+        const char *pszAuthority = &pszUri[off];
+        size_t      cchAuthority = RTStrOffCharOrTerm(pszAuthority, '/');
+        cchAuthority = RT_MIN(cchAuthority, offHash - off);
+        cchAuthority = RT_MIN(cchAuthority, offQuestionMark - off);
+        pParsed->cchAuthority     = cchAuthority;
+
+        /* The Authority can be empty, like for: file:///usr/bin/grep  */
+        if (cchAuthority > 0)
         {
-            /* If the source and target strings have different size, recreate
-             * the target string with the correct size. */
-            pszRes = RTStrDupN(pszNew, iOut);
-            RTStrFree(pszNew);
+            pParsed->cchAuthorityHost = cchAuthority;
+
+            /*
+             * If there is a userinfo part, it is ended by a '@'.
+             */
+            const char *pszAt = (const char *)memchr(pszAuthority, '@', cchAuthority);
+            if (pszAt)
+            {
+                size_t cchTmp = pszAt - pszAuthority;
+                pParsed->offAuthorityHost += cchTmp + 1;
+                pParsed->cchAuthorityHost -= cchTmp + 1;
+
+                /* If there is a password part, it's separated from the username with a colon. */
+                const char *pszColon = (const char *)memchr(pszAuthority, ':', cchTmp);
+                if (pszColon)
+                {
+                    pParsed->cchAuthorityUsername = pszColon - pszAuthority;
+                    pParsed->offAuthorityPassword = &pszColon[1] - pszUri;
+                    pParsed->cchAuthorityPassword = pszAt - &pszColon[1];
+                }
+                else
+                {
+                    pParsed->cchAuthorityUsername = cchTmp;
+                    pParsed->offAuthorityPassword = off + cchTmp;
+                }
+            }
+
+            /*
+             * If there is a port part, its after the last colon in the host part.
+             */
+            const char *pszColon = (const char *)memrchr(&pszUri[pParsed->offAuthorityHost], ':', pParsed->cchAuthorityHost);
+            if (pszColon)
+            {
+                size_t cchTmp = &pszUri[pParsed->offAuthorityHost + pParsed->cchAuthorityHost] - &pszColon[1];
+                pParsed->cchAuthorityHost -= cchTmp + 1;
+
+                pParsed->uAuthorityPort = 0;
+                while (cchTmp-- > 0)
+                {
+                    ch = *++pszColon;
+                    if (   RT_C_IS_DIGIT(ch)
+                        && pParsed->uAuthorityPort < UINT32_MAX / UINT32_C(10))
+                    {
+                        pParsed->uAuthorityPort *= 10;
+                        pParsed->uAuthorityPort += ch - '0';
+                    }
+                    else
+                        return VERR_URI_INVALID_PORT_NUMBER;
+                }
+            }
         }
-        else
-            pszRes = pszNew;
+
+        /* Skip past the authority. */
+        off += cchAuthority;
     }
     else
-        RTStrFree(pszNew);
+        pParsed->offAuthority = pParsed->offAuthorityUsername = pParsed->offAuthorityPassword = pParsed->offAuthorityHost = off;
+
+    /*
+     * RFC-3986, section 3.3: Path
+     *      The path is terminated by the first question mark ("?")
+     *      or number sign ("#") character, or by the end of the URI.
+     */
+    pParsed->offPath = off;
+    pParsed->cchPath = RT_MIN(offHash, offQuestionMark) - off;
+    off += pParsed->cchPath;
+
+    /*
+     * RFC-3986, section 3.4: Query
+     *      The query component is indicated by the first question mark ("?")
+     *      character and terminated by a number sign ("#") character or by the
+     *      end of the URI.
+     */
+    if (   off == offQuestionMark
+        && off < cchUri)
+    {
+        Assert(pszUri[offQuestionMark] == '?');
+        pParsed->offQuery = ++off;
+        pParsed->cchQuery = offHash - off;
+        off = offHash;
+    }
+    else
+    {
+        Assert(!pszUri[offQuestionMark]);
+        pParsed->offQuery = off;
+    }
 
-    return pszRes;
-}
+    /*
+     * RFC-3986, section 3.5: Fragment
+     *      A fragment identifier component is indicated by the presence of a
+     *      number sign ("#") character and terminated by the end of the URI.
+     */
+    if (   off == offHash
+        && off < cchUri)
+    {
+        pParsed->offFragment = ++off;
+        pParsed->cchFragment = cchUri - off;
+    }
+    else
+    {
+        Assert(!pszUri[offHash]);
+        pParsed->offFragment = off;
+    }
 
-static bool rtUriFindSchemeEnd(const char *pszUri, size_t iStart, size_t cbLen, size_t *piEnd)
-{
-    size_t i = iStart;
-    /* The scheme has to end with ':'. */
-    while(i < iStart + cbLen)
+    /*
+     * If there are any escape sequences, validate them.
+     *
+     * This is reasonably simple as we already know that the string is valid UTF-8
+     * before they get decoded.  Thus we only have to validate the escaped sequences.
+     */
+    if (pParsed->fFlags & RTURIPARSED_F_CONTAINS_ESCAPED_CHARS)
     {
-        if (pszUri[i] == ':')
+        const char *pchSrc  = (const char *)memchr(pszUri, '%', cchUri);
+        AssertReturn(pchSrc, VERR_INTERNAL_ERROR);
+        do
         {
-            *piEnd = i;
-            return true;
-        }
-        ++i;
+            char        szUtf8Seq[8];
+            unsigned    cchUtf8Seq = 0;
+            unsigned    cchNeeded  = 0;
+            size_t      cchLeft    = &pszUri[cchUri] - pchSrc;
+            do
+            {
+                if (cchLeft >= 3)
+                {
+                    char chHigh = pchSrc[1];
+                    char chLow  = pchSrc[2];
+                    if (   RT_C_IS_XDIGIT(chHigh)
+                        && RT_C_IS_XDIGIT(chLow))
+                    {
+                        uint8_t b = RT_C_IS_DIGIT(chHigh) ? chHigh - '0' : (chHigh & ~0x20) - 'A' + 10;
+                        b <<= 4;
+                        b |= RT_C_IS_DIGIT(chLow) ? chLow - '0' : (chLow & ~0x20) - 'A' + 10;
+
+                        if (!(b & 0x80))
+                        {
+                            /* We don't want the string to be terminated prematurely. */
+                            if (RT_LIKELY(b != 0)) { /* likely */ }
+                            else return VERR_URI_ESCAPED_ZERO;
+
+                            /* Check that we're not expecting more UTF-8 bytes. */
+                            if (RT_LIKELY(cchNeeded == 0)) { /* likely */ }
+                            else return VERR_URI_MISSING_UTF8_CONTINUATION_BYTE;
+                        }
+                        /* Are we waiting UTF-8 bytes? */
+                        else if (cchNeeded > 0)
+                        {
+                            if (RT_LIKELY(!(b & 0x40))) { /* likely */ }
+                            else return VERR_URI_INVALID_ESCAPED_UTF8_CONTINUATION_BYTE;
+
+                            szUtf8Seq[cchUtf8Seq++] = (char)b;
+                            if (--cchNeeded == 0)
+                            {
+                                szUtf8Seq[cchUtf8Seq] = '\0';
+                                rc = RTStrValidateEncoding(szUtf8Seq);
+                                if (RT_FAILURE(rc))
+                                    return VERR_URI_ESCAPED_CHARS_NOT_VALID_UTF8;
+                                cchUtf8Seq = 0;
+                            }
+                        }
+                        /* Start a new UTF-8 sequence. */
+                        else
+                        {
+                            if ((b & 0xf8) == 0xf0)
+                                cchNeeded = 3;
+                            else if ((b & 0xf0) == 0xe0)
+                                cchNeeded = 2;
+                            else if ((b & 0xe0) == 0xc0)
+                                cchNeeded = 1;
+                            else
+                                return VERR_URI_INVALID_ESCAPED_UTF8_LEAD_BYTE;
+                            szUtf8Seq[0] = (char)b;
+                            cchUtf8Seq = 1;
+                        }
+                        pchSrc  += 3;
+                        cchLeft -= 3;
+                    }
+                    else
+                        return VERR_URI_INVALID_ESCAPE_SEQ;
+                }
+                else
+                    return VERR_URI_INVALID_ESCAPE_SEQ;
+            } while (cchLeft > 0 && pchSrc[0] == '%');
+
+            /* Check that we're not expecting more UTF-8 bytes. */
+            if (RT_LIKELY(cchNeeded == 0)) { /* likely */ }
+            else return VERR_URI_MISSING_UTF8_CONTINUATION_BYTE;
+
+            /* next */
+            pchSrc = (const char *)memchr(pchSrc, '%', cchLeft);
+        } while (pchSrc);
     }
-    return false;
+
+    pParsed->u32Magic = RTURIPARSED_MAGIC;
+    return VINF_SUCCESS;
 }
 
-static bool rtUriCheckAuthorityStart(const char *pszUri, size_t iStart, size_t cbLen, size_t *piStart)
+
+
+RTDECL(int) RTUriParse(const char *pszUri, PRTURIPARSED pParsed)
 {
-    /* The authority have to start with '//' */
-    if (   cbLen >= 2
-        && pszUri[iStart    ] == '/'
-        && pszUri[iStart + 1] == '/')
-    {
-        *piStart = iStart + 2;
-        return true;
-    }
+    return rtUriParse(pszUri, pParsed);
+}
+
 
-    return false;
+RTDECL(char *) RTUriParsedScheme(const char *pszUri, PCRTURIPARSED pParsed)
+{
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    return RTStrDupN(pszUri, pParsed->cchScheme);
 }
 
-static bool rtUriFindAuthorityEnd(const char *pszUri, size_t iStart, size_t cbLen, size_t *piEnd)
+
+RTDECL(char *) RTUriParsedAuthority(const char *pszUri, PCRTURIPARSED pParsed)
 {
-    size_t i = iStart;
-    /* The authority can end with '/' || '?' || '#'. */
-    while(i < iStart + cbLen)
-    {
-        if (   pszUri[i] == '/'
-            || pszUri[i] == '?'
-            || pszUri[i] == '#')
-        {
-            *piEnd = i;
-            return true;
-        }
-        ++i;
-    }
-    return false;
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    if (pParsed->cchAuthority || (pParsed->fFlags & RTURIPARSED_F_HAVE_AUTHORITY))
+        return rtUriPercentDecodeN(&pszUri[pParsed->offAuthority], pParsed->cchAuthority);
+    return NULL;
 }
 
-static bool rtUriCheckPathStart(const char *pszUri, size_t iStart, size_t cbLen, size_t *piStart)
+
+RTDECL(char *) RTUriParsedAuthorityUsername(const char *pszUri, PCRTURIPARSED pParsed)
 {
-    /* The path could start with a '/'. */
-    if (   cbLen >= 1
-        && pszUri[iStart] == '/')
-    {
-        *piStart = iStart; /* Including '/' */
-        return true;
-    }
-    /* '?' || '#' means there is no path. */
-    if (   cbLen >= 1
-        && (   pszUri[iStart] == '?'
-            || pszUri[iStart] == '#'))
-        return false;
-    /* All other values are allowed. */
-    *piStart = iStart;
-    return true;
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    if (pParsed->cchAuthorityUsername)
+        return rtUriPercentDecodeN(&pszUri[pParsed->offAuthorityUsername], pParsed->cchAuthorityUsername);
+    return NULL;
 }
 
-static bool rtUriFindPathEnd(const char *pszUri, size_t iStart, size_t cbLen, size_t *piEnd)
+
+RTDECL(char *) RTUriParsedAuthorityPassword(const char *pszUri, PCRTURIPARSED pParsed)
 {
-    size_t i = iStart;
-    /* The path can end with '?' || '#'. */
-    while(i < iStart + cbLen)
-    {
-        if (   pszUri[i] == '?'
-            || pszUri[i] == '#')
-        {
-            *piEnd = i;
-            return true;
-        }
-        ++i;
-    }
-    return false;
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    if (pParsed->cchAuthorityPassword)
+        return rtUriPercentDecodeN(&pszUri[pParsed->offAuthorityPassword], pParsed->cchAuthorityPassword);
+    return NULL;
 }
 
-static bool rtUriCheckQueryStart(const char *pszUri, size_t iStart, size_t cbLen, size_t *piStart)
+
+RTDECL(char *) RTUriParsedAuthorityHost(const char *pszUri, PCRTURIPARSED pParsed)
 {
-    /* The query start with a '?'. */
-    if (   cbLen >= 1
-        && pszUri[iStart] == '?')
-    {
-        *piStart = iStart + 1; /* Excluding '?' */
-        return true;
-    }
-    return false;
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    if (pParsed->cchAuthorityHost)
+        return rtUriPercentDecodeN(&pszUri[pParsed->offAuthorityHost], pParsed->cchAuthorityHost);
+    return NULL;
 }
 
-static bool rtUriFindQueryEnd(const char *pszUri, size_t iStart, size_t cbLen, size_t *piEnd)
+
+RTDECL(uint32_t) RTUriParsedAuthorityPort(const char *pszUri, PCRTURIPARSED pParsed)
 {
-    size_t i = iStart;
-    /* The query can end with '?' || '#'. */
-    while(i < iStart + cbLen)
-    {
-        if (pszUri[i] == '#')
-        {
-            *piEnd = i;
-            return true;
-        }
-        ++i;
-    }
-    return false;
+    AssertPtrReturn(pszUri, UINT32_MAX);
+    AssertPtrReturn(pParsed, UINT32_MAX);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, UINT32_MAX);
+    return pParsed->uAuthorityPort;
 }
 
-static bool rtUriCheckFragmentStart(const char *pszUri, size_t iStart, size_t cbLen, size_t *piStart)
+
+RTDECL(char *) RTUriParsedPath(const char *pszUri, PCRTURIPARSED pParsed)
 {
-    /* The fragment start with a '#'. */
-    if (   cbLen >= 1
-        && pszUri[iStart] == '#')
-    {
-        *piStart = iStart + 1; /* Excluding '#' */
-        return true;
-    }
-    return false;
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    if (pParsed->cchPath)
+        return rtUriPercentDecodeN(&pszUri[pParsed->offPath], pParsed->cchPath);
+    return NULL;
 }
 
 
-/*********************************************************************************************************************************
-*   Public RTUri interface                                                                                                       *
-*********************************************************************************************************************************/
+RTDECL(char *) RTUriParsedQuery(const char *pszUri, PCRTURIPARSED pParsed)
+{
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    if (pParsed->cchQuery)
+        return rtUriPercentDecodeN(&pszUri[pParsed->offQuery], pParsed->cchQuery);
+    return NULL;
+}
 
 
-/*********************************************************************************************************************************
-*   Generic Uri methods                                                                                                          *
-*********************************************************************************************************************************/
+RTDECL(char *) RTUriParsedFragment(const char *pszUri, PCRTURIPARSED pParsed)
+{
+    AssertPtrReturn(pszUri, NULL);
+    AssertPtrReturn(pParsed, NULL);
+    AssertReturn(pParsed->u32Magic == RTURIPARSED_MAGIC, NULL);
+    if (pParsed->cchFragment)
+        return rtUriPercentDecodeN(&pszUri[pParsed->offFragment], pParsed->cchFragment);
+    return NULL;
+}
 
-RTR3DECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery, const char *pszFragment)
+
+RTDECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery,
+                           const char *pszFragment)
 {
     if (!pszScheme) /* Scheme is minimum requirement */
         return NULL;
@@ -345,9 +625,11 @@ RTR3DECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, co
             cbSize += strlen(pszFragment1) + 1;
         }
 
-        char *pszTmp = pszResult = (char*)RTMemAllocZ(cbSize);
+        char *pszTmp = pszResult = (char *)RTStrAlloc(cbSize);
         if (!pszResult)
             break;
+        RT_BZERO(pszTmp, cbSize);
+
         /* Compose the target uri string. */
         RTStrCatP(&pszTmp, &cbSize, pszScheme);
         RTStrCatP(&pszTmp, &cbSize, ":");
@@ -370,7 +652,7 @@ RTR3DECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, co
             RTStrCatP(&pszTmp, &cbSize, "#");
             RTStrCatP(&pszTmp, &cbSize, pszFragment1);
         }
-    }while (0);
+    } while (0);
 
     /* Cleanup */
     if (pszAuthority1)
@@ -385,307 +667,103 @@ RTR3DECL(char *) RTUriCreate(const char *pszScheme, const char *pszAuthority, co
     return pszResult;
 }
 
-RTR3DECL(bool)   RTUriHasScheme(const char *pszUri, const char *pszScheme)
-{
-    bool fRes = false;
-    char *pszTmp = RTUriScheme(pszUri);
-    if (pszTmp)
-    {
-        fRes = RTStrNICmp(pszScheme, pszTmp, strlen(pszTmp)) == 0;
-        RTStrFree(pszTmp);
-    }
-    return fRes;
-}
 
-RTR3DECL(char *) RTUriScheme(const char *pszUri)
+RTDECL(bool)   RTUriIsSchemeMatch(const char *pszUri, const char *pszScheme)
 {
-    AssertPtrReturn(pszUri, NULL);
-
-    size_t iPos1;
-    size_t cbLen = strlen(pszUri);
-    if (rtUriFindSchemeEnd(pszUri, 0, cbLen, &iPos1))
-        return rtUriPercentDecodeN(pszUri, iPos1);
-    return NULL;
+    AssertPtrReturn(pszUri, false);
+    size_t const cchScheme = strlen(pszScheme);
+    return RTStrNICmp(pszUri, pszScheme, cchScheme) == 0
+        && pszUri[cchScheme] == ':';
 }
 
-RTR3DECL(char *) RTUriAuthority(const char *pszUri)
-{
-    AssertPtrReturn(pszUri, NULL);
-
-    size_t iPos1;
-    size_t cbLen = strlen(pszUri);
-    /* Find the end of the scheme. */
-    if (!rtUriFindSchemeEnd(pszUri, 0, cbLen, &iPos1))
-        return NULL; /* no URI */
-    else
-        ++iPos1; /* Skip ':' */
 
-    size_t iPos2;
-    /* Find the start of the authority. */
-    if (rtUriCheckAuthorityStart(pszUri, iPos1, cbLen - iPos1, &iPos2))
-    {
-        size_t iPos3 = cbLen;
-        /* Find the end of the authority. If not found, the rest of the string
-         * is used. */
-        rtUriFindAuthorityEnd(pszUri, iPos2, cbLen - iPos2, &iPos3);
-        if (iPos3 > iPos2) /* Length check */
-            return rtUriPercentDecodeN(&pszUri[iPos2], iPos3 - iPos2);
-        else
-            return NULL;
-    }
-    return NULL;
-}
-
-RTR3DECL(char *) RTUriPath(const char *pszUri)
+/* temporarily kept around till Andy stops using it. */
+RTDECL(char *) RTUriPath(const char *pszUri)
 {
-    AssertPtrReturn(pszUri, NULL);
-
-    size_t iPos1;
-    size_t cbLen = strlen(pszUri);
-    /* Find the end of the scheme. */
-    if (!rtUriFindSchemeEnd(pszUri, 0, cbLen, &iPos1))
-        return NULL; /* no URI */
-    else
-        ++iPos1; /* Skip ':' */
-
-    size_t iPos2;
-    size_t iPos3 = iPos1; /* Skip if no authority is found */
-    /* Find the start of the authority. */
-    if (rtUriCheckAuthorityStart(pszUri, iPos1, cbLen - iPos1, &iPos2))
-    {
-        /* Find the end of the authority. If not found, then there is no path
-         * component, cause the authority is the rest of the string. */
-        if (!rtUriFindAuthorityEnd(pszUri, iPos2, cbLen - iPos2, &iPos3))
-            return NULL; /* no path! */
-    }
-
-    size_t iPos4;
-    /* Find the start of the path */
-    if (rtUriCheckPathStart(pszUri, iPos3, cbLen - iPos3, &iPos4))
-    {
-        /* Search for the end of the scheme. */
-        size_t iPos5 = cbLen;
-        rtUriFindPathEnd(pszUri, iPos4, cbLen - iPos4, &iPos5);
-        if (iPos5 > iPos4) /* Length check */
-            return rtUriPercentDecodeN(&pszUri[iPos4], iPos5 - iPos4);
-    }
-
+    RTURIPARSED Parsed;
+    int rc = rtUriParse(pszUri, &Parsed);
+    if (RT_SUCCESS(rc))
+        if (Parsed.cchPath)
+            return rtUriPercentDecodeN(&pszUri[Parsed.offPath], Parsed.cchPath);
     return NULL;
 }
 
-RTR3DECL(char *) RTUriQuery(const char *pszUri)
-{
-    AssertPtrReturn(pszUri, NULL);
-
-    size_t iPos1;
-    size_t cbLen = strlen(pszUri);
-    /* Find the end of the scheme. */
-    if (!rtUriFindSchemeEnd(pszUri, 0, cbLen, &iPos1))
-        return NULL; /* no URI */
-    else
-        ++iPos1; /* Skip ':' */
-
-    size_t iPos2;
-    size_t iPos3 = iPos1; /* Skip if no authority is found */
-    /* Find the start of the authority. */
-    if (rtUriCheckAuthorityStart(pszUri, iPos1, cbLen - iPos1, &iPos2))
-    {
-        /* Find the end of the authority. If not found, then there is no path
-         * component, cause the authority is the rest of the string. */
-        if (!rtUriFindAuthorityEnd(pszUri, iPos2, cbLen - iPos2, &iPos3))
-            return NULL; /* no path! */
-    }
-
-    size_t iPos4;
-    size_t iPos5 = iPos3; /* Skip if no path is found */
-    /* Find the start of the path */
-    if (rtUriCheckPathStart(pszUri, iPos3, cbLen - iPos3, &iPos4))
-    {
-        /* Find the end of the path. If not found, then there is no query
-         * component, cause the path is the rest of the string. */
-        if (!rtUriFindPathEnd(pszUri, iPos4, cbLen - iPos4, &iPos5))
-            return NULL; /* no query! */
-    }
-
-    size_t iPos6;
-    /* Find the start of the query */
-    if (rtUriCheckQueryStart(pszUri, iPos5, cbLen - iPos5, &iPos6))
-    {
-        /* Search for the end of the query. */
-        size_t iPos7 = cbLen;
-        rtUriFindQueryEnd(pszUri, iPos6, cbLen - iPos6, &iPos7);
-        if (iPos7 > iPos6) /* Length check */
-            return rtUriPercentDecodeN(&pszUri[iPos6], iPos7 - iPos6);
-    }
-
-    return NULL;
-}
 
-RTR3DECL(char *) RTUriFragment(const char *pszUri)
+RTDECL(char *) RTUriFileCreate(const char *pszPath)
 {
-    AssertPtrReturn(pszUri, NULL);
-
-    size_t iPos1;
-    size_t cbLen = strlen(pszUri);
-    /* Find the end of the scheme. */
-    if (!rtUriFindSchemeEnd(pszUri, 0, cbLen, &iPos1))
-        return NULL; /* no URI */
-    else
-        ++iPos1; /* Skip ':' */
-
-    size_t iPos2;
-    size_t iPos3 = iPos1; /* Skip if no authority is found */
-    /* Find the start of the authority. */
-    if (rtUriCheckAuthorityStart(pszUri, iPos1, cbLen - iPos1, &iPos2))
-    {
-        /* Find the end of the authority. If not found, then there is no path
-         * component, cause the authority is the rest of the string. */
-        if (!rtUriFindAuthorityEnd(pszUri, iPos2, cbLen - iPos2, &iPos3))
-            return NULL; /* no path! */
-    }
-
-    size_t iPos4;
-    size_t iPos5 = iPos3; /* Skip if no path is found */
-    /* Find the start of the path */
-    if (rtUriCheckPathStart(pszUri, iPos3, cbLen - iPos3, &iPos4))
-    {
-        /* Find the end of the path. If not found, then there is no query
-         * component, cause the path is the rest of the string. */
-        if (!rtUriFindPathEnd(pszUri, iPos4, cbLen - iPos4, &iPos5))
-            return NULL; /* no query! */
-    }
-
-    size_t iPos6;
-    size_t iPos7 = iPos5; /* Skip if no query is found */
-    /* Find the start of the query */
-    if (rtUriCheckQueryStart(pszUri, iPos5, cbLen - iPos5, &iPos6))
-    {
-        /* Find the end of the query If not found, then there is no fragment
-         * component, cause the query is the rest of the string. */
-        if (!rtUriFindQueryEnd(pszUri, iPos6, cbLen - iPos6, &iPos7))
-            return NULL; /* no query! */
-    }
-
-
-    size_t iPos8;
-    /* Find the start of the fragment */
-    if (rtUriCheckFragmentStart(pszUri, iPos7, cbLen - iPos7, &iPos8))
+    char *pszResult = NULL;
+    if (pszPath)
     {
-        /* There could be nothing behind a fragment. So use the rest of the
-         * string. */
-        if (cbLen > iPos8) /* Length check */
-            return rtUriPercentDecodeN(&pszUri[iPos8], cbLen - iPos8);
+        /* Create the percent encoded strings and calculate the necessary uri length. */
+        char *pszPath1 = rtUriPercentEncodeN(pszPath, RTSTR_MAX);
+        if (pszPath1)
+        {
+            size_t cbSize = 7 /* file:// */ + strlen(pszPath1) + 1; /* plus zero byte */
+            if (pszPath1[0] != '/')
+                ++cbSize;
+            char *pszTmp = pszResult = RTStrAlloc(cbSize);
+            if (pszResult)
+            {
+                /* Compose the target uri string. */
+                *pszTmp = '\0';
+                RTStrCatP(&pszTmp, &cbSize, "file://");
+                if (pszPath1[0] != '/')
+                    RTStrCatP(&pszTmp, &cbSize, "/");
+                RTStrCatP(&pszTmp, &cbSize, pszPath1);
+            }
+            RTStrFree(pszPath1);
+        }
     }
-    return NULL;
-}
-
-
-/*********************************************************************************************************************************
-*   File Uri methods                                                                                                             *
-*********************************************************************************************************************************/
-
-RTR3DECL(char *) RTUriFileCreate(const char *pszPath)
-{
-    if (!pszPath)
-        return NULL;
-
-    char *pszResult = 0;
-    char *pszPath1 = 0;
-
-    do
-    {
-        /* Create the percent encoded strings and calculate the necessary uri
-         * length. */
-        pszPath1 = rtUriPercentEncodeN(pszPath, RTSTR_MAX);
-        if (!pszPath1)
-            break;
-        size_t cbSize = 7 /* file:// */ + strlen(pszPath1) + 1; /* plus zero byte */
-        if (pszPath1[0] != '/')
-            ++cbSize;
-        char *pszTmp = pszResult = (char*)RTMemAllocZ(cbSize);
-        if (!pszResult)
-            break;
-        /* Compose the target uri string. */
-        RTStrCatP(&pszTmp, &cbSize, "file://");
-        if (pszPath1[0] != '/')
-            RTStrCatP(&pszTmp, &cbSize, "/");
-        RTStrCatP(&pszTmp, &cbSize, pszPath1);
-    }while (0);
-
-    /* Cleanup */
-    if (pszPath1)
-        RTStrFree(pszPath1);
-
     return pszResult;
 }
 
-RTR3DECL(char *) RTUriFilePath(const char *pszUri, uint32_t uFormat)
+
+RTDECL(char *) RTUriFilePath(const char *pszUri, uint32_t uFormat)
 {
     return RTUriFileNPath(pszUri, uFormat, RTSTR_MAX);
 }
 
-RTR3DECL(char *) RTUriFileNPath(const char *pszUri, uint32_t uFormat, size_t cchMax)
+
+RTDECL(char *) RTUriFileNPath(const char *pszUri, uint32_t uFormat, size_t cchMax)
 {
     AssertPtrReturn(pszUri, NULL);
+    AssertReturn(uFormat == URI_FILE_FORMAT_AUTO || uFormat == URI_FILE_FORMAT_UNIX || uFormat == URI_FILE_FORMAT_WIN, NULL);
 
-    size_t iPos1;
-    size_t cbLen = RT_MIN(strlen(pszUri), cchMax);
-    /* Find the end of the scheme. */
-    if (!rtUriFindSchemeEnd(pszUri, 0, cbLen, &iPos1))
-        return NULL; /* no URI */
-    else
-        ++iPos1; /* Skip ':' */
+    /* Auto is based on the current OS. */
+    if (uFormat == URI_FILE_FORMAT_AUTO)
+#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
+        uFormat = URI_FILE_FORMAT_WIN;
+#else
+        uFormat = URI_FILE_FORMAT_UNIX;
+#endif
 
     /* Check that this is a file Uri */
-    if (RTStrNICmp(pszUri, "file:", iPos1) != 0)
+    if (RTStrNICmp(pszUri, RT_STR_TUPLE("file:")) != 0)
         return NULL;
 
-    size_t iPos2;
-    size_t iPos3 = iPos1; /* Skip if no authority is found */
-    /* Find the start of the authority. */
-    if (rtUriCheckAuthorityStart(pszUri, iPos1, cbLen - iPos1, &iPos2))
-    {
-        /* Find the end of the authority. If not found, then there is no path
-         * component, cause the authority is the rest of the string. */
-        if (!rtUriFindAuthorityEnd(pszUri, iPos2, cbLen - iPos2, &iPos3))
-            return NULL; /* no path! */
-    }
-
-    size_t iPos4;
-    /* Find the start of the path */
-    if (rtUriCheckPathStart(pszUri, iPos3, cbLen - iPos3, &iPos4))
+    RTURIPARSED Parsed;
+    int rc = rtUriParse(pszUri, &Parsed);
+    if (RT_SUCCESS(rc) && Parsed.cchPath)
     {
-        uint32_t uFIntern = uFormat;
-        /* Auto is based on the current OS. */
-        if (uFormat == URI_FILE_FORMAT_AUTO)
-#ifdef RT_OS_WINDOWS
-            uFIntern = URI_FILE_FORMAT_WIN;
-#else /* RT_OS_WINDOWS */
-            uFIntern = URI_FILE_FORMAT_UNIX;
-#endif /* !RT_OS_WINDOWS */
-
-        if (   uFIntern != URI_FILE_FORMAT_UNIX
-            && pszUri[iPos4] == '/')
-            ++iPos4;
-        /* Search for the end of the scheme. */
-        size_t iPos5 = cbLen;
-        rtUriFindPathEnd(pszUri, iPos4, cbLen - iPos4, &iPos5);
-        if (iPos5 > iPos4) /* Length check */
+        /* Special hack for DOS path like file:///c:/WINDOWS/clock.avi where we
+           have to drop the leading slash that was used to separate the authority
+           from the path. */
+        if (  uFormat == URI_FILE_FORMAT_WIN
+            && Parsed.cchPath >= 3
+            && pszUri[Parsed.offPath] == '/'
+            && pszUri[Parsed.offPath + 2] == ':'
+            && RT_C_IS_ALPHA(pszUri[Parsed.offPath + 1]) )
         {
-            char *pszPath = rtUriPercentDecodeN(&pszUri[iPos4], iPos5 - iPos4);
-            if (uFIntern == URI_FILE_FORMAT_UNIX)
-                return RTPathChangeToUnixSlashes(pszPath, true);
-            else if (uFIntern == URI_FILE_FORMAT_WIN)
-                return RTPathChangeToDosSlashes(pszPath, true);
-            else
-            {
-                RTStrFree(pszPath);
-                AssertMsgFailed(("Unknown uri file format %u", uFIntern));
-                return NULL;
-            }
+            Parsed.offPath++;
+            Parsed.cchPath--;
         }
-    }
 
+        char *pszPath = rtUriPercentDecodeN(&pszUri[Parsed.offPath], Parsed.cchPath);
+        if (uFormat == URI_FILE_FORMAT_UNIX)
+            return RTPathChangeToUnixSlashes(pszPath, true);
+        Assert(uFormat == URI_FILE_FORMAT_WIN);
+        return RTPathChangeToDosSlashes(pszPath, true);
+    }
     return NULL;
 }
 
diff --git a/src/VBox/Runtime/common/path/RTPathGlob.cpp b/src/VBox/Runtime/common/path/RTPathGlob.cpp
index 8e26b9f..7435151 100644
--- a/src/VBox/Runtime/common/path/RTPathGlob.cpp
+++ b/src/VBox/Runtime/common/path/RTPathGlob.cpp
@@ -44,6 +44,7 @@
 
 #if defined(RT_OS_WINDOWS)
 # include <Windows.h>
+# include "../../r3/win/internal-r3-win.h"
 
 #elif defined(RT_OS_OS2)
 # define INCL_BASE
@@ -499,8 +500,9 @@ static DECLCALLBACK(int) rtPathVarQuery_DosSystemDrive(uint32_t iItem, char *psz
 # ifdef RT_OS_WINDOWS
         /* Since this is used at the start of a pattern, we assume
            we've got more than enough buffer space. */
+        AssertReturn(g_pfnGetSystemWindowsDirectoryW, VERR_SYMBOL_NOT_FOUND);
         PRTUTF16 pwszTmp = (PRTUTF16)pszBuf;
-        UINT cch = GetSystemWindowsDirectoryW(pwszTmp, (UINT)(cbBuf / sizeof(WCHAR)));
+        UINT cch = g_pfnGetSystemWindowsDirectoryW(pwszTmp, (UINT)(cbBuf / sizeof(WCHAR)));
         if (cch >= 2)
         {
             RTUTF16 wcDrive = pwszTmp[0];
@@ -546,8 +548,9 @@ static DECLCALLBACK(int) rtPathVarQuery_WinSystemRoot(uint32_t iItem, char *pszB
     if (iItem == 0)
     {
         Assert(pszBuf); Assert(cbBuf);
+        AssertReturn(g_pfnGetSystemWindowsDirectoryW, VERR_SYMBOL_NOT_FOUND);
         RTUTF16 wszSystemRoot[MAX_PATH];
-        UINT cchSystemRoot = GetSystemWindowsDirectoryW(wszSystemRoot, MAX_PATH);
+        UINT cchSystemRoot = g_pfnGetSystemWindowsDirectoryW(wszSystemRoot, MAX_PATH);
         if (cchSystemRoot > 0)
             return RTUtf16ToUtf8Ex(wszSystemRoot, cchSystemRoot, &pszBuf, cbBuf, pcchValue);
         return RTErrConvertFromWin32(GetLastError());
@@ -1324,7 +1327,7 @@ static int rtPathGlobParse(PRTPATHGLOB pGlob, const char *pszPattern, PRTPATHPAR
     {
         AssertReturn(pParsed->aComps[0].cch < sizeof(pGlob->szPath) - 1, VERR_FILENAME_TOO_LONG);
         memcpy(pGlob->szPath, &pszPattern[pParsed->aComps[0].off], pParsed->aComps[0].cch);
-        pGlob->offFirstPath = pParsed->aComps[0].off;
+        pGlob->offFirstPath = pParsed->aComps[0].cch;
         pGlob->iFirstComp   = iComp = 1;
     }
     else
@@ -1698,7 +1701,7 @@ DECL_NO_INLINE(static, int) rtPathGlobExecRecursiveVarExp(PRTPATHGLOB pGlob, siz
         {
             Assert(pGlob->szPath[offPath + cch] == '\0');
 
-            int rc = RTPathQueryInfoEx(pGlob->szPath, &pGlob->u.ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK);
+            int rc = RTPathQueryInfoEx(pGlob->szPath, &pGlob->u.ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
             if (RT_SUCCESS(rc))
             {
                 if (pGlob->aComps[iComp].fFinal)
@@ -1793,7 +1796,7 @@ DECL_NO_INLINE(static, int) rtPathGlobExecRecursivePlainText(PRTPATHGLOB pGlob,
             /*
              * Check if it exists.
              */
-            int rc = RTPathQueryInfoEx(pGlob->szPath, &pGlob->u.ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK);
+            int rc = RTPathQueryInfoEx(pGlob->szPath, &pGlob->u.ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
             if (RT_SUCCESS(rc))
             {
                 if (pGlob->aComps[iComp].fFinal)
@@ -2006,7 +2009,7 @@ static int rtPathGlobExec(PRTPATHGLOB pGlob)
          * Special case where we only have a root component or tilde expansion.
          */
         Assert(pGlob->offFirstPath > 0);
-        rc = RTPathQueryInfoEx(pGlob->szPath, &pGlob->u.ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK);
+        rc = RTPathQueryInfoEx(pGlob->szPath, &pGlob->u.ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
         if (   RT_SUCCESS(rc)
             && rtPathGlobExecIsMatchFinalWithFileMode(pGlob, pGlob->u.ObjInfo.Attr.fMode))
             rc = rtPathGlobAddResult(pGlob, pGlob->offFirstPath,
@@ -2062,8 +2065,8 @@ RTDECL(int) RTPathGlob(const char *pszPattern, uint32_t fFlags, PPCRTPATHGLOBENT
     int rc = RTPathParse(pszPattern, pParsed, cbParsed, RTPATH_STR_F_STYLE_HOST);
     if (rc == VERR_BUFFER_OVERFLOW)
     {
-        RTMemTmpFree(pParsed);
         cbParsed = RT_OFFSETOF(RTPATHPARSED, aComps[pParsed->cComps + 1]);
+        RTMemTmpFree(pParsed);
         pParsed = (PRTPATHPARSED)RTMemTmpAlloc(cbParsed);
         AssertReturn(pParsed, VERR_NO_MEMORY);
 
diff --git a/src/VBox/Runtime/common/string/memrchr.asm b/src/VBox/Runtime/common/string/memrchr.asm
new file mode 100644
index 0000000..dbebb94
--- /dev/null
+++ b/src/VBox/Runtime/common/string/memrchr.asm
@@ -0,0 +1,90 @@
+; $Id: memrchr.asm $
+;; @file
+; IPRT - No-CRT memrchr - AMD64 & X86.
+;
+
+;
+; Copyright (C) 2006-2015 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; @param    pv      gcc: rdi  msc: ecx  x86:[esp+4]
+; @param    ch      gcc: esi  msc: edx  x86:[esp+8]
+; @param    cb      gcc: rdx  msc: r8   x86:[esp+0ch]
+RT_NOCRT_BEGINPROC memrchr
+        std
+%ifdef RT_ARCH_AMD64
+ %ifdef ASM_CALL64_MSC
+        or      r8, r8
+        jz      .not_found_early
+
+        mov     r9, rdi                 ; save rdi
+        mov     eax, edx
+        lea     rdi, [rcx + r8 - 1]
+        mov     rcx, r8
+ %else
+        mov     rcx, rdx
+        jrcxz   .not_found_early
+
+        mov     eax, esi
+        lea     rdi, [rdi + rcx - 1]
+ %endif
+
+%else
+        mov     ecx, [esp + 0ch]
+        jecxz   .not_found_early
+        mov     edx, edi                ; save edi
+        mov     eax, [esp + 8]
+        mov     edi, [esp + 4]
+        lea     edi, [edi + ecx - 1]
+%endif
+
+        ; do the search
+        repne   scasb
+        jne     .not_found
+
+        ; found it
+        lea     xAX, [xDI + 1]
+%ifdef ASM_CALL64_MSC
+        mov     rdi, r9
+%endif
+%ifdef RT_ARCH_X86
+        mov     edi, edx
+%endif
+        cld
+        ret
+
+.not_found:
+%ifdef ASM_CALL64_MSC
+        mov     rdi, r9
+%endif
+%ifdef RT_ARCH_X86
+        mov     edi, edx
+%endif
+.not_found_early:
+        xor     eax, eax
+        cld
+        ret
+ENDPROC RT_NOCRT(memrchr)
+
diff --git a/src/VBox/Runtime/common/vfs/vfsmisc.cpp b/src/VBox/Runtime/common/vfs/vfsmisc.cpp
index cb9be11..c08c1f9 100644
--- a/src/VBox/Runtime/common/vfs/vfsmisc.cpp
+++ b/src/VBox/Runtime/common/vfs/vfsmisc.cpp
@@ -70,8 +70,7 @@ RTDECL(int)         RTVfsIoStrmFromStdHandle(RTHANDLESTD enmStdHandle, uint64_t
                 break;
 
             case RTHANDLETYPE_PIPE:
-                /** @todo  */
-                rc = VERR_NOT_IMPLEMENTED;
+                rc = RTVfsIoStrmFromRTPipe(h.u.hPipe, fLeaveOpen, phVfsIos);
                 break;
 
             case RTHANDLETYPE_SOCKET:
diff --git a/src/VBox/Runtime/common/vfs/vfsstdpipe.cpp b/src/VBox/Runtime/common/vfs/vfsstdpipe.cpp
new file mode 100644
index 0000000..68ebacd
--- /dev/null
+++ b/src/VBox/Runtime/common/vfs/vfsstdpipe.cpp
@@ -0,0 +1,317 @@
+/* $Id: vfsstdpipe.cpp $ */
+/** @file
+ * IPRT - Virtual File System, Standard Pipe I/O stream Implementation.
+ */
+
+/*
+ * Copyright (C) 2010-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#include <iprt/vfs.h>
+#include <iprt/vfslowlevel.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/file.h>
+#include <iprt/pipe.h>
+#include <iprt/poll.h>
+
+
+/*********************************************************************************************************************************
+*   Structures and Typedefs                                                                                                      *
+*********************************************************************************************************************************/
+/**
+ * Private data of a standard pipe.
+ */
+typedef struct RTVFSSTDPIPE
+{
+    /** The pipe handle. */
+    RTPIPE          hPipe;
+    /** Whether to leave the handle open when the VFS handle is closed. */
+    bool            fLeaveOpen;
+    /** Set if primarily read, clear if write. */
+    bool            fReadPipe;
+    /** Fake stream position. */
+    uint64_t        offFakePos;
+} RTVFSSTDPIPE;
+/** Pointer to the private data of a standard pipe. */
+typedef RTVFSSTDPIPE *PRTVFSSTDPIPE;
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnClose}
+ */
+static DECLCALLBACK(int) rtVfsStdPipe_Close(void *pvThis)
+{
+    PRTVFSSTDPIPE pThis = (PRTVFSSTDPIPE)pvThis;
+
+    int rc;
+    if (!pThis->fLeaveOpen)
+        rc = RTPipeClose(pThis->hPipe);
+    else
+        rc = VINF_SUCCESS;
+    pThis->hPipe = NIL_RTPIPE;
+
+    return rc;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnQueryInfo}
+ */
+static DECLCALLBACK(int) rtVfsStdPipe_QueryInfo(void *pvThis, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    PRTVFSSTDPIPE pThis = (PRTVFSSTDPIPE)pvThis;
+    return RTPipeQueryInfo(pThis->hPipe, pObjInfo, enmAddAttr);
+}
+
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnRead}
+ */
+static DECLCALLBACK(int) rtVfsStdPipe_Read(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbRead)
+{
+    PRTVFSSTDPIPE pThis = (PRTVFSSTDPIPE)pvThis;
+    int           rc;
+    AssertReturn(off < 0 || pThis->offFakePos == (uint64_t)off, VERR_SEEK_ON_DEVICE);
+
+    NOREF(fBlocking);
+    if (pSgBuf->cSegs == 1)
+    {
+        if (fBlocking)
+            rc = RTPipeReadBlocking(pThis->hPipe, pSgBuf->paSegs[0].pvSeg, pSgBuf->paSegs[0].cbSeg, pcbRead);
+        else
+            rc = RTPipeRead(        pThis->hPipe, pSgBuf->paSegs[0].pvSeg, pSgBuf->paSegs[0].cbSeg, pcbRead);
+        if (RT_SUCCESS(rc))
+            pThis->offFakePos += pcbRead ? *pcbRead : pSgBuf->paSegs[0].cbSeg;
+    }
+    else
+    {
+        size_t  cbSeg      = 0;
+        size_t  cbRead     = 0;
+        size_t  cbReadSeg  = 0;
+        size_t *pcbReadSeg = pcbRead ? &cbReadSeg : NULL;
+        rc = VINF_SUCCESS;
+
+        for (uint32_t iSeg = 0; iSeg < pSgBuf->cSegs; iSeg++)
+        {
+            void *pvSeg = pSgBuf->paSegs[iSeg].pvSeg;
+            cbSeg       = pSgBuf->paSegs[iSeg].cbSeg;
+
+            cbReadSeg = cbSeg;
+            if (fBlocking)
+                rc = RTPipeReadBlocking(pThis->hPipe, pvSeg, cbSeg, pcbReadSeg);
+            else
+                rc = RTPipeRead(        pThis->hPipe, pvSeg, cbSeg, pcbReadSeg);
+            if (RT_FAILURE(rc))
+                break;
+            pThis->offFakePos += pcbRead ? cbReadSeg : cbSeg;
+            cbRead += cbReadSeg;
+            if (rc != VINF_SUCCESS)
+                break;
+            AssertBreakStmt(!pcbRead || cbReadSeg == cbSeg, rc = VINF_TRY_AGAIN);
+        }
+
+        if (pcbRead)
+            *pcbRead = cbRead;
+    }
+
+    return rc;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnWrite}
+ */
+static DECLCALLBACK(int) rtVfsStdPipe_Write(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbWritten)
+{
+    PRTVFSSTDPIPE pThis = (PRTVFSSTDPIPE)pvThis;
+    int           rc;
+    AssertReturn(off < 0 || pThis->offFakePos == (uint64_t)off, VERR_SEEK_ON_DEVICE);
+
+    if (pSgBuf->cSegs == 1)
+    {
+        if (fBlocking)
+            rc = RTPipeWriteBlocking(pThis->hPipe, pSgBuf->paSegs[0].pvSeg, pSgBuf->paSegs[0].cbSeg, pcbWritten);
+        else
+            rc = RTPipeWrite(        pThis->hPipe, pSgBuf->paSegs[0].pvSeg, pSgBuf->paSegs[0].cbSeg, pcbWritten);
+        if (RT_SUCCESS(rc))
+            pThis->offFakePos += pcbWritten ? *pcbWritten : pSgBuf->paSegs[0].cbSeg;
+    }
+    else
+    {
+        size_t  cbWritten     = 0;
+        size_t  cbWrittenSeg;
+        size_t *pcbWrittenSeg = pcbWritten ? &cbWrittenSeg : NULL;
+        rc = VINF_SUCCESS;
+
+        for (uint32_t iSeg = 0; iSeg < pSgBuf->cSegs; iSeg++)
+        {
+            void   *pvSeg  = pSgBuf->paSegs[iSeg].pvSeg;
+            size_t  cbSeg  = pSgBuf->paSegs[iSeg].cbSeg;
+
+            cbWrittenSeg = 0;
+            if (fBlocking)
+                rc = RTPipeWriteBlocking(pThis->hPipe, pvSeg, cbSeg, pcbWrittenSeg);
+            else
+                rc = RTPipeWrite(        pThis->hPipe, pvSeg, cbSeg, pcbWrittenSeg);
+            if (RT_FAILURE(rc))
+                break;
+            pThis->offFakePos += pcbWritten ? cbWrittenSeg : cbSeg;
+            if (pcbWritten)
+            {
+                cbWritten += cbWrittenSeg;
+                if (rc != VINF_SUCCESS)
+                    break;
+                AssertStmt(cbWrittenSeg == cbSeg, rc = VINF_TRY_AGAIN);
+            }
+            else
+                AssertBreak(rc == VINF_SUCCESS);
+        }
+
+        if (pcbWritten)
+            *pcbWritten = cbWritten;
+    }
+
+    return rc;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnFlush}
+ */
+static DECLCALLBACK(int) rtVfsStdPipe_Flush(void *pvThis)
+{
+    PRTVFSSTDPIPE pThis = (PRTVFSSTDPIPE)pvThis;
+    return RTPipeFlush(pThis->hPipe);
+}
+
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnPollOne}
+ */
+static DECLCALLBACK(int) rtVfsStdPipe_PollOne(void *pvThis, uint32_t fEvents, RTMSINTERVAL cMillies, bool fIntr,
+                                              uint32_t *pfRetEvents)
+{
+    PRTVFSSTDPIPE pThis = (PRTVFSSTDPIPE)pvThis;
+    uint32_t const fPossibleEvt = pThis->fReadPipe ? RTPOLL_EVT_READ : RTPOLL_EVT_WRITE;
+
+    int rc = RTPipeSelectOne(pThis->hPipe, cMillies);
+    if (RT_SUCCESS(rc))
+    {
+        if (fEvents & fPossibleEvt)
+            *pfRetEvents = fPossibleEvt;
+        else
+            rc = RTVfsUtilDummyPollOne(fEvents, cMillies, fIntr, pfRetEvents);
+    }
+    else if (   rc != VERR_TIMEOUT
+             && rc != VERR_INTERRUPTED
+             && rc != VERR_TRY_AGAIN /* paranoia */)
+    {
+        *pfRetEvents = RTPOLL_EVT_ERROR;
+        rc = VINF_SUCCESS;
+    }
+
+    return rc;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnTell}
+ */
+static DECLCALLBACK(int) rtVfsStdPipe_Tell(void *pvThis, PRTFOFF poffActual)
+{
+    PRTVFSSTDPIPE pThis = (PRTVFSSTDPIPE)pvThis;
+    *poffActual = pThis->offFakePos;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Standard pipe operations.
+ */
+DECL_HIDDEN_CONST(const RTVFSIOSTREAMOPS) g_rtVfsStdPipeOps =
+{
+    { /* Obj */
+        RTVFSOBJOPS_VERSION,
+        RTVFSOBJTYPE_IO_STREAM,
+        "StdFile",
+        rtVfsStdPipe_Close,
+        rtVfsStdPipe_QueryInfo,
+        RTVFSOBJOPS_VERSION
+    },
+    RTVFSIOSTREAMOPS_VERSION,
+    0,
+    rtVfsStdPipe_Read,
+    rtVfsStdPipe_Write,
+    rtVfsStdPipe_Flush,
+    rtVfsStdPipe_PollOne,
+    rtVfsStdPipe_Tell,
+    NULL /*rtVfsStdPipe_Skip*/,
+    NULL /*ZeroFill*/,
+    RTVFSIOSTREAMOPS_VERSION,
+};
+
+
+/**
+ * Internal worker for RTVfsIosFromRTPipe and later some create API.
+ *
+ * @returns IRPT status code.
+ * @param   hPipe               The IPRT file handle.
+ * @param   fOpen               The RTFILE_O_XXX flags.
+ * @param   fLeaveOpen          Whether to leave it open or close it.
+ * @param   phVfsFile           Where to return the handle.
+ */
+static int rtVfsFileFromRTPipe(RTPIPE hPipe, uint64_t fOpen, bool fLeaveOpen, PRTVFSIOSTREAM phVfsIos)
+{
+    PRTVFSSTDPIPE   pThis;
+    RTVFSIOSTREAM   hVfsIos;
+    int rc = RTVfsNewIoStream(&g_rtVfsStdPipeOps, sizeof(RTVFSSTDPIPE), fOpen, NIL_RTVFS, NIL_RTVFSLOCK,
+                              &hVfsIos, (void **)&pThis);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    pThis->hPipe        = hPipe;
+    pThis->fLeaveOpen   = fLeaveOpen;
+    *phVfsIos = hVfsIos;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTVfsIoStrmFromRTPipe(RTPIPE hPipe, bool fLeaveOpen, PRTVFSIOSTREAM phVfsIos)
+{
+    /*
+     * Check the handle validity and read/write mode, then create a stream for it.
+     */
+    RTFSOBJINFO ObjInfo;
+    int rc = RTPipeQueryInfo(hPipe, &ObjInfo, RTFSOBJATTRADD_NOTHING);
+    if (RT_SUCCESS(rc))
+        rc = rtVfsFileFromRTPipe(hPipe,
+                                 ObjInfo.Attr.fMode & RTFS_DOS_READONLY ? RTFILE_O_READ : RTFILE_O_WRITE,
+                                 fLeaveOpen, phVfsIos);
+    return rc;
+}
+
+/** @todo Create pipe API? */
+
diff --git a/src/VBox/Runtime/generic/RTCrStoreCreateSnapshotById-generic.cpp b/src/VBox/Runtime/generic/RTCrStoreCreateSnapshotById-generic.cpp
index b6341dc..c65e1a4 100644
--- a/src/VBox/Runtime/generic/RTCrStoreCreateSnapshotById-generic.cpp
+++ b/src/VBox/Runtime/generic/RTCrStoreCreateSnapshotById-generic.cpp
@@ -60,20 +60,15 @@ static const char *g_apszSystemPemFiles[] =
 {
     UNIX_ROOT "/etc/ssl/certs/ca-certificates.crt",
     UNIX_ROOT "/etc/ssl/cert.pem",
-    UNIX_ROOT "/etc/ca-certificates/extracted/tls-ca-bundle.pem",
+    UNIX_ROOT "/etc/ca-certificates/extracted/tls-ca-bundle.pem",       /* Arch linux (ca 2015-08-xx) */
     UNIX_ROOT "/etc/ca-certificates/extracted/email-ca-bundle.pem",
     UNIX_ROOT "/etc/ca-certificates/extracted/objsign-ca-bundle.pem",
     UNIX_ROOT "/etc/ca-certificates/extracted/ca-bundle.trust.crt",
     UNIX_ROOT "/etc/ca-certificates/extracted/ca-bundle.trust.crt",
+    UNIX_ROOT "/etc/pki/tls/certs/ca-bundle.crt",                       /* Oracle Linux 5 */
+    UNIX_ROOT "/etc/pki/tls/cert.pem",
+    UNIX_ROOT "/etc/certs/ca-certificates.crt",                         /* Solaris 11 */
     UNIX_ROOT "/etc/curl/curlCA",
-#if 0 /* Just for reference. */
-    UNIX_ROOT"/usr/share/ca-certificates/trust-source/mozilla.trust.crt",
-    UNIX_ROOT"/usr/share/ca-certificates/trust-source/mozilla.neutral-trust.crt",
-# if defined(RT_OS_SOLARIS) /* the only one on tindersol2... */
-    UNIX_ROOT"/usr/share/doc/mutt/samples/ca-bundle.crt",
-    VeriSign topic: Provide interface for reading: /usr/jdk/latest/jre/lib/security/cacerts ?
-# endif
-#endif
 };
 
 /**
@@ -84,6 +79,7 @@ static const char *g_apszSystemPemDirs[] =
     UNIX_ROOT "/etc/openssl/certs/",
     UNIX_ROOT "/etc/ssl/certs/",
     UNIX_ROOT "/etc/ca-certificates/extracted/cadir/",
+    UNIX_ROOT "/etc/certs/CA/",                                         /* Solaris 11 */
 };
 
 
diff --git a/src/VBox/Runtime/generic/env-generic.cpp b/src/VBox/Runtime/generic/env-generic.cpp
index b0ee3ca..191b006 100644
--- a/src/VBox/Runtime/generic/env-generic.cpp
+++ b/src/VBox/Runtime/generic/env-generic.cpp
@@ -349,6 +349,85 @@ RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone)
 RT_EXPORT_SYMBOL(RTEnvClone);
 
 
+RTDECL(int) RTEnvCloneUtf16Block(PRTENV phEnv, PCRTUTF16 pwszzBlock, uint32_t fFlags)
+{
+    AssertPtrReturn(pwszzBlock, VERR_INVALID_POINTER);
+    AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+
+    /*
+     * Count the number of variables in the block.
+     */
+    uint32_t  cVars = 0;
+    PCRTUTF16 pwsz  = pwszzBlock;
+    while (*pwsz != '\0')
+    {
+        cVars++;
+        pwsz += RTUtf16Len(pwsz) + 1;
+        AssertReturn(cVars < _256K, VERR_OUT_OF_RANGE);
+    }
+
+    /*
+     * Create the duplicate.
+     */
+    PRTENVINTERNAL pIntEnv;
+    int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, false /*fCaseSensitive*/, false /*fPutEnvBlock*/);
+    if (RT_SUCCESS(rc))
+    {
+        pIntEnv->cVars = cVars;
+        pIntEnv->papszEnv[pIntEnv->cVars] = NULL;
+
+        size_t iDst = 0;
+        for (pwsz = pwszzBlock; *pwsz != '\0'; pwsz += RTUtf16Len(pwsz) + 1)
+        {
+            int rc2 = RTUtf16ToUtf8(pwsz, &pIntEnv->papszEnv[iDst]);
+            if (RT_SUCCESS(rc2))
+            {
+                /* Make sure it contains an '='. */
+                const char *pszEqual = strchr(pIntEnv->papszEnv[iDst], '=');
+                if (!pszEqual)
+                {
+                    rc2 = RTStrAAppend(&pIntEnv->papszEnv[iDst], "=");
+                    if (RT_SUCCESS(rc2))
+                        pszEqual = strchr(pIntEnv->papszEnv[iDst], '=');
+
+                }
+                if (pszEqual)
+                {
+                    /* Check for duplicates, keep the last version. */
+                    const char *pchVar        = pIntEnv->papszEnv[iDst];
+                    size_t      cchVarNmAndEq = pszEqual - pchVar;
+                    for (size_t iDst2 = 0; iDst2 < iDst; iDst2++)
+                        if (pIntEnv->pfnCompare(pIntEnv->papszEnv[iDst2], pchVar, cchVarNmAndEq) == 0)
+                        {
+                            RTStrFree(pIntEnv->papszEnv[iDst2]);
+                            pIntEnv->papszEnv[iDst2] = pIntEnv->papszEnv[iDst];
+                            pIntEnv->papszEnv[iDst]  = NULL;
+                            iDst--;
+                            break;
+                        }
+                    iDst++;
+                    continue;
+                }
+                iDst++;
+            }
+
+            /* failed fatally. */
+            pIntEnv->cVars = iDst;
+            RTEnvDestroy(pIntEnv);
+            return rc2;
+        }
+        Assert(iDst <= pIntEnv->cVars);
+        pIntEnv->cVars = iDst;
+
+        /* done */
+        *phEnv = pIntEnv;
+    }
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTEnvCloneUtf16Block);
+
+
+
 RTDECL(int) RTEnvReset(RTENV hEnv)
 {
     PRTENVINTERNAL pIntEnv = hEnv;
diff --git a/src/VBox/Runtime/generic/http-curl.cpp b/src/VBox/Runtime/generic/http-curl.cpp
new file mode 100644
index 0000000..a743175
--- /dev/null
+++ b/src/VBox/Runtime/generic/http-curl.cpp
@@ -0,0 +1,2455 @@
+/* $Id: http-curl.cpp $ */
+/** @file
+ * IPRT - HTTP client API, cURL based.
+ */
+
+/*
+ * Copyright (C) 2012-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#define LOG_GROUP RTLOGGROUP_HTTP
+#include <iprt/http.h>
+#include "internal/iprt.h"
+
+#include <iprt/asm.h>
+#include <iprt/assert.h>
+#include <iprt/cidr.h>
+#include <iprt/crypto/store.h>
+#include <iprt/ctype.h>
+#include <iprt/env.h>
+#include <iprt/err.h>
+#include <iprt/file.h>
+#include <iprt/ldr.h>
+#include <iprt/log.h>
+#include <iprt/mem.h>
+#include <iprt/net.h>
+#include <iprt/once.h>
+#include <iprt/path.h>
+#include <iprt/stream.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+#include <iprt/uri.h>
+
+#include "internal/magics.h"
+
+#include <curl/curl.h>
+
+#ifdef RT_OS_DARWIN
+# include <CoreFoundation/CoreFoundation.h>
+# include <SystemConfiguration/SystemConfiguration.h>
+# include <CoreServices/CoreServices.h>
+#endif
+#ifdef RT_OS_WINDOWS
+# include <Winhttp.h>
+# include "../r3/win/internal-r3-win.h"
+#endif
+
+#ifdef RT_OS_LINUX
+//# define IPRT_USE_LIBPROXY
+#endif
+#ifdef IPRT_USE_LIBPROXY
+# include <stdlib.h> /* free */
+#endif
+
+
+/*********************************************************************************************************************************
+*   Structures and Typedefs                                                                                                      *
+*********************************************************************************************************************************/
+/**
+ * Internal HTTP client instance.
+ */
+typedef struct RTHTTPINTERNAL
+{
+    /** Magic value. */
+    uint32_t            u32Magic;
+    /** cURL handle. */
+    CURL               *pCurl;
+    /** The last response code. */
+    long                lLastResp;
+    /** Custom headers/ */
+    struct curl_slist  *pHeaders;
+    /** CA certificate file for HTTPS authentication. */
+    char               *pszCaFile;
+    /** Whether to delete the CA on destruction. */
+    bool                fDeleteCaFile;
+
+    /** Set if we've applied a CURLOTP_USERAGENT already.  */
+    bool                fHaveSetUserAgent;
+    /** Set if we've got a user agent header, otherwise clear.  */
+    bool                fHaveUserAgentHeader;
+
+    /** @name Proxy settings.
+     * When fUseSystemProxySettings is set, the other members will be updated each
+     * time we're presented with a new URL.  The members reflect the cURL
+     * configuration.
+     *
+     * @{ */
+    /** Set if we should use the system proxy settings for a URL.
+     * This means reconfiguring cURL for each request.  */
+    bool                fUseSystemProxySettings;
+    /** Set if we've detected no proxy necessary. */
+    bool                fNoProxy;
+    /** Proxy host name (RTStrFree). */
+    char               *pszProxyHost;
+    /** Proxy port number (UINT32_MAX if not specified). */
+    uint32_t            uProxyPort;
+    /** The proxy type (CURLPROXY_HTTP, CURLPROXY_SOCKS5, ++). */
+    curl_proxytype      enmProxyType;
+    /** Proxy username (RTStrFree). */
+    char               *pszProxyUsername;
+    /** Proxy password (RTStrFree). */
+    char               *pszProxyPassword;
+    /** @} */
+
+    /** Abort the current HTTP request if true. */
+    bool volatile       fAbort;
+    /** Set if someone is preforming an HTTP operation. */
+    bool volatile       fBusy;
+    /** The location field for 301 responses. */
+    char               *pszRedirLocation;
+
+    /** Output callback data. */
+    union
+    {
+        /** For file destination.  */
+        RTFILE          hFile;
+        /** For memory destination. */
+        struct
+        {
+            /** The current size (sans terminator char). */
+            size_t      cb;
+            /** The currently allocated size. */
+            size_t      cbAllocated;
+            /** Pointer to the buffer. */
+            uint8_t    *pb;
+        } Mem;
+    } Output;
+    /** Output callback status. */
+    int                 rcOutput;
+    /** Download size hint set by the progress callback. */
+    uint64_t            cbDownloadHint;
+} RTHTTPINTERNAL;
+/** Pointer to an internal HTTP client instance. */
+typedef RTHTTPINTERNAL *PRTHTTPINTERNAL;
+
+
+#ifdef RT_OS_WINDOWS
+/** @name Windows: Types for dynamically resolved APIs
+ * @{ */
+typedef HINTERNET (WINAPI * PFNWINHTTPOPEN)(LPCWSTR, DWORD, LPCWSTR, LPCWSTR, DWORD);
+typedef BOOL      (WINAPI * PFNWINHTTPCLOSEHANDLE)(HINTERNET);
+typedef BOOL      (WINAPI * PFNWINHTTPGETPROXYFORURL)(HINTERNET, LPCWSTR, WINHTTP_AUTOPROXY_OPTIONS *, WINHTTP_PROXY_INFO *);
+typedef BOOL      (WINAPI * PFNWINHTTPGETDEFAULTPROXYCONFIGURATION)(WINHTTP_PROXY_INFO *);
+typedef BOOL      (WINAPI * PFNWINHTTPGETIEPROXYCONFIGFORCURRENTUSER)(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG *);
+/** @} */
+#endif
+
+#ifdef IPRT_USE_LIBPROXY
+typedef struct px_proxy_factory *PLIBPROXYFACTORY;
+typedef PLIBPROXYFACTORY (* PFNLIBPROXYFACTORYCTOR)(void);
+typedef void             (* PFNLIBPROXYFACTORYDTOR)(PLIBPROXYFACTORY);
+typedef char          ** (* PFNLIBPROXYFACTORYGETPROXIES)(PLIBPROXYFACTORY, const char *);
+#endif
+
+
+/*********************************************************************************************************************************
+*   Defined Constants And Macros                                                                                                 *
+*********************************************************************************************************************************/
+/** @def RTHTTP_MAX_MEM_DOWNLOAD
+ * The max size we are allowed to download to a memory buffer.
+ *
+ * @remarks The minus 1 is for the trailing zero terminator we always add.
+ */
+#if ARCH_BITS == 64
+# define RTHTTP_MAX_MEM_DOWNLOAD_SIZE       (UINT32_C(64)*_1M - 1)
+#else
+# define RTHTTP_MAX_MEM_DOWNLOAD_SIZE       (UINT32_C(32)*_1M - 1)
+#endif
+
+/** Checks whether a cURL return code indicates success. */
+#define CURL_SUCCESS(rcCurl)    RT_LIKELY(rcCurl == CURLE_OK)
+/** Checks whether a cURL return code indicates failure. */
+#define CURL_FAILURE(rcCurl)    RT_UNLIKELY(rcCurl != CURLE_OK)
+
+/** Validates a handle and returns VERR_INVALID_HANDLE if not valid. */
+#define RTHTTP_VALID_RETURN_RC(hHttp, rcCurl) \
+    do { \
+        AssertPtrReturn((hHttp), (rcCurl)); \
+        AssertReturn((hHttp)->u32Magic == RTHTTP_MAGIC, (rcCurl)); \
+    } while (0)
+
+/** Validates a handle and returns VERR_INVALID_HANDLE if not valid. */
+#define RTHTTP_VALID_RETURN(hHTTP) RTHTTP_VALID_RETURN_RC((hHttp), VERR_INVALID_HANDLE)
+
+/** Validates a handle and returns (void) if not valid. */
+#define RTHTTP_VALID_RETURN_VOID(hHttp) \
+    do { \
+        AssertPtrReturnVoid(hHttp); \
+        AssertReturnVoid((hHttp)->u32Magic == RTHTTP_MAGIC); \
+    } while (0)
+
+
+/*********************************************************************************************************************************
+*   Global Variables                                                                                                             *
+*********************************************************************************************************************************/
+#ifdef RT_OS_WINDOWS
+/** @name Windows: Dynamically resolved APIs
+ * @{ */
+static RTONCE                                   g_WinResolveImportsOnce = RTONCE_INITIALIZER;
+static PFNWINHTTPOPEN                           g_pfnWinHttpOpen = NULL;
+static PFNWINHTTPCLOSEHANDLE                    g_pfnWinHttpCloseHandle = NULL;
+static PFNWINHTTPGETPROXYFORURL                 g_pfnWinHttpGetProxyForUrl = NULL;
+static PFNWINHTTPGETDEFAULTPROXYCONFIGURATION   g_pfnWinHttpGetDefaultProxyConfiguration = NULL;
+static PFNWINHTTPGETIEPROXYCONFIGFORCURRENTUSER g_pfnWinHttpGetIEProxyConfigForCurrentUser = NULL;
+/** @} */
+#endif
+
+#ifdef IPRT_USE_LIBPROXY
+/** @name Dynamaically resolved libproxy APIs.
+ * @{ */
+static RTONCE                                   g_LibProxyResolveImportsOnce = RTONCE_INITIALIZER;
+static RTLDRMOD                                 g_hLdrLibProxy = NIL_RTLDRMOD;
+static PFNLIBPROXYFACTORYCTOR                   g_pfnLibProxyFactoryCtor = NULL;
+static PFNLIBPROXYFACTORYDTOR                   g_pfnLibProxyFactoryDtor = NULL;
+static PFNLIBPROXYFACTORYGETPROXIES             g_pfnLibProxyFactoryGetProxies = NULL;
+/** @} */
+#endif
+
+
+/*********************************************************************************************************************************
+*   Internal Functions                                                                                                           *
+*********************************************************************************************************************************/
+static void rtHttpUnsetCaFile(PRTHTTPINTERNAL pThis);
+#ifdef RT_OS_DARWIN
+static int rtHttpDarwinTryConfigProxies(PRTHTTPINTERNAL pThis, CFArrayRef hArrayProxies, CFURLRef hUrlTarget, bool fIgnorePacType);
+#endif
+
+
+RTR3DECL(int) RTHttpCreate(PRTHTTP phHttp)
+{
+    AssertPtrReturn(phHttp, VERR_INVALID_PARAMETER);
+
+    /** @todo r=bird: rainy day: curl_global_init is not thread safe, only a
+     *        problem if multiple threads get here at the same time. */
+    int rc = VERR_HTTP_INIT_FAILED;
+    CURLcode rcCurl = curl_global_init(CURL_GLOBAL_ALL);
+    if (!CURL_FAILURE(rcCurl))
+    {
+        CURL *pCurl = curl_easy_init();
+        if (pCurl)
+        {
+            PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)RTMemAllocZ(sizeof(RTHTTPINTERNAL));
+            if (pThis)
+            {
+                pThis->u32Magic                 = RTHTTP_MAGIC;
+                pThis->pCurl                    = pCurl;
+                pThis->fUseSystemProxySettings  = true;
+
+                *phHttp = (RTHTTP)pThis;
+
+                return VINF_SUCCESS;
+            }
+            rc = VERR_NO_MEMORY;
+        }
+        else
+            rc = VERR_HTTP_INIT_FAILED;
+    }
+    curl_global_cleanup();
+    return rc;
+}
+
+
+RTR3DECL(void) RTHttpDestroy(RTHTTP hHttp)
+{
+    if (hHttp == NIL_RTHTTP)
+        return;
+
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN_VOID(pThis);
+
+    Assert(!pThis->fBusy);
+
+    pThis->u32Magic = RTHTTP_MAGIC_DEAD;
+
+    curl_easy_cleanup(pThis->pCurl);
+    pThis->pCurl = NULL;
+
+    if (pThis->pHeaders)
+        curl_slist_free_all(pThis->pHeaders);
+
+    rtHttpUnsetCaFile(pThis);
+    Assert(!pThis->pszCaFile);
+
+    if (pThis->pszRedirLocation)
+        RTStrFree(pThis->pszRedirLocation);
+
+    RTStrFree(pThis->pszProxyHost);
+    RTStrFree(pThis->pszProxyUsername);
+    if (pThis->pszProxyPassword)
+    {
+        RTMemWipeThoroughly(pThis->pszProxyPassword, strlen(pThis->pszProxyPassword), 2);
+        RTStrFree(pThis->pszProxyPassword);
+    }
+
+    RTMemFree(pThis);
+
+    curl_global_cleanup();
+}
+
+
+RTR3DECL(int) RTHttpAbort(RTHTTP hHttp)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    pThis->fAbort = true;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpGetRedirLocation(RTHTTP hHttp, char **ppszRedirLocation)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+    Assert(!pThis->fBusy);
+
+    if (!pThis->pszRedirLocation)
+        return VERR_HTTP_NOT_FOUND;
+
+    return RTStrDupEx(ppszRedirLocation, pThis->pszRedirLocation);
+}
+
+
+RTR3DECL(int) RTHttpUseSystemProxySettings(RTHTTP hHttp)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+    AssertReturn(!pThis->fBusy, VERR_WRONG_ORDER);
+
+    /*
+     * Change the settings.
+     */
+    pThis->fUseSystemProxySettings = true;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * rtHttpConfigureProxyForUrl: Update cURL proxy settings as needed.
+ *
+ * @returns IPRT status code.
+ * @param   pThis           The HTTP client instance.
+ * @param   enmProxyType    The proxy type.
+ * @param   pszHost         The proxy host name.
+ * @param   uPort           The proxy port number.
+ * @param   pszUsername     The proxy username, or NULL if none.
+ * @param   pszPassword     The proxy password, or NULL if none.
+ */
+static int rtHttpUpdateProxyConfig(PRTHTTPINTERNAL pThis, curl_proxytype enmProxyType, const char *pszHost,
+                                   uint32_t uPort, const char *pszUsername, const char *pszPassword)
+{
+    int rcCurl;
+    AssertReturn(pszHost, VERR_INVALID_PARAMETER);
+    Log(("rtHttpUpdateProxyConfig: pThis=%p type=%d host='%s' port=%u user='%s'%s\n",
+         pThis, enmProxyType, pszHost, uPort, pszUsername, pszPassword ? " with password" : " without password"));
+
+#ifdef CURLOPT_NOPROXY
+    if (pThis->fNoProxy)
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_NOPROXY, (const char *)NULL);
+        AssertMsgReturn(rcCurl == CURLE_OK, ("CURLOPT_NOPROXY=NULL: %d (%#x)\n", rcCurl, rcCurl),
+                        VERR_HTTP_CURL_PROXY_CONFIG);
+        pThis->fNoProxy = false;
+    }
+#endif
+
+    if (enmProxyType != pThis->enmProxyType)
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYTYPE, (long)enmProxyType);
+        AssertMsgReturn(rcCurl == CURLE_OK, ("CURLOPT_PROXYTYPE=%d: %d (%#x)\n", enmProxyType, rcCurl, rcCurl),
+                        VERR_HTTP_CURL_PROXY_CONFIG);
+        pThis->enmProxyType = CURLPROXY_HTTP;
+    }
+
+    if (uPort != pThis->uProxyPort)
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYPORT, (long)uPort);
+        AssertMsgReturn(rcCurl == CURLE_OK, ("CURLOPT_PROXYPORT=%d: %d (%#x)\n", uPort, rcCurl, rcCurl),
+                        VERR_HTTP_CURL_PROXY_CONFIG);
+        pThis->uProxyPort = uPort;
+    }
+
+    if (   pszUsername != pThis->pszProxyUsername
+        || RTStrCmp(pszUsername, pThis->pszProxyUsername))
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYUSERNAME, pszUsername);
+        AssertMsgReturn(rcCurl == CURLE_OK, ("CURLOPT_PROXYUSERNAME=%s: %d (%#x)\n", pszUsername, rcCurl, rcCurl),
+                        VERR_HTTP_CURL_PROXY_CONFIG);
+        if (pThis->pszProxyUsername)
+        {
+            RTStrFree(pThis->pszProxyUsername);
+            pThis->pszProxyUsername = NULL;
+        }
+        if (pszUsername)
+        {
+            pThis->pszProxyUsername = RTStrDup(pszUsername);
+            AssertReturn(pThis->pszProxyUsername, VERR_NO_STR_MEMORY);
+        }
+    }
+
+    if (   pszPassword != pThis->pszProxyPassword
+        || RTStrCmp(pszPassword, pThis->pszProxyPassword))
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYPASSWORD, pszPassword);
+        AssertMsgReturn(rcCurl == CURLE_OK, ("CURLOPT_PROXYPASSWORD=%s: %d (%#x)\n", pszPassword ? "xxx" : NULL, rcCurl, rcCurl),
+                        VERR_HTTP_CURL_PROXY_CONFIG);
+        if (pThis->pszProxyPassword)
+        {
+            RTMemWipeThoroughly(pThis->pszProxyPassword, strlen(pThis->pszProxyPassword), 2);
+            RTStrFree(pThis->pszProxyPassword);
+            pThis->pszProxyPassword = NULL;
+        }
+        if (pszPassword)
+        {
+            pThis->pszProxyPassword = RTStrDup(pszPassword);
+            AssertReturn(pThis->pszProxyPassword, VERR_NO_STR_MEMORY);
+        }
+    }
+
+    if (   pszHost != pThis->pszProxyHost
+        || RTStrCmp(pszHost, pThis->pszProxyHost))
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROXY, pszHost);
+        AssertMsgReturn(rcCurl == CURLE_OK, ("CURLOPT_PROXY=%s: %d (%#x)\n", pszHost, rcCurl, rcCurl),
+                        VERR_HTTP_CURL_PROXY_CONFIG);
+        if (pThis->pszProxyHost)
+        {
+            RTStrFree(pThis->pszProxyHost);
+            pThis->pszProxyHost = NULL;
+        }
+        if (pszHost)
+        {
+            pThis->pszProxyHost = RTStrDup(pszHost);
+            AssertReturn(pThis->pszProxyHost, VERR_NO_STR_MEMORY);
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * rtHttpConfigureProxyForUrl: Disables proxying.
+ *
+ * @returns IPRT status code.
+ * @param   pThis               The HTTP client instance.
+ */
+static int rtHttpUpdateAutomaticProxyDisable(PRTHTTPINTERNAL pThis)
+{
+    Log(("rtHttpUpdateAutomaticProxyDisable: pThis=%p\n", pThis));
+
+    AssertReturn(curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYTYPE,   (long)CURLPROXY_HTTP) == CURLE_OK, VERR_INTERNAL_ERROR_2);
+    pThis->enmProxyType = CURLPROXY_HTTP;
+
+    AssertReturn(curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYPORT,             (long)1080) == CURLE_OK, VERR_INTERNAL_ERROR_2);
+    pThis->uProxyPort = 1080;
+
+    AssertReturn(curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYUSERNAME, (const char *)NULL) == CURLE_OK, VERR_INTERNAL_ERROR_2);
+    if (pThis->pszProxyUsername)
+    {
+        RTStrFree(pThis->pszProxyUsername);
+        pThis->pszProxyUsername = NULL;
+    }
+
+    AssertReturn(curl_easy_setopt(pThis->pCurl, CURLOPT_PROXYPASSWORD, (const char *)NULL) == CURLE_OK, VERR_INTERNAL_ERROR_2);
+    if (pThis->pszProxyPassword)
+    {
+        RTStrFree(pThis->pszProxyPassword);
+        pThis->pszProxyPassword = NULL;
+    }
+
+    AssertReturn(curl_easy_setopt(pThis->pCurl, CURLOPT_PROXY,         (const char *)NULL) == CURLE_OK, VERR_INTERNAL_ERROR_2);
+    if (pThis->pszProxyHost)
+    {
+        RTStrFree(pThis->pszProxyHost);
+        pThis->pszProxyHost = NULL;
+    }
+
+#ifdef CURLOPT_NOPROXY
+    /* No proxy for everything! */
+    AssertReturn(curl_easy_setopt(pThis->pCurl, CURLOPT_NOPROXY, "*") == CURLE_OK, CURLOPT_PROXY);
+    pThis->fNoProxy = true;
+#endif
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * See if the host name of the URL is included in the stripped no_proxy list.
+ *
+ * The no_proxy list is a colon or space separated list of domain names for
+ * which there should be no proxying.  Given "no_proxy=oracle.com" neither the
+ * URL "http://www.oracle.com" nor "http://oracle.com" will not be proxied, but
+ * "http://notoracle.com" will be.
+ *
+ * @returns true if the URL is in the no_proxy list, otherwise false.
+ * @param   pszUrl          The URL.
+ * @param   pszNoProxyList  The stripped no_proxy list.
+ */
+static bool rtHttpUrlInNoProxyList(const char *pszUrl, const char *pszNoProxyList)
+{
+    /*
+     * Check for just '*', diabling proxying for everything.
+     * (Caller stripped pszNoProxyList.)
+     */
+    if (*pszNoProxyList == '*' && pszNoProxyList[1] == '\0')
+        return true;
+
+    /*
+     * Empty list? (Caller stripped it, remember).
+     */
+    if (!*pszNoProxyList)
+        return false;
+
+    /*
+     * We now need to parse the URL and extract the host name.
+     */
+    RTURIPARSED Parsed;
+    int rc = RTUriParse(pszUrl, &Parsed);
+    AssertRCReturn(rc, false);
+    char *pszHost = RTUriParsedAuthorityHost(pszUrl, &Parsed);
+    if (!pszHost) /* Don't assert, in case of file:///xxx or similar blunder. */
+        return false;
+
+    bool fRet = false;
+    size_t const cchHost = strlen(pszHost);
+    if (cchHost)
+    {
+        /*
+         * The list is comma or space separated, walk it and match host names.
+         */
+        while (*pszNoProxyList != '\0')
+        {
+            /* Strip leading slashes, commas and dots. */
+            char ch;
+            while (   (ch = *pszNoProxyList) == ','
+                   || ch == '.'
+                   || RT_C_IS_SPACE(ch))
+                pszNoProxyList++;
+
+            /* Find the end. */
+            size_t cch     = RTStrOffCharOrTerm(pszNoProxyList, ',');
+            size_t offNext = RTStrOffCharOrTerm(pszNoProxyList, ' ');
+            cch = RT_MIN(cch, offNext);
+            offNext = cch;
+
+            /* Trip trailing spaces, well tabs and stuff. */
+            while (cch > 0 && RT_C_IS_SPACE(pszNoProxyList[cch - 1]))
+                cch--;
+
+            /* Do the matching, if we have anything to work with. */
+            if (cch > 0)
+            {
+                if (   (   cch == cchHost
+                        && RTStrNICmp(pszNoProxyList, pszHost, cch) == 0)
+                    || (   cch <  cchHost
+                        && pszHost[cchHost - cch - 1] == '.'
+                        && RTStrNICmp(pszNoProxyList, &pszHost[cchHost - cch], cch) == 0) )
+                {
+                    fRet = true;
+                    break;
+                }
+            }
+
+            /* Next. */
+            pszNoProxyList += offNext;
+        }
+    }
+
+    RTStrFree(pszHost);
+    return fRet;
+}
+
+
+/**
+ * Configures a proxy given a "URL" like specification.
+ *
+ * Format is [<scheme>"://"][<userid>[@<password>]:]<server>[":"<port>].
+ *
+ * @returns IPRT status code.
+ * @param   pThis               The HTTP client instance.
+ * @param   pszProxyUrl         The proxy server "URL".
+ */
+static int rtHttpConfigureProxyFromUrl(PRTHTTPINTERNAL pThis, const char *pszProxyUrl)
+{
+    /*
+     * Make sure it can be parsed as an URL.
+     */
+    char *pszFreeMe = NULL;
+    if (!strstr(pszProxyUrl, "://"))
+    {
+        static const char s_szPrefix[] = "http://";
+        size_t cchProxyUrl = strlen(pszProxyUrl);
+        pszFreeMe = (char *)RTMemTmpAlloc(sizeof(s_szPrefix) + cchProxyUrl);
+        if (pszFreeMe)
+        {
+            memcpy(pszFreeMe, s_szPrefix, sizeof(s_szPrefix) - 1);
+            memcpy(&pszFreeMe[sizeof(s_szPrefix) - 1], pszProxyUrl, cchProxyUrl);
+            pszFreeMe[sizeof(s_szPrefix) - 1 + cchProxyUrl] = '\0';
+            pszProxyUrl = pszFreeMe;
+        }
+        else
+            return VERR_NO_TMP_MEMORY;
+    }
+
+    RTURIPARSED Parsed;
+    int rc = RTUriParse(pszProxyUrl, &Parsed);
+    if (RT_SUCCESS(rc))
+    {
+        bool fDone = false;
+        char *pszHost = RTUriParsedAuthorityHost(pszProxyUrl, &Parsed);
+        if (pszHost)
+        {
+            /*
+             * We've got a host name, try get the rest.
+             */
+            char    *pszUsername = RTUriParsedAuthorityUsername(pszProxyUrl, &Parsed);
+            char    *pszPassword = RTUriParsedAuthorityPassword(pszProxyUrl, &Parsed);
+            uint32_t uProxyPort  = RTUriParsedAuthorityPort(pszProxyUrl, &Parsed);
+            curl_proxytype enmProxyType;
+            if (RTUriIsSchemeMatch(pszProxyUrl, "http"))
+            {
+                enmProxyType  = CURLPROXY_HTTP;
+                if (uProxyPort == UINT32_MAX)
+                    uProxyPort = 80;
+            }
+            else if (   RTUriIsSchemeMatch(pszProxyUrl, "socks4")
+                     || RTUriIsSchemeMatch(pszProxyUrl, "socks"))
+                enmProxyType = CURLPROXY_SOCKS4;
+            else if (RTUriIsSchemeMatch(pszProxyUrl, "socks4a"))
+                enmProxyType = CURLPROXY_SOCKS4A;
+            else if (RTUriIsSchemeMatch(pszProxyUrl, "socks5"))
+                enmProxyType = CURLPROXY_SOCKS5;
+            else if (RTUriIsSchemeMatch(pszProxyUrl, "socks5h"))
+                enmProxyType = CURLPROXY_SOCKS5_HOSTNAME;
+            else
+            {
+                enmProxyType = CURLPROXY_HTTP;
+                if (uProxyPort == UINT32_MAX)
+                    uProxyPort = 8080;
+            }
+
+            /* Guess the port from the proxy type if not given. */
+            if (uProxyPort == UINT32_MAX)
+                uProxyPort = 1080; /* CURL_DEFAULT_PROXY_PORT */
+
+            rc = rtHttpUpdateProxyConfig(pThis, enmProxyType, pszHost, uProxyPort, pszUsername, pszPassword);
+
+            RTStrFree(pszUsername);
+            RTStrFree(pszPassword);
+            RTStrFree(pszHost);
+        }
+        else
+            AssertMsgFailed(("RTUriParsedAuthorityHost('%s',) -> NULL\n", pszProxyUrl));
+    }
+    else
+        AssertMsgFailed(("RTUriParse('%s',) -> %Rrc\n", pszProxyUrl, rc));
+
+    if (pszFreeMe)
+        RTMemTmpFree(pszFreeMe);
+    return rc;
+}
+
+
+/**
+ * Consults enviornment variables that cURL/lynx/wget/lynx uses for figuring out
+ * the proxy config.
+ *
+ * @returns IPRT status code.
+ * @param   pThis               The HTTP client instance.
+ * @param   pszUrl              The URL to configure a proxy for.
+ */
+static int rtHttpConfigureProxyForUrlFromEnv(PRTHTTPINTERNAL pThis, const char *pszUrl)
+{
+    char szTmp[_1K];
+
+    /*
+     * First we consult the "no_proxy" / "NO_PROXY" environment variable.
+     */
+    const char *pszNoProxyVar;
+    size_t cchActual;
+    char  *pszNoProxyFree = NULL;
+    char  *pszNoProxy = szTmp;
+    int rc = RTEnvGetEx(RTENV_DEFAULT, pszNoProxyVar = "no_proxy", szTmp, sizeof(szTmp), &cchActual);
+    if (rc == VERR_ENV_VAR_NOT_FOUND)
+        rc = RTEnvGetEx(RTENV_DEFAULT, pszNoProxyVar = "NO_PROXY", szTmp, sizeof(szTmp), &cchActual);
+    if (rc == VERR_BUFFER_OVERFLOW)
+    {
+        pszNoProxyFree = pszNoProxy = (char *)RTMemTmpAlloc(cchActual + _1K);
+        AssertReturn(pszNoProxy, VERR_NO_TMP_MEMORY);
+        rc = RTEnvGetEx(RTENV_DEFAULT, pszNoProxyVar, pszNoProxy, cchActual + _1K, NULL);
+    }
+    AssertMsg(rc == VINF_SUCCESS || rc == VERR_ENV_VAR_NOT_FOUND, ("rc=%Rrc\n", rc));
+    bool fNoProxy = rtHttpUrlInNoProxyList(pszUrl, RTStrStrip(pszNoProxy));
+    RTMemTmpFree(pszNoProxyFree);
+    if (!fNoProxy)
+    {
+        /*
+         * Get the schema specific specific env var, falling back on the
+         * generic all_proxy if not found.
+         */
+        const char *apszEnvVars[4];
+        unsigned    cEnvVars = 0;
+        if (!RTStrNICmp(pszUrl, RT_STR_TUPLE("http:")))
+            apszEnvVars[cEnvVars++] = "http_proxy"; /* Skip HTTP_PROXY because of cgi paranoia */
+        else if (!RTStrNICmp(pszUrl, RT_STR_TUPLE("https:")))
+        {
+            apszEnvVars[cEnvVars++] = "https_proxy";
+            apszEnvVars[cEnvVars++] = "HTTPS_PROXY";
+        }
+        else if (!RTStrNICmp(pszUrl, RT_STR_TUPLE("ftp:")))
+        {
+            apszEnvVars[cEnvVars++] = "ftp_proxy";
+            apszEnvVars[cEnvVars++] = "FTP_PROXY";
+        }
+        else
+            AssertMsgFailedReturn(("Unknown/unsupported schema in URL: '%s'\n", pszUrl), VERR_NOT_SUPPORTED);
+        apszEnvVars[cEnvVars++] = "all_proxy";
+        apszEnvVars[cEnvVars++] = "ALL_PROXY";
+
+        /*
+         * We try the env vars out and goes with the first one we can make sense out of.
+         * If we cannot make sense of any, we return the first unexpected rc we got.
+         */
+        rc = VINF_SUCCESS;
+        for (uint32_t i = 0; i < cEnvVars; i++)
+        {
+            size_t cchValue;
+            int rc2 = RTEnvGetEx(RTENV_DEFAULT, apszEnvVars[i], szTmp, sizeof(szTmp) - sizeof("http://"), &cchValue);
+            if (RT_SUCCESS(rc2))
+            {
+                if (cchValue != 0)
+                {
+                    /* Add a http:// prefix so RTUriParse groks it (cheaper to do it here). */
+                    if (!strstr(szTmp, "://"))
+                    {
+                        memmove(&szTmp[sizeof("http://") - 1], szTmp, cchValue + 1);
+                        memcpy(szTmp, RT_STR_TUPLE("http://"));
+                    }
+
+                    rc2 = rtHttpConfigureProxyFromUrl(pThis, szTmp);
+                    if (RT_SUCCESS(rc2))
+                        rc = rc2;
+                }
+                /*
+                 * The variable is empty.  Guess that means no proxying wanted.
+                 */
+                else
+                {
+                    rc = rtHttpUpdateAutomaticProxyDisable(pThis);
+                    break;
+                }
+            }
+            else
+                AssertMsgStmt(rc2 == VERR_ENV_VAR_NOT_FOUND, ("%Rrc\n", rc2), if (RT_SUCCESS(rc)) rc = rc2);
+        }
+    }
+    /*
+     * The host is the no-proxy list, it seems.
+     */
+    else
+        rc = rtHttpUpdateAutomaticProxyDisable(pThis);
+
+    return rc;
+}
+
+#ifdef IPRT_USE_LIBPROXY
+
+/**
+ * @callback_method_impl{FNRTONCE,
+ *      Attempts to load libproxy.so.1 and resolves APIs}
+ */
+static DECLCALLBACK(int) rtHttpLibProxyResolveImports(void *pvUser)
+{
+    RTLDRMOD hMod;
+    int rc = RTLdrLoad("/usr/lib/libproxy.so.1", &hMod);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTLdrGetSymbol(hMod, "px_proxy_factory_new", (void **)&g_pfnLibProxyFactoryCtor);
+        if (RT_SUCCESS(rc))
+            rc = RTLdrGetSymbol(hMod, "px_proxy_factory_free", (void **)&g_pfnLibProxyFactoryDtor);
+        if (RT_SUCCESS(rc))
+            rc = RTLdrGetSymbol(hMod, "px_proxy_factory_get_proxies", (void **)&g_pfnLibProxyFactoryGetProxies);
+        if (RT_SUCCESS(rc))
+            g_hLdrLibProxy = hMod;
+        else
+            RTLdrClose(hMod);
+        AssertRC(rc);
+    }
+
+    NOREF(pvUser);
+    return rc;
+}
+
+/**
+ * Reconfigures the cURL proxy settings for the given URL, libproxy style.
+ *
+ * @returns IPRT status code. VINF_NOT_SUPPORTED if we should try fallback.
+ * @param   pThis       The HTTP client instance.
+ * @param   pszUrl      The URL.
+ */
+static int rtHttpLibProxyConfigureProxyForUrl(PRTHTTPINTERNAL pThis, const char *pszUrl)
+{
+    int rcRet = VINF_NOT_SUPPORTED;
+
+    int rc = RTOnce(&g_LibProxyResolveImportsOnce, rtHttpLibProxyResolveImports, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Instance the factory and ask for a list of proxies.
+         */
+        PLIBPROXYFACTORY pFactory = g_pfnLibProxyFactoryCtor();
+        if (pFactory)
+        {
+            char **papszProxies = g_pfnLibProxyFactoryGetProxies(pFactory, pszUrl);
+            g_pfnLibProxyFactoryDtor(pFactory);
+            if (papszProxies)
+            {
+                /*
+                 * Look for something we can use.
+                 */
+                for (unsigned i = 0; papszProxies[i]; i++)
+                {
+                    if (strncmp(papszProxies[i], RT_STR_TUPLE("direct://")) == 0)
+                        rcRet = rtHttpUpdateAutomaticProxyDisable(pThis);
+                    else if (   strncmp(papszProxies[i], RT_STR_TUPLE("http://")) == 0
+                             || strncmp(papszProxies[i], RT_STR_TUPLE("socks5://")) == 0
+                             || strncmp(papszProxies[i], RT_STR_TUPLE("socks4://")) == 0
+                             || strncmp(papszProxies[i], RT_STR_TUPLE("socks://")) == 0 /** @todo same problem as on OS X. */
+                            )
+                        rcRet = rtHttpConfigureProxyFromUrl(pThis, papszProxies[i]);
+                    else
+                        continue;
+                    if (rcRet != VINF_NOT_SUPPORTED)
+                        break;
+                }
+
+                /* free the result. */
+                for (unsigned i = 0; papszProxies[i]; i++)
+                    free(papszProxies[i]);
+                free(papszProxies);
+            }
+        }
+    }
+
+    return rcRet;
+}
+
+#endif /* IPRT_USE_LIBPROXY */
+
+#ifdef RT_OS_DARWIN
+
+/**
+ * Get a boolean like integer value from a dictionary.
+ *
+ * @returns true / false.
+ * @param   hDict       The dictionary.
+ * @param   pvKey       The dictionary value key.
+ */
+static bool rtHttpDarwinGetBooleanFromDict(CFDictionaryRef hDict, void const *pvKey, bool fDefault)
+{
+    CFNumberRef hNum = (CFNumberRef)CFDictionaryGetValue(hDict, pvKey);
+    if (hNum)
+    {
+        int fEnabled;
+        if (!CFNumberGetValue(hNum, kCFNumberIntType, &fEnabled))
+            return fDefault;
+        return fEnabled != 0;
+    }
+    return fDefault;
+}
+
+
+/**
+ * Creates a CFURL object for an URL.
+ *
+ * @returns CFURL object reference.
+ * @param   pszUrl              The URL.
+ */
+static CFURLRef rtHttpDarwinUrlToCFURL(const char *pszUrl)
+{
+    CFURLRef    hUrl = NULL;
+    CFStringRef hStrUrl = CFStringCreateWithCString(kCFAllocatorDefault, pszUrl, kCFStringEncodingUTF8);
+    if (hStrUrl)
+    {
+        CFStringRef hStrUrlEscaped = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, hStrUrl,
+                                                                             NULL /*charactersToLeaveUnescaped*/,
+                                                                             NULL /*legalURLCharactersToBeEscaped*/,
+                                                                             kCFStringEncodingUTF8);
+        if (hStrUrlEscaped)
+        {
+            hUrl = CFURLCreateWithString(kCFAllocatorDefault, hStrUrlEscaped, NULL /*baseURL*/);
+            Assert(hUrl);
+            CFRelease(hStrUrlEscaped);
+        }
+        else
+            AssertFailed();
+        CFRelease(hStrUrl);
+    }
+    else
+        AssertFailed();
+    return hUrl;
+}
+
+
+/**
+ * For passing results from rtHttpDarwinPacCallback to
+ * rtHttpDarwinExecuteProxyAutoConfigurationUrl.
+ */
+typedef struct RTHTTPDARWINPACRESULT
+{
+    CFArrayRef  hArrayProxies;
+    CFErrorRef  hError;
+} RTHTTPDARWINPACRESULT;
+typedef RTHTTPDARWINPACRESULT *PRTHTTPDARWINPACRESULT;
+
+/**
+ * Stupid callback for getting the result from
+ * CFNetworkExecuteProxyAutoConfigurationURL.
+ *
+ * @param   pvUser          Pointer to a RTHTTPDARWINPACRESULT on the stack of
+ *                          rtHttpDarwinExecuteProxyAutoConfigurationUrl.
+ * @param   hArrayProxies   The result array.
+ * @param   hError          Errors, if any.
+ */
+static void rtHttpDarwinPacCallback(void *pvUser, CFArrayRef hArrayProxies, CFErrorRef hError)
+{
+    PRTHTTPDARWINPACRESULT pResult = (PRTHTTPDARWINPACRESULT)pvUser;
+
+    Assert(pResult->hArrayProxies == NULL);
+    if (hArrayProxies)
+        pResult->hArrayProxies  = (CFArrayRef)CFRetain(hArrayProxies);
+
+    Assert(pResult->hError == NULL);
+    if (hError)
+        pResult->hError         = (CFErrorRef)CFRetain(hError);
+
+    CFRunLoopStop(CFRunLoopGetCurrent());
+}
+
+
+/**
+ * Executes a PAC script and returning the proxies it suggests.
+ *
+ * @returns Array of proxy configs (CFProxySupport.h style).
+ * @param   pThis           The HTTP client instance.
+ * @param   hUrlTarget      The URL we're about to use.
+ * @param   hUrlScript      The PAC script URL.
+ */
+static CFArrayRef rtHttpDarwinExecuteProxyAutoConfigurationUrl(PRTHTTPINTERNAL pThis, CFURLRef hUrlTarget, CFURLRef hUrlScript)
+{
+    char szTmp[256];
+    if (LogIsFlowEnabled())
+    {
+        szTmp[0] = '\0';
+        CFStringGetCString(CFURLGetString(hUrlScript), szTmp, sizeof(szTmp), kCFStringEncodingUTF8);
+        LogFlow(("rtHttpDarwinExecuteProxyAutoConfigurationUrl: hUrlScript=%p:%s\n", hUrlScript, szTmp));
+    }
+
+    /*
+     * Use CFNetworkExecuteProxyAutoConfigurationURL here so we don't have to
+     * download the script ourselves and mess around with too many CF APIs.
+     */
+    CFRunLoopRef hRunLoop = CFRunLoopGetCurrent();
+    AssertReturn(hRunLoop, NULL);
+
+    RTHTTPDARWINPACRESULT Result = { NULL, NULL };
+    CFStreamClientContext Ctx    = { 0, &Result, NULL, NULL, NULL };
+    CFRunLoopSourceRef hRunLoopSrc = CFNetworkExecuteProxyAutoConfigurationURL(hUrlScript, hUrlTarget,
+                                                                               rtHttpDarwinPacCallback, &Ctx);
+    AssertReturn(hRunLoopSrc, NULL);
+
+    CFStringRef kMode = CFSTR("com.apple.dts.CFProxySupportTool");
+    CFRunLoopAddSource(hRunLoop, hRunLoopSrc, kMode);
+    CFRunLoopRunInMode(kMode, 1.0e10, false); /* callback will force a return. */
+    CFRunLoopRemoveSource(hRunLoop, hRunLoopSrc, kMode);
+
+    /** @todo convert errors, maybe even fail. */
+
+    /*
+     * Autoconfig (or missing wpad server) typically results in:
+     *      domain:kCFErrorDomainCFNetwork; code=kCFHostErrorUnknown (2).
+     *
+     * In the autoconfig case, it looks like we're getting two entries, first
+     * one that's http://wpad/wpad.dat and a noproxy entry.  So, no reason to
+     * be very upset if this fails, just continue trying alternatives.
+     */
+    if (Result.hError)
+    {
+        if (LogIsEnabled())
+        {
+            szTmp[0] = '\0';
+            CFStringGetCString(CFErrorCopyDescription(Result.hError), szTmp, sizeof(szTmp), kCFStringEncodingUTF8);
+            Log(("rtHttpDarwinExecuteProxyAutoConfigurationUrl: error! code=%ld desc='%s'\n", (long)CFErrorGetCode(Result.hError), szTmp));
+        }
+        CFRelease(Result.hError);
+    }
+    return Result.hArrayProxies;
+}
+
+
+/**
+ * Attempt to configure the proxy according to @a hDictProxy.
+ *
+ * @returns IPRT status code. VINF_NOT_SUPPORTED if not able to configure it and
+ *          the caller should try out alternative proxy configs and fallbacks.
+ * @param   pThis           The HTTP client instance.
+ * @param   hDictProxy      The proxy configuration (see CFProxySupport.h).
+ * @param   hUrlTarget      The URL we're about to use.
+ * @param   fIgnorePacType  Whether to ignore PAC type proxy entries (i.e.
+ *                          javascript URL).  This is set when we're processing
+ *                          the output from a PAC script.
+ */
+static int rtHttpDarwinTryConfigProxy(PRTHTTPINTERNAL pThis, CFDictionaryRef hDictProxy, CFURLRef hUrlTarget, bool fIgnorePacType)
+{
+    CFStringRef hStrProxyType = (CFStringRef)CFDictionaryGetValue(hDictProxy, kCFProxyTypeKey);
+    AssertStmt(hStrProxyType, continue);
+
+    /*
+     * No proxy is fairly simple and common.
+     */
+    if (CFEqual(hStrProxyType, kCFProxyTypeNone))
+        return rtHttpUpdateAutomaticProxyDisable(pThis);
+
+    /*
+     * PAC URL means recursion, however we only do one level.
+     */
+    if (CFEqual(hStrProxyType, kCFProxyTypeAutoConfigurationURL))
+    {
+        AssertReturn(!fIgnorePacType, VINF_NOT_SUPPORTED);
+
+        CFURLRef hUrlScript = (CFURLRef)CFDictionaryGetValue(hDictProxy, kCFProxyAutoConfigurationURLKey);
+        AssertReturn(hUrlScript, VINF_NOT_SUPPORTED);
+
+        int rcRet = VINF_NOT_SUPPORTED;
+        CFArrayRef hArray = rtHttpDarwinExecuteProxyAutoConfigurationUrl(pThis, hUrlTarget, hUrlScript);
+        if (hArray)
+        {
+            rcRet = rtHttpDarwinTryConfigProxies(pThis, hArray, hUrlTarget, true /*fIgnorePacType*/);
+            CFRelease(hArray);
+        }
+        return rcRet;
+    }
+
+    /*
+     * Determine the proxy type (not entirely sure about type == proxy type and
+     * not scheme/protocol)...
+     */
+    curl_proxytype  enmProxyType      = CURLPROXY_HTTP;
+    uint32_t        uDefaultProxyPort = 8080;
+    if (   CFEqual(hStrProxyType, kCFProxyTypeHTTP)
+        || CFEqual(hStrProxyType, kCFProxyTypeHTTPS))
+    {  /* defaults */ }
+    else if (CFEqual(hStrProxyType, kCFProxyTypeSOCKS))
+    {
+        /** @todo All we get from darwin is 'SOCKS', no idea whether it's SOCK4 or
+         *        SOCK5 on the other side... Selecting SOCKS5 for now. */
+        enmProxyType = CURLPROXY_SOCKS5;
+        uDefaultProxyPort = 1080;
+    }
+    /* Unknown proxy type. */
+    else
+        return VINF_NOT_SUPPORTED;
+
+    /*
+     * Extract the proxy configuration.
+     */
+    /* The proxy host name. */
+    char szHostname[_1K];
+    CFStringRef hStr = (CFStringRef)CFDictionaryGetValue(hDictProxy, kCFProxyHostNameKey);
+    AssertReturn(hStr, VINF_NOT_SUPPORTED);
+    AssertReturn(CFStringGetCString(hStr, szHostname, sizeof(szHostname), kCFStringEncodingUTF8), VINF_NOT_SUPPORTED);
+
+    /* Get the port number (optional). */
+    SInt32      iProxyPort;
+    CFNumberRef hNum = (CFNumberRef)CFDictionaryGetValue(hDictProxy, kCFProxyPortNumberKey);
+    if (hNum && CFNumberGetValue(hNum, kCFNumberSInt32Type, &iProxyPort))
+        AssertMsgStmt(iProxyPort > 0 && iProxyPort < _64K, ("%d\n", iProxyPort), iProxyPort = uDefaultProxyPort);
+    else
+        iProxyPort = uDefaultProxyPort;
+
+    /* The proxy username. */
+    char szUsername[256];
+    hStr = (CFStringRef)CFDictionaryGetValue(hDictProxy, kCFProxyUsernameKey);
+    if (hStr)
+        AssertReturn(CFStringGetCString(hStr, szUsername, sizeof(szUsername), kCFStringEncodingUTF8), VINF_NOT_SUPPORTED);
+    else
+        szUsername[0] = '\0';
+
+    /* The proxy password. */
+    char szPassword[384];
+    hStr = (CFStringRef)CFDictionaryGetValue(hDictProxy, kCFProxyPasswordKey);
+    if (hStr)
+        AssertReturn(CFStringGetCString(hStr, szPassword, sizeof(szPassword), kCFStringEncodingUTF8), VINF_NOT_SUPPORTED);
+    else
+        szPassword[0] = '\0';
+
+    /*
+     * Apply the proxy config.
+     */
+    return rtHttpUpdateProxyConfig(pThis, enmProxyType, szHostname, iProxyPort,
+                                   szUsername[0] ? szUsername : NULL, szPassword[0] ? szPassword : NULL);
+}
+
+
+/**
+ * Try do proxy config for our HTTP client instance given an array of proxies.
+ *
+ * This is used with the output from a CFProxySupport.h API.
+ *
+ * @returns IPRT status code. VINF_NOT_SUPPORTED if not able to configure it and
+ *          we might want to try out fallbacks.
+ * @param   pThis           The HTTP client instance.
+ * @param   hArrayProxies   The proxies CFPRoxySupport have given us.
+ * @param   hUrlTarget      The URL we're about to use.
+ * @param   fIgnorePacType  Whether to ignore PAC type proxy entries (i.e.
+ *                          javascript URL).  This is set when we're processing
+ *                          the output from a PAC script.
+ */
+static int rtHttpDarwinTryConfigProxies(PRTHTTPINTERNAL pThis, CFArrayRef hArrayProxies, CFURLRef hUrlTarget, bool fIgnorePacType)
+{
+    int rcRet = VINF_NOT_SUPPORTED;
+    CFIndex const cEntries = CFArrayGetCount(hArrayProxies);
+    LogFlow(("rtHttpDarwinTryConfigProxies: cEntries=%d\n", cEntries));
+    for (CFIndex i = 0; i < cEntries; i++)
+    {
+        CFDictionaryRef hDictProxy = (CFDictionaryRef)CFArrayGetValueAtIndex(hArrayProxies, i);
+        AssertStmt(hDictProxy, continue);
+
+        rcRet = rtHttpDarwinTryConfigProxy(pThis, hDictProxy, hUrlTarget, fIgnorePacType);
+        if (rcRet != VINF_NOT_SUPPORTED)
+            break;
+    }
+    return rcRet;
+}
+
+
+/**
+ * Inner worker for rtHttpWinConfigureProxyForUrl.
+ *
+ * @returns IPRT status code. VINF_NOT_SUPPORTED if we should try fallback.
+ * @param   pThis       The HTTP client instance.
+ * @param   pszUrl      The URL.
+ */
+static int rtHttpDarwinConfigureProxyForUrlWorker(PRTHTTPINTERNAL pThis, CFDictionaryRef hDictProxies,
+                                                  const char *pszUrl, PRTURIPARSED pParsed, const char *pszHost)
+{
+    CFArrayRef  hArray;
+
+    /*
+     * From what I can tell, the CFNetworkCopyProxiesForURL API doesn't apply
+     * proxy exclusion rules (tested on 10.9).  So, do that manually.
+     */
+    RTNETADDRU  HostAddr;
+    int         fIsHostIpv4Address = -1;
+    char        szTmp[_4K];
+
+    /* If we've got a simple hostname, something containing no dots, we must check
+       whether such simple hostnames are excluded from proxying by default or not. */
+    if (strchr(pszHost, '.') == NULL)
+    {
+        if (rtHttpDarwinGetBooleanFromDict(hDictProxies, kSCPropNetProxiesExcludeSimpleHostnames, false))
+            return rtHttpUpdateAutomaticProxyDisable(pThis);
+        fIsHostIpv4Address = false;
+    }
+
+    /* Consult the exclusion list.  This is an array of strings.
+       This is very similar to what we do on windows. */
+    hArray = (CFArrayRef)CFDictionaryGetValue(hDictProxies, kSCPropNetProxiesExceptionsList);
+    if (hArray)
+    {
+        CFIndex const cEntries = CFArrayGetCount(hArray);
+        for (CFIndex i = 0; i < cEntries; i++)
+        {
+            CFStringRef hStr = (CFStringRef)CFArrayGetValueAtIndex(hArray, i);
+            AssertStmt(hStr, continue);
+            AssertStmt(CFStringGetCString(hStr, szTmp, sizeof(szTmp), kCFStringEncodingUTF8), continue);
+            RTStrToLower(szTmp);
+
+            bool fRet;
+            if (   strchr(szTmp, '*')
+                || strchr(szTmp, '?'))
+                fRet = RTStrSimplePatternMatch(szTmp, pszHost);
+            else
+            {
+                if (fIsHostIpv4Address == -1)
+                    fIsHostIpv4Address = RT_SUCCESS(RTNetStrToIPv4Addr(pszHost, &HostAddr.IPv4));
+                RTNETADDRIPV4 Network, Netmask;
+                if (   fIsHostIpv4Address
+                    && RT_SUCCESS(RTCidrStrToIPv4(szTmp, &Network, &Netmask)) )
+                    fRet = (HostAddr.IPv4.u & Netmask.u) == Network.u;
+                else
+                    fRet = strcmp(szTmp, pszHost) == 0;
+            }
+            if (fRet)
+                return rtHttpUpdateAutomaticProxyDisable(pThis);
+        }
+    }
+
+#if 0 /* The start of a manual alternative to CFNetworkCopyProxiesForURL below, hopefully we won't need this. */
+    /*
+     * Is proxy auto config (PAC) enabled?  If so, we must consult it first.
+     */
+    if (rtHttpDarwinGetBooleanFromDict(hDictProxies, kSCPropNetProxiesProxyAutoConfigEnable, false))
+    {
+        /* Convert the auto config url string to a CFURL object. */
+        CFStringRef hStrAutoConfigUrl = (CFStringRef)CFDictionaryGetValue(hDictProxies, kSCPropNetProxiesProxyAutoConfigURLString);
+        if (hStrAutoConfigUrl)
+        {
+            if (CFStringGetCString(hStrAutoConfigUrl, szTmp, sizeof(szTmp), kCFStringEncodingUTF8))
+            {
+                CFURLRef hUrlScript = rtHttpDarwinUrlToCFURL(szTmp);
+                if (hUrlScript)
+                {
+                    int      rcRet      = VINF_NOT_SUPPORTED;
+                    CFURLRef hUrlTarget = rtHttpDarwinUrlToCFURL(pszUrl);
+                    if (hUrlTarget)
+                    {
+                        /* Work around for <rdar://problem/5530166>, whatever that is.  Initializes
+                           some internal CFNetwork state, they say.  See CFPRoxySupportTool example. */
+                        hArray = CFNetworkCopyProxiesForURL(hUrlTarget, NULL);
+                        if (hArray)
+                            CFRelease(hArray);
+
+                        hArray = rtHttpDarwinExecuteProxyAutoConfigurationUrl(pThis, hUrlTarget, hUrlScript);
+                        if (hArray)
+                        {
+                            rcRet = rtHttpDarwinTryConfigProxies(pThis, hArray, hUrlTarget, true /*fIgnorePacType*/);
+                            CFRelease(hArray);
+                        }
+                    }
+                    CFRelease(hUrlScript);
+                    if (rcRet != VINF_NOT_SUPPORTED)
+                        return rcRet;
+                }
+            }
+        }
+    }
+
+    /*
+     * Try static proxy configs.
+     */
+    /** @todo later if needed. */
+    return VERR_NOT_SUPPORTED;
+
+#else
+    /*
+     * Simple solution - "just" use CFNetworkCopyProxiesForURL.
+     */
+    CFURLRef hUrlTarget = rtHttpDarwinUrlToCFURL(pszUrl);
+    AssertReturn(hUrlTarget, VERR_INTERNAL_ERROR);
+    int rcRet = VINF_NOT_SUPPORTED;
+
+    /* Work around for <rdar://problem/5530166>, whatever that is.  Initializes
+       some internal CFNetwork state, they say.  See CFPRoxySupportTool example. */
+    hArray = CFNetworkCopyProxiesForURL(hUrlTarget, NULL);
+    if (hArray)
+        CFRelease(hArray);
+
+    /* The actual run. */
+    hArray = CFNetworkCopyProxiesForURL(hUrlTarget, hDictProxies);
+    if (hArray)
+    {
+        rcRet = rtHttpDarwinTryConfigProxies(pThis, hArray, hUrlTarget, false /*fIgnorePacType*/);
+        CFRelease(hArray);
+    }
+    CFRelease(hUrlTarget);
+
+    return rcRet;
+#endif
+}
+
+/**
+ * Reconfigures the cURL proxy settings for the given URL, OS X style.
+ *
+ * @returns IPRT status code. VINF_NOT_SUPPORTED if we should try fallback.
+ * @param   pThis       The HTTP client instance.
+ * @param   pszUrl      The URL.
+ */
+static int rtHttpDarwinConfigureProxyForUrl(PRTHTTPINTERNAL pThis, const char *pszUrl)
+{
+    /*
+     * Parse the URL, if there isn't any host name (like for file:///xxx.txt)
+     * we don't need to run thru proxy settings to know what to do.
+     */
+    RTURIPARSED Parsed;
+    int rc = RTUriParse(pszUrl, &Parsed);
+    AssertRCReturn(rc, false);
+    if (Parsed.cchAuthorityHost == 0)
+        return rtHttpUpdateAutomaticProxyDisable(pThis);
+    char *pszHost = RTUriParsedAuthorityHost(pszUrl, &Parsed);
+    AssertReturn(pszHost, VERR_NO_STR_MEMORY);
+    RTStrToLower(pszHost);
+
+    /*
+     * Get a copy of the proxy settings (10.6 API).
+     */
+    CFDictionaryRef hDictProxies = CFNetworkCopySystemProxySettings(); /* Alt for 10.5: SCDynamicStoreCopyProxies(NULL); */
+    if (hDictProxies)
+        rc = rtHttpDarwinConfigureProxyForUrlWorker(pThis, hDictProxies, pszUrl, &Parsed, pszHost);
+    else
+        rc = VINF_NOT_SUPPORTED;
+    CFRelease(hDictProxies);
+
+    RTStrFree(pszHost);
+    return rc;
+}
+
+#endif /* RT_OS_DARWIN */
+
+#ifdef RT_OS_WINDOWS
+
+/**
+ * @callback_method_impl{FNRTONCE, Loads WinHttp.dll and resolves APIs}
+ */
+static DECLCALLBACK(int) rtHttpWinResolveImports(void *pvUser)
+{
+    /*
+     * winhttp.dll is not present on NT4 and probably was first introduced with XP.
+     */
+    RTLDRMOD hMod;
+    int rc = RTLdrLoadSystem("winhttp.dll", true /*fNoUnload*/, &hMod);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTLdrGetSymbol(hMod, "WinHttpOpen", (void **)&g_pfnWinHttpOpen);
+        if (RT_SUCCESS(rc))
+            rc = RTLdrGetSymbol(hMod, "WinHttpCloseHandle", (void **)&g_pfnWinHttpCloseHandle);
+        if (RT_SUCCESS(rc))
+            rc = RTLdrGetSymbol(hMod, "WinHttpGetProxyForUrl", (void **)&g_pfnWinHttpGetProxyForUrl);
+        if (RT_SUCCESS(rc))
+            rc = RTLdrGetSymbol(hMod, "WinHttpGetDefaultProxyConfiguration", (void **)&g_pfnWinHttpGetDefaultProxyConfiguration);
+        if (RT_SUCCESS(rc))
+            rc = RTLdrGetSymbol(hMod, "WinHttpGetIEProxyConfigForCurrentUser", (void **)&g_pfnWinHttpGetIEProxyConfigForCurrentUser);
+        RTLdrClose(hMod);
+        AssertRC(rc);
+    }
+    else
+        AssertMsg(g_enmWinVer < kRTWinOSType_XP, ("%Rrc\n", rc));
+
+    NOREF(pvUser);
+    return rc;
+}
+
+
+/**
+ * Matches the URL against the given Windows by-pass list.
+ *
+ * @returns true if we should by-pass the proxy for this URL, false if not.
+ * @param   pszUrl              The URL.
+ * @param   pwszBypass          The Windows by-pass list.
+ */
+static bool rtHttpWinIsUrlInBypassList(const char *pszUrl, PCRTUTF16 pwszBypass)
+{
+    /*
+     * Don't bother parsing the URL if we've actually got nothing to work with
+     * in the by-pass list.
+     */
+    if (!pwszBypass)
+        return false;
+
+    RTUTF16 wc;
+    while (   (wc = *pwszBypass) != '\0'
+           && (   RTUniCpIsSpace(wc)
+               || wc == ';') )
+        pwszBypass++;
+    if (wc == '\0')
+        return false;
+
+    /*
+     * We now need to parse the URL and extract the host name.
+     */
+    RTURIPARSED Parsed;
+    int rc = RTUriParse(pszUrl, &Parsed);
+    AssertRCReturn(rc, false);
+    char *pszHost = RTUriParsedAuthorityHost(pszUrl, &Parsed);
+    if (!pszHost) /* Don't assert, in case of file:///xxx or similar blunder. */
+        return false;
+    RTStrToLower(pszHost);
+
+    bool  fRet = false;
+    char *pszBypassFree;
+    rc = RTUtf16ToUtf8(pwszBypass, &pszBypassFree);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Walk the by-pass list.
+         *
+         * According to https://msdn.microsoft.com/en-us/library/aa384098(v=vs.85).aspx
+         * a by-pass list is semicolon delimited list.  The entries are either host
+         * names or IP addresses, and may use wildcard ('*', '?', I guess).  There
+         * special "<local>" entry matches anything without a dot.
+         */
+        RTNETADDRU  HostAddr;
+        int         fIsHostIpv4Address = -1;
+        char *pszEntry = pszBypassFree;
+        while (*pszEntry != '\0')
+        {
+            /*
+             * Find end of entry.
+             */
+            char   ch;
+            size_t cchEntry = 1;
+            while (   (ch = pszEntry[cchEntry]) != '\0'
+                   && ch != ';'
+                   && !RT_C_IS_SPACE(ch))
+                cchEntry++;
+
+            char chSaved = pszEntry[cchEntry];
+            pszEntry[cchEntry] = '\0';
+            RTStrToLower(pszEntry);
+
+            if (   cchEntry == sizeof("<local>")  - 1
+                && memcmp(pszEntry, RT_STR_TUPLE("<local>")) == 0)
+                fRet = strchr(pszHost, '.') == NULL;
+            else if (   memchr(pszEntry, '*', cchEntry) != NULL
+                     || memchr(pszEntry, '?', cchEntry) != NULL)
+                fRet = RTStrSimplePatternMatch(pszEntry, pszHost);
+            else
+            {
+                if (fIsHostIpv4Address == -1)
+                    fIsHostIpv4Address = RT_SUCCESS(RTNetStrToIPv4Addr(pszHost, &HostAddr.IPv4));
+                RTNETADDRIPV4 Network, Netmask;
+                if (   fIsHostIpv4Address
+                    && RT_SUCCESS(RTCidrStrToIPv4(pszEntry, &Network, &Netmask)) )
+                    fRet = (HostAddr.IPv4.u & Netmask.u) == Network.u;
+                else
+                    fRet = strcmp(pszEntry, pszHost) == 0;
+            }
+
+            pszEntry[cchEntry] = chSaved;
+            if (fRet)
+                break;
+
+            /*
+             * Next entry.
+             */
+            pszEntry += cchEntry;
+            while (   (ch = *pszEntry) != '\0'
+                   && (   ch == ';'
+                       || RT_C_IS_SPACE(ch)) )
+                pszEntry++;
+        }
+
+        RTStrFree(pszBypassFree);
+    }
+
+    RTStrFree(pszHost);
+    return false;
+}
+
+
+/**
+ * Searches a Windows proxy server list for the best fitting proxy to use, then
+ * reconfigures the HTTP client instance to use it.
+ *
+ * @returns IPRT status code, VINF_NOT_SUPPORTED if we need to consult fallback.
+ * @param   pThis               The HTTP client instance.
+ * @param   pszUrl              The URL needing proxying.
+ * @param   pwszProxies         The list of proxy servers to choose from.
+ */
+static int rtHttpWinSelectProxyFromList(PRTHTTPINTERNAL pThis, const char *pszUrl, PCRTUTF16 pwszProxies)
+{
+    /*
+     * Fend off empty strings (very unlikely, but just in case).
+     */
+    if (!pwszProxies)
+        return VINF_NOT_SUPPORTED;
+
+    RTUTF16 wc;
+    while (   (wc = *pwszProxies) != '\0'
+           && (   RTUniCpIsSpace(wc)
+               || wc == ';') )
+        pwszProxies++;
+    if (wc == '\0')
+        return VINF_NOT_SUPPORTED;
+
+    /*
+     * We now need to parse the URL and extract the scheme.
+     */
+    RTURIPARSED Parsed;
+    int rc = RTUriParse(pszUrl, &Parsed);
+    AssertRCReturn(rc, false);
+    char *pszUrlScheme = RTUriParsedScheme(pszUrl, &Parsed);
+    AssertReturn(pszUrlScheme, VERR_NO_STR_MEMORY);
+    size_t const cchUrlScheme = strlen(pszUrlScheme);
+
+    int rcRet = VINF_NOT_SUPPORTED;
+    char *pszProxiesFree;
+    rc = RTUtf16ToUtf8(pwszProxies, &pszProxiesFree);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Walk the server list.
+         *
+         * According to https://msdn.microsoft.com/en-us/library/aa383912(v=vs.85).aspx
+         * this is also a semicolon delimited list.  The entries are on the form:
+         *      [<scheme>=][<scheme>"://"]<server>[":"<port>]
+         */
+        bool        fBestEntryHasSameScheme = false;
+        const char *pszBestEntry = NULL;
+        char       *pszEntry = pszProxiesFree;
+        while (*pszEntry != '\0')
+        {
+            /*
+             * Find end of entry.  We include spaces here in addition to ';'.
+             */
+            char   ch;
+            size_t cchEntry = 1;
+            while (   (ch = pszEntry[cchEntry]) != '\0'
+                   && ch != ';'
+                   && !RT_C_IS_SPACE(ch))
+                cchEntry++;
+
+            char const chSaved = pszEntry[cchEntry];
+            pszEntry[cchEntry] = '\0';
+
+            /* Parse the entry. */
+            const char *pszEndOfScheme = strstr(pszEntry, "://");
+            const char *pszEqual       = (const char *)memchr(pszEntry, '=',
+                                                              pszEndOfScheme ? pszEndOfScheme - pszEntry : cchEntry);
+            if (pszEqual)
+            {
+                if (   pszEqual - pszEntry == cchUrlScheme
+                    && RTStrNICmp(pszEntry, pszUrlScheme, cchUrlScheme) == 0)
+                {
+                    pszBestEntry = pszEqual + 1;
+                    break;
+                }
+            }
+            else
+            {
+                bool fSchemeMatch = pszEndOfScheme
+                                 && pszEndOfScheme - pszEntry == cchUrlScheme
+                                 && RTStrNICmp(pszEntry, pszUrlScheme, cchUrlScheme) == 0;
+                if (   !pszBestEntry
+                    || (   !fBestEntryHasSameScheme
+                        && fSchemeMatch) )
+                {
+                    pszBestEntry = pszEntry;
+                    fBestEntryHasSameScheme = fSchemeMatch;
+                }
+            }
+
+            /*
+             * Next entry.
+             */
+            if (!chSaved)
+                break;
+            pszEntry += cchEntry + 1;
+            while (   (ch = *pszEntry) != '\0'
+                   && (   ch == ';'
+                       || RT_C_IS_SPACE(ch)) )
+                pszEntry++;
+        }
+
+        /*
+         * If we found something, try use it.
+         */
+        if (pszBestEntry)
+            rcRet = rtHttpConfigureProxyFromUrl(pThis, pszBestEntry);
+
+        RTStrFree(pszProxiesFree);
+    }
+
+    RTStrFree(pszUrlScheme);
+    return rc;
+}
+
+
+/**
+ * Reconfigures the cURL proxy settings for the given URL, Windows style.
+ *
+ * @returns IPRT status code. VINF_NOT_SUPPORTED if we should try fallback.
+ * @param   pThis       The HTTP client instance.
+ * @param   pszUrl      The URL.
+ */
+static int rtHttpWinConfigureProxyForUrl(PRTHTTPINTERNAL pThis, const char *pszUrl)
+{
+    int rcRet = VINF_NOT_SUPPORTED;
+
+    int rc = RTOnce(&g_WinResolveImportsOnce, rtHttpWinResolveImports, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Try get some proxy info for the URL.  We first try getting the IE
+         * config and seeing if we can use WinHttpGetIEProxyConfigForCurrentUser
+         * in some way, if we can we prepare ProxyOptions with a non-zero dwFlags.
+         */
+        WINHTTP_PROXY_INFO          ProxyInfo;
+        PRTUTF16                    pwszProxy = NULL;
+        PRTUTF16                    pwszNoProxy = NULL;
+        WINHTTP_AUTOPROXY_OPTIONS   AutoProxyOptions;
+        RT_ZERO(AutoProxyOptions);
+        RT_ZERO(ProxyInfo);
+
+        WINHTTP_CURRENT_USER_IE_PROXY_CONFIG IeProxyConfig;
+        if (g_pfnWinHttpGetIEProxyConfigForCurrentUser(&IeProxyConfig))
+        {
+            AutoProxyOptions.fAutoLogonIfChallenged = FALSE;
+            AutoProxyOptions.lpszAutoConfigUrl      = IeProxyConfig.lpszAutoConfigUrl;
+            if (IeProxyConfig.fAutoDetect)
+            {
+                AutoProxyOptions.dwFlags            = WINHTTP_AUTOPROXY_AUTO_DETECT | WINHTTP_AUTOPROXY_RUN_INPROCESS;
+                AutoProxyOptions.dwAutoDetectFlags  = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
+            }
+            else if (AutoProxyOptions.lpszAutoConfigUrl)
+                AutoProxyOptions.dwFlags            = WINHTTP_AUTOPROXY_CONFIG_URL;
+            else if (ProxyInfo.lpszProxy)
+                ProxyInfo.dwAccessType              = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
+            ProxyInfo.lpszProxy       = IeProxyConfig.lpszProxy;
+            ProxyInfo.lpszProxyBypass = IeProxyConfig.lpszProxyBypass;
+        }
+        else
+        {
+            AssertMsgFailed(("WinHttpGetIEProxyConfigForCurrentUser -> %u\n", GetLastError()));
+            if (!g_pfnWinHttpGetDefaultProxyConfiguration(&ProxyInfo))
+            {
+                AssertMsgFailed(("WinHttpGetDefaultProxyConfiguration -> %u\n", GetLastError()));
+                RT_ZERO(ProxyInfo);
+            }
+        }
+
+        /*
+         * Should we try WinHttGetProxyForUrl?
+         */
+        if (AutoProxyOptions.dwFlags != 0)
+        {
+            HINTERNET hSession = g_pfnWinHttpOpen(NULL /*pwszUserAgent*/, WINHTTP_ACCESS_TYPE_NO_PROXY,
+                                                  WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 /*dwFlags*/ );
+            if (hSession != NULL)
+            {
+                PRTUTF16 pwszUrl;
+                rc = RTStrToUtf16(pszUrl, &pwszUrl);
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * Try autodetect first, then fall back on the config URL if there is one.
+                     *
+                     * Also, we first try without auto authentication, then with.  This will according
+                     * to http://msdn.microsoft.com/en-us/library/aa383153%28v=VS.85%29.aspx help with
+                     * caching the result when it's processed out-of-process (seems default here on W10).
+                     */
+                    WINHTTP_PROXY_INFO TmpProxyInfo;
+                    BOOL fRc = g_pfnWinHttpGetProxyForUrl(hSession, pwszUrl, &AutoProxyOptions, &TmpProxyInfo);
+                    if (   !fRc
+                        && GetLastError() == ERROR_WINHTTP_LOGIN_FAILURE)
+                    {
+                        AutoProxyOptions.fAutoLogonIfChallenged = TRUE;
+                        fRc = g_pfnWinHttpGetProxyForUrl(hSession, pwszUrl, &AutoProxyOptions, &TmpProxyInfo);
+                    }
+
+                    if (   !fRc
+                        && AutoProxyOptions.dwFlags != WINHTTP_AUTOPROXY_CONFIG_URL
+                        && AutoProxyOptions.lpszAutoConfigUrl)
+                    {
+                        AutoProxyOptions.fAutoLogonIfChallenged = FALSE;
+                        AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
+                        AutoProxyOptions.dwAutoDetectFlags = 0;
+                        fRc = g_pfnWinHttpGetProxyForUrl(hSession, pwszUrl, &AutoProxyOptions, &TmpProxyInfo);
+                        if (   !fRc
+                            && GetLastError() == ERROR_WINHTTP_LOGIN_FAILURE)
+                        {
+                            AutoProxyOptions.fAutoLogonIfChallenged = TRUE;
+                            fRc = g_pfnWinHttpGetProxyForUrl(hSession, pwszUrl, &AutoProxyOptions, &TmpProxyInfo);
+                        }
+                    }
+
+                    if (fRc)
+                    {
+                        if (ProxyInfo.lpszProxy)
+                            GlobalFree(ProxyInfo.lpszProxy);
+                        if (ProxyInfo.lpszProxyBypass)
+                            GlobalFree(ProxyInfo.lpszProxyBypass);
+                        ProxyInfo = TmpProxyInfo;
+                    }
+                    /*
+                     * If the autodetection failed, assume no proxy.
+                     */
+                    else
+                    {
+                        DWORD dwErr = GetLastError();
+                        if (dwErr == ERROR_WINHTTP_AUTODETECTION_FAILED)
+                            rcRet = rtHttpUpdateAutomaticProxyDisable(pThis);
+                        else
+                            AssertMsgFailed(("g_pfnWinHttpGetProxyForUrl -> %u\n", dwErr));
+                    }
+                    RTUtf16Free(pwszUrl);
+                }
+                else
+                {
+                    AssertMsgFailed(("RTStrToUtf16(%s,) -> %Rrc\n", pszUrl, rc));
+                    rcRet = rc;
+                }
+                 g_pfnWinHttpCloseHandle(hSession);
+            }
+            else
+                AssertMsgFailed(("g_pfnWinHttpOpen -> %u\n", GetLastError()));
+        }
+
+        /*
+         * Try use the proxy info we've found.
+         */
+        switch (ProxyInfo.dwAccessType)
+        {
+            case WINHTTP_ACCESS_TYPE_NO_PROXY:
+                rcRet = rtHttpUpdateAutomaticProxyDisable(pThis);
+                break;
+
+            case WINHTTP_ACCESS_TYPE_NAMED_PROXY:
+                if (!rtHttpWinIsUrlInBypassList(pszUrl, ProxyInfo.lpszProxyBypass))
+                    rcRet = rtHttpWinSelectProxyFromList(pThis, pszUrl, ProxyInfo.lpszProxy);
+                else
+                    rcRet = rtHttpUpdateAutomaticProxyDisable(pThis);
+                break;
+
+            case 0:
+                break;
+
+            default:
+                AssertMsgFailed(("%#x\n", ProxyInfo.dwAccessType));
+        }
+
+        /*
+         * Cleanup.
+         */
+        if (ProxyInfo.lpszProxy)
+            GlobalFree(ProxyInfo.lpszProxy);
+        if (ProxyInfo.lpszProxyBypass)
+            GlobalFree(ProxyInfo.lpszProxyBypass);
+        if (AutoProxyOptions.lpszAutoConfigUrl)
+            GlobalFree((PRTUTF16)AutoProxyOptions.lpszAutoConfigUrl);
+    }
+
+    return rcRet;
+}
+
+#endif /* RT_OS_WINDOWS */
+
+
+static int rtHttpConfigureProxyForUrl(PRTHTTPINTERNAL pThis, const char *pszUrl)
+{
+    if (pThis->fUseSystemProxySettings)
+    {
+#ifdef IPRT_USE_LIBPROXY
+        int rc = rtHttpLibProxyConfigureProxyForUrl(pThis, pszUrl);
+        if (rc == VINF_SUCCESS || RT_FAILURE(rc))
+            return rc;
+        Assert(rc == VINF_NOT_SUPPORTED);
+#endif
+#ifdef RT_OS_DARWIN
+        int rc = rtHttpDarwinConfigureProxyForUrl(pThis, pszUrl);
+        if (rc == VINF_SUCCESS || RT_FAILURE(rc))
+            return rc;
+        Assert(rc == VINF_NOT_SUPPORTED);
+#endif
+#ifdef RT_OS_WINDOWS
+        int rc = rtHttpWinConfigureProxyForUrl(pThis, pszUrl);
+        if (rc == VINF_SUCCESS || RT_FAILURE(rc))
+            return rc;
+        Assert(rc == VINF_NOT_SUPPORTED);
+#endif
+/** @todo system specific class here, fall back on env vars if necessary. */
+        return rtHttpConfigureProxyForUrlFromEnv(pThis, pszUrl);
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpSetProxy(RTHTTP hHttp, const char *pcszProxy, uint32_t uPort,
+                             const char *pcszProxyUser, const char *pcszProxyPwd)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+    AssertPtrReturn(pcszProxy, VERR_INVALID_PARAMETER);
+    AssertReturn(!pThis->fBusy, VERR_WRONG_ORDER);
+
+    /*
+     * Update the settings.
+     *
+     * Currently, we don't make alot of effort parsing or checking the input, we
+     * leave that to cURL.  (A bit afraid of breaking user settings.)
+     */
+    pThis->fUseSystemProxySettings = false;
+    return rtHttpUpdateProxyConfig(pThis, CURLPROXY_HTTP, pcszProxy, uPort ? uPort : 1080, pcszProxyUser, pcszProxyPwd);
+}
+
+
+RTR3DECL(int) RTHttpSetHeaders(RTHTTP hHttp, size_t cHeaders, const char * const *papszHeaders)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    pThis->fHaveUserAgentHeader = false;
+    if (!cHeaders)
+    {
+        if (pThis->pHeaders)
+            curl_slist_free_all(pThis->pHeaders);
+        pThis->pHeaders = 0;
+        return VINF_SUCCESS;
+    }
+
+    struct curl_slist *pHeaders = NULL;
+    for (size_t i = 0; i < cHeaders; i++)
+    {
+        pHeaders = curl_slist_append(pHeaders, papszHeaders[i]);
+        if (strncmp(papszHeaders[i], RT_STR_TUPLE("User-Agent:")) == 0)
+            pThis->fHaveUserAgentHeader = true;
+    }
+
+    pThis->pHeaders = pHeaders;
+    int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_HTTPHEADER, pHeaders);
+    if (CURL_FAILURE(rcCurl))
+        return VERR_INVALID_PARAMETER;
+
+    /*
+     * Unset the user agent if it's in one of the headers.
+     */
+    if (   pThis->fHaveUserAgentHeader
+        && pThis->fHaveSetUserAgent)
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_USERAGENT, (char *)NULL);
+        Assert(CURL_SUCCESS(rcCurl));
+        pThis->fHaveSetUserAgent = false;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Set the CA file to NULL, deleting any temporary file if necessary.
+ *
+ * @param   pThis           The HTTP/HTTPS client instance.
+ */
+static void rtHttpUnsetCaFile(PRTHTTPINTERNAL pThis)
+{
+    if (pThis->pszCaFile)
+    {
+        if (pThis->fDeleteCaFile)
+        {
+            int rc2 = RTFileDelete(pThis->pszCaFile);
+            AssertMsg(RT_SUCCESS(rc2) || !RTFileExists(pThis->pszCaFile), ("rc=%Rrc '%s'\n", rc2, pThis->pszCaFile));
+        }
+        RTStrFree(pThis->pszCaFile);
+        pThis->pszCaFile = NULL;
+    }
+}
+
+
+RTR3DECL(int) RTHttpSetCAFile(RTHTTP hHttp, const char *pszCaFile)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    rtHttpUnsetCaFile(pThis);
+
+    pThis->fDeleteCaFile = false;
+    if (pszCaFile)
+        return RTStrDupEx(&pThis->pszCaFile, pszCaFile);
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTHttpUseTemporaryCaFile(RTHTTP hHttp, PRTERRINFO pErrInfo)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    /*
+     * Create a temporary file.
+     */
+    int rc = VERR_NO_STR_MEMORY;
+    char *pszCaFile = RTStrAlloc(RTPATH_MAX);
+    if (pszCaFile)
+    {
+        RTFILE hFile;
+        rc = RTFileOpenTemp(&hFile, pszCaFile, RTPATH_MAX,
+                            RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_DENY_NONE | (0600 << RTFILE_O_CREATE_MODE_SHIFT));
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Gather certificates into a temporary store and export them to the temporary file.
+             */
+            RTCRSTORE hStore;
+            rc = RTCrStoreCreateInMem(&hStore, 256);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTHttpGatherCaCertsInStore(hStore, 0 /*fFlags*/, pErrInfo);
+                if (RT_SUCCESS(rc))
+                    /** @todo Consider adding an API for exporting to a RTFILE... */
+                    rc = RTCrStoreCertExportAsPem(hStore, 0 /*fFlags*/, pszCaFile);
+                RTCrStoreRelease(hStore);
+            }
+            RTFileClose(hFile);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Set the CA file for the instance.
+                 */
+                rtHttpUnsetCaFile(pThis);
+
+                pThis->fDeleteCaFile = true;
+                pThis->pszCaFile = pszCaFile;
+                return VINF_SUCCESS;
+            }
+
+            int rc2 = RTFileDelete(pszCaFile);
+            AssertRC(rc2);
+        }
+        else
+            RTErrInfoAddF(pErrInfo, rc, "Error creating temorary file: %Rrc", rc);
+
+        RTStrFree(pszCaFile);
+    }
+    return rc;
+}
+
+
+RTR3DECL(int) RTHttpGatherCaCertsInStore(RTCRSTORE hStore, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+    uint32_t const cBefore = RTCrStoreCertCount(hStore);
+    AssertReturn(cBefore != UINT32_MAX, VERR_INVALID_HANDLE);
+
+    /*
+     * Add the user store, quitely ignoring any errors.
+     */
+    RTCRSTORE hSrcStore;
+    int rcUser = RTCrStoreCreateSnapshotById(&hSrcStore, RTCRSTOREID_USER_TRUSTED_CAS_AND_CERTIFICATES, pErrInfo);
+    if (RT_SUCCESS(rcUser))
+    {
+        rcUser = RTCrStoreCertAddFromStore(hStore, RTCRCERTCTX_F_ADD_IF_NOT_FOUND | RTCRCERTCTX_F_ADD_CONTINUE_ON_ERROR,
+                                           hSrcStore);
+        RTCrStoreRelease(hSrcStore);
+    }
+
+    /*
+     * Ditto for the system store.
+     */
+    int rcSystem = RTCrStoreCreateSnapshotById(&hSrcStore, RTCRSTOREID_SYSTEM_TRUSTED_CAS_AND_CERTIFICATES, pErrInfo);
+    if (RT_SUCCESS(rcSystem))
+    {
+        rcSystem = RTCrStoreCertAddFromStore(hStore, RTCRCERTCTX_F_ADD_IF_NOT_FOUND | RTCRCERTCTX_F_ADD_CONTINUE_ON_ERROR,
+                                             hSrcStore);
+        RTCrStoreRelease(hSrcStore);
+    }
+
+    /*
+     * If the number of certificates increased, we consider it a success.
+     */
+    if (RTCrStoreCertCount(hStore) > cBefore)
+    {
+        if (RT_FAILURE(rcSystem))
+            return -rcSystem;
+        if (RT_FAILURE(rcUser))
+            return -rcUser;
+        return rcSystem != VINF_SUCCESS ? rcSystem : rcUser;
+    }
+
+    if (RT_FAILURE(rcSystem))
+        return rcSystem;
+    if (RT_FAILURE(rcUser))
+        return rcUser;
+    return VERR_NOT_FOUND;
+}
+
+
+RTR3DECL(int) RTHttpGatherCaCertsInFile(const char *pszCaFile, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+    RTCRSTORE hStore;
+    int rc = RTCrStoreCreateInMem(&hStore, 256);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTHttpGatherCaCertsInStore(hStore, fFlags, pErrInfo);
+        if (RT_SUCCESS(rc))
+            rc = RTCrStoreCertExportAsPem(hStore, 0 /*fFlags*/, pszCaFile);
+        RTCrStoreRelease(hStore);
+    }
+    return rc;
+}
+
+
+
+/**
+ * Figures out the IPRT status code for a GET.
+ *
+ * @returns IPRT status code.
+ * @param   pThis           The HTTP/HTTPS client instance.
+ * @param   rcCurl          What curl returned.
+ */
+static int rtHttpGetCalcStatus(PRTHTTPINTERNAL pThis, int rcCurl)
+{
+    int rc = VERR_HTTP_CURL_ERROR;
+
+    if (pThis->pszRedirLocation)
+    {
+        RTStrFree(pThis->pszRedirLocation);
+        pThis->pszRedirLocation = NULL;
+    }
+    if (rcCurl == CURLE_OK)
+    {
+        curl_easy_getinfo(pThis->pCurl, CURLINFO_RESPONSE_CODE, &pThis->lLastResp);
+        switch (pThis->lLastResp)
+        {
+            case 200:
+                /* OK, request was fulfilled */
+            case 204:
+                /* empty response */
+                rc = VINF_SUCCESS;
+                break;
+            case 301:
+            {
+                const char *pszRedirect;
+                curl_easy_getinfo(pThis->pCurl, CURLINFO_REDIRECT_URL, &pszRedirect);
+                size_t cb = strlen(pszRedirect);
+                if (cb > 0 && cb < 2048)
+                    pThis->pszRedirLocation = RTStrDup(pszRedirect);
+                rc = VERR_HTTP_REDIRECTED;
+                break;
+            }
+            case 400:
+                /* bad request */
+                rc = VERR_HTTP_BAD_REQUEST;
+                break;
+            case 403:
+                /* forbidden, authorization will not help */
+                rc = VERR_HTTP_ACCESS_DENIED;
+                break;
+            case 404:
+                /* URL not found */
+                rc = VERR_HTTP_NOT_FOUND;
+                break;
+        }
+
+        if (pThis->pszRedirLocation)
+            Log(("rtHttpGetCalcStatus: rc=%Rrc lastResp=%lu redir='%s'\n", rc, pThis->lLastResp, pThis->pszRedirLocation));
+        else
+            Log(("rtHttpGetCalcStatus: rc=%Rrc lastResp=%lu\n", rc, pThis->lLastResp));
+    }
+    else
+    {
+        switch (rcCurl)
+        {
+            case CURLE_URL_MALFORMAT:
+            case CURLE_COULDNT_RESOLVE_HOST:
+                rc = VERR_HTTP_NOT_FOUND;
+                break;
+            case CURLE_COULDNT_CONNECT:
+                rc = VERR_HTTP_COULDNT_CONNECT;
+                break;
+            case CURLE_SSL_CONNECT_ERROR:
+                rc = VERR_HTTP_SSL_CONNECT_ERROR;
+                break;
+            case CURLE_SSL_CACERT:
+                /* The peer certificate cannot be authenticated with the CA certificates
+                 * set by RTHttpSetCAFile(). We need other or additional CA certificates. */
+                rc = VERR_HTTP_CACERT_CANNOT_AUTHENTICATE;
+                break;
+            case CURLE_SSL_CACERT_BADFILE:
+                /* CAcert file (see RTHttpSetCAFile()) has wrong format */
+                rc = VERR_HTTP_CACERT_WRONG_FORMAT;
+                break;
+            case CURLE_ABORTED_BY_CALLBACK:
+                /* forcefully aborted */
+                rc = VERR_HTTP_ABORTED;
+                break;
+            case CURLE_COULDNT_RESOLVE_PROXY:
+                rc = VERR_HTTP_PROXY_NOT_FOUND;
+                break;
+            case CURLE_WRITE_ERROR:
+                rc = RT_FAILURE_NP(pThis->rcOutput) ? pThis->rcOutput : VERR_WRITE_ERROR;
+                break;
+            //case CURLE_READ_ERROR
+
+            default:
+                break;
+        }
+        Log(("rtHttpGetCalcStatus: rc=%Rrc rcCurl=%u\n", rc, rcCurl));
+    }
+
+    return rc;
+}
+
+
+/**
+ * cURL callback for reporting progress, we use it for checking for abort.
+ */
+static int rtHttpProgress(void *pData, double rdTotalDownload, double rdDownloaded, double rdTotalUpload, double rdUploaded)
+{
+    PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)pData;
+    AssertReturn(pThis->u32Magic == RTHTTP_MAGIC, 1);
+
+    pThis->cbDownloadHint = (uint64_t)rdTotalDownload;
+
+    return pThis->fAbort ? 1 : 0;
+}
+
+
+/**
+ * Whether we're likely to need SSL to handle the give URL.
+ *
+ * @returns true if we need, false if we probably don't.
+ * @param   pszUrl              The URL.
+ */
+static bool rtHttpNeedSsl(const char *pszUrl)
+{
+    return RTStrNICmp(pszUrl, RT_STR_TUPLE("https:")) == 0;
+}
+
+
+/**
+ * Applies recoded settings to the cURL instance before doing work.
+ *
+ * @returns IPRT status code.
+ * @param   pThis           The HTTP/HTTPS client instance.
+ * @param   pszUrl          The URL.
+ */
+static int rtHttpApplySettings(PRTHTTPINTERNAL pThis, const char *pszUrl)
+{
+    /*
+     * The URL.
+     */
+    int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_URL, pszUrl);
+    if (CURL_FAILURE(rcCurl))
+        return VERR_INVALID_PARAMETER;
+
+    /*
+     * Proxy config.
+     */
+    int rc = rtHttpConfigureProxyForUrl(pThis, pszUrl);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /*
+     * Setup SSL.  Can be a bit of work.
+     */
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_SSLVERSION, (long)CURL_SSLVERSION_TLSv1);
+    if (CURL_FAILURE(rcCurl))
+        return VERR_INVALID_PARAMETER;
+
+    const char *pszCaFile = pThis->pszCaFile;
+    if (   !pszCaFile
+        && rtHttpNeedSsl(pszUrl))
+    {
+        rc = RTHttpUseTemporaryCaFile(pThis, NULL);
+        if (RT_SUCCESS(rc))
+            pszCaFile = pThis->pszCaFile;
+        else
+            return rc; /* Non-portable alternative: pszCaFile = "/etc/ssl/certs/ca-certificates.crt"; */
+    }
+    if (pszCaFile)
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_CAINFO, pszCaFile);
+        if (CURL_FAILURE(rcCurl))
+            return VERR_HTTP_CURL_ERROR;
+    }
+
+    /*
+     * Progress/abort.
+     */
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROGRESSFUNCTION, &rtHttpProgress);
+    if (CURL_FAILURE(rcCurl))
+        return VERR_HTTP_CURL_ERROR;
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_PROGRESSDATA, (void *)pThis);
+    if (CURL_FAILURE(rcCurl))
+        return VERR_HTTP_CURL_ERROR;
+    rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_NOPROGRESS, (long)0);
+    if (CURL_FAILURE(rcCurl))
+        return VERR_HTTP_CURL_ERROR;
+
+    /*
+     * Set default user agent string if necessary.  Some websites take offence
+     * if we don't set it.
+     */
+    if (   !pThis->fHaveSetUserAgent
+        && !pThis->fHaveUserAgentHeader)
+    {
+        rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_USERAGENT, "Mozilla/5.0 (AgnosticOS; Blend) IPRT/64.42");
+        if (CURL_FAILURE(rcCurl))
+            return VERR_HTTP_CURL_ERROR;
+        pThis->fHaveSetUserAgent = true;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * cURL callback for writing data.
+ */
+static size_t rtHttpWriteData(void *pvBuf, size_t cbUnit, size_t cUnits, void *pvUser)
+{
+    PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)pvUser;
+
+    /*
+     * Do max size and overflow checks.
+     */
+    size_t const cbToAppend = cbUnit * cUnits;
+    size_t const cbCurSize  = pThis->Output.Mem.cb;
+    size_t const cbNewSize  = cbCurSize + cbToAppend;
+    if (   cbToAppend < RTHTTP_MAX_MEM_DOWNLOAD_SIZE
+        && cbNewSize  < RTHTTP_MAX_MEM_DOWNLOAD_SIZE)
+    {
+        if (cbNewSize + 1 <= pThis->Output.Mem.cbAllocated)
+        {
+            memcpy(&pThis->Output.Mem.pb[cbCurSize], pvBuf, cbToAppend);
+            pThis->Output.Mem.cb = cbNewSize;
+            pThis->Output.Mem.pb[cbNewSize] = '\0';
+            return cbToAppend;
+        }
+
+        /*
+         * We need to reallocate the output buffer.
+         */
+        /** @todo this could do with a better strategy wrt growth. */
+        size_t cbAlloc = RT_ALIGN_Z(cbNewSize + 1, 64);
+        if (   cbAlloc <= pThis->cbDownloadHint
+            && pThis->cbDownloadHint < RTHTTP_MAX_MEM_DOWNLOAD_SIZE)
+            cbAlloc = RT_ALIGN_Z(pThis->cbDownloadHint + 1, 64);
+
+        uint8_t *pbNew = (uint8_t *)RTMemRealloc(pThis->Output.Mem.pb, cbAlloc);
+        if (pbNew)
+        {
+            memcpy(&pbNew[cbCurSize], pvBuf, cbToAppend);
+            pbNew[cbNewSize] = '\0';
+
+            pThis->Output.Mem.cbAllocated = cbAlloc;
+            pThis->Output.Mem.pb = pbNew;
+            pThis->Output.Mem.cb = cbNewSize;
+            return cbToAppend;
+        }
+
+        pThis->rcOutput = VERR_NO_MEMORY;
+    }
+    else
+        pThis->rcOutput = VERR_TOO_MUCH_DATA;
+
+    /*
+     * Failure - abort.
+     */
+    RTMemFree(pThis->Output.Mem.pb);
+    pThis->Output.Mem.pb = NULL;
+    pThis->Output.Mem.cb = RTHTTP_MAX_MEM_DOWNLOAD_SIZE;
+    pThis->fAbort        = true;
+    return 0;
+}
+
+
+/**
+ * Internal worker that performs a HTTP GET.
+ *
+ * @returns IPRT status code.
+ * @param   hHttp               The HTTP/HTTPS client instance.
+ * @param   pszUrl              The URL.
+ * @param   ppvResponse         Where to return the pointer to the allocated
+ *                              response data (RTMemFree).  There will always be
+ *                              an zero terminator char after the response, that
+ *                              is not part of the size returned via @a pcb.
+ * @param   pcb                 The size of the response data.
+ *
+ * @remarks We ASSUME the API user doesn't do concurrent GETs in different
+ *          threads, because that will probably blow up!
+ */
+static int rtHttpGetToMem(RTHTTP hHttp, const char *pszUrl, uint8_t **ppvResponse, size_t *pcb)
+{
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    /*
+     * Reset the return values in case of more "GUI programming" on the client
+     * side (i.e. a programming style not bothering checking return codes).
+     */
+    *ppvResponse = NULL;
+    *pcb         = 0;
+
+    /*
+     * Set the busy flag (paranoia).
+     */
+    bool fBusy = ASMAtomicXchgBool(&pThis->fBusy, true);
+    AssertReturn(!fBusy, VERR_WRONG_ORDER);
+
+    /*
+     * Reset the state and apply settings.
+     */
+    pThis->fAbort = false;
+    pThis->rcOutput = VINF_SUCCESS;
+    pThis->cbDownloadHint = 0;
+
+    int rc = rtHttpApplySettings(hHttp, pszUrl);
+    if (RT_SUCCESS(rc))
+    {
+        RT_ZERO(pThis->Output.Mem);
+        int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEFUNCTION, &rtHttpWriteData);
+        if (!CURL_FAILURE(rcCurl))
+            rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEDATA, (void *)pThis);
+        if (!CURL_FAILURE(rcCurl))
+        {
+            /*
+             * Perform the HTTP operation.
+             */
+            rcCurl = curl_easy_perform(pThis->pCurl);
+            rc = rtHttpGetCalcStatus(pThis, rcCurl);
+            if (RT_SUCCESS(rc))
+                rc = pThis->rcOutput;
+            if (RT_SUCCESS(rc))
+            {
+                *ppvResponse = pThis->Output.Mem.pb;
+                *pcb         = pThis->Output.Mem.cb;
+                Log(("rtHttpGetToMem: %zx bytes (allocated %zx)\n", pThis->Output.Mem.cb, pThis->Output.Mem.cbAllocated));
+            }
+            else if (pThis->Output.Mem.pb)
+                RTMemFree(pThis->Output.Mem.pb);
+            RT_ZERO(pThis->Output.Mem);
+        }
+        else
+            rc = VERR_HTTP_CURL_ERROR;
+    }
+
+    ASMAtomicWriteBool(&pThis->fBusy, false);
+    return rc;
+}
+
+
+RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pszUrl, char **ppszNotUtf8)
+{
+    Log(("RTHttpGetText: hHttp=%p pszUrl=%s\n", hHttp, pszUrl));
+    uint8_t *pv;
+    size_t   cb;
+    int rc = rtHttpGetToMem(hHttp, pszUrl, &pv, &cb);
+    if (RT_SUCCESS(rc))
+    {
+        if (pv) /* paranoia */
+            *ppszNotUtf8 = (char *)pv;
+        else
+            *ppszNotUtf8 = (char *)RTMemDup("", 1);
+    }
+    else
+        *ppszNotUtf8 = NULL;
+    return rc;
+}
+
+
+RTR3DECL(void) RTHttpFreeResponseText(char *pszNotUtf8)
+{
+    RTMemFree(pszNotUtf8);
+}
+
+
+RTR3DECL(int) RTHttpGetBinary(RTHTTP hHttp, const char *pszUrl, void **ppvResponse, size_t *pcb)
+{
+    Log(("RTHttpGetBinary: hHttp=%p pszUrl=%s\n", hHttp, pszUrl));
+    return rtHttpGetToMem(hHttp, pszUrl, (uint8_t **)ppvResponse, pcb);
+}
+
+
+RTR3DECL(void) RTHttpFreeResponse(void *pvResponse)
+{
+    RTMemFree(pvResponse);
+}
+
+
+/**
+ * cURL callback for writing data to a file.
+ */
+static size_t rtHttpWriteDataToFile(void *pvBuf, size_t cbUnit, size_t cUnits, void *pvUser)
+{
+    PRTHTTPINTERNAL pThis = (PRTHTTPINTERNAL)pvUser;
+    size_t cbWritten = 0;
+    int rc = RTFileWrite(pThis->Output.hFile, pvBuf, cbUnit * cUnits, &cbWritten);
+    if (RT_SUCCESS(rc))
+        return cbWritten;
+    Log(("rtHttpWriteDataToFile: rc=%Rrc cbUnit=%zd cUnits=%zu\n", rc, cbUnit, cUnits));
+    pThis->rcOutput = rc;
+    return 0;
+}
+
+
+RTR3DECL(int) RTHttpGetFile(RTHTTP hHttp, const char *pszUrl, const char *pszDstFile)
+{
+    Log(("RTHttpGetBinary: hHttp=%p pszUrl=%s pszDstFile=%s\n", hHttp, pszUrl, pszDstFile));
+    PRTHTTPINTERNAL pThis = hHttp;
+    RTHTTP_VALID_RETURN(pThis);
+
+    /*
+     * Set the busy flag (paranoia).
+     */
+    bool fBusy = ASMAtomicXchgBool(&pThis->fBusy, true);
+    AssertReturn(!fBusy, VERR_WRONG_ORDER);
+
+    /*
+     * Reset the state and apply settings.
+     */
+    pThis->fAbort = false;
+    pThis->rcOutput = VINF_SUCCESS;
+    pThis->cbDownloadHint = 0;
+
+    int rc = rtHttpApplySettings(hHttp, pszUrl);
+    if (RT_SUCCESS(rc))
+    {
+        pThis->Output.hFile = NIL_RTFILE;
+        int rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEFUNCTION, &rtHttpWriteDataToFile);
+        if (!CURL_FAILURE(rcCurl))
+            rcCurl = curl_easy_setopt(pThis->pCurl, CURLOPT_WRITEDATA, (void *)pThis);
+        if (!CURL_FAILURE(rcCurl))
+        {
+            /*
+             * Open the output file.
+             */
+            rc = RTFileOpen(&pThis->Output.hFile, pszDstFile, RTFILE_O_CREATE_REPLACE | RTFILE_O_WRITE | RTFILE_O_DENY_READWRITE);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Perform the HTTP operation.
+                 */
+                rcCurl = curl_easy_perform(pThis->pCurl);
+                rc = rtHttpGetCalcStatus(pThis, rcCurl);
+                if (RT_SUCCESS(rc))
+                     rc = pThis->rcOutput;
+
+                int rc2 = RTFileClose(pThis->Output.hFile);
+                if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+                    rc = rc2;
+            }
+            pThis->Output.hFile = NIL_RTFILE;
+        }
+        else
+            rc = VERR_HTTP_CURL_ERROR;
+    }
+
+    ASMAtomicWriteBool(&pThis->fBusy, false);
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/include/internal/pipe.h b/src/VBox/Runtime/include/internal/pipe.h
index c4e992a..19f182d 100644
--- a/src/VBox/Runtime/include/internal/pipe.h
+++ b/src/VBox/Runtime/include/internal/pipe.h
@@ -81,6 +81,44 @@ uint32_t    rtPipePollStart(RTPIPE hPipe, RTPOLLSET hPollSet, uint32_t fEvents,
  */
 uint32_t    rtPipePollDone(RTPIPE hPipe, uint32_t fEvents, bool fFinalEntry, bool fHarvestEvents);
 
+
+/**
+ * Fakes basic query info data for RTPipeQueryInfo.
+ *
+ * @param   pObjInfo            The output structure.
+ * @param   enmAddAttr          The extra attribute.
+ * @param   fReadPipe           Set if read pipe, clear if write pipe.
+ */
+DECLINLINE(void) rtPipeFakeQueryInfo(PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr, bool fReadPipe)
+{
+    RT_ZERO(*pObjInfo);
+    if (fReadPipe)
+        pObjInfo->Attr.fMode     = RTFS_TYPE_FIFO | RTFS_UNIX_IRUSR | RTFS_DOS_READONLY;
+    else
+        pObjInfo->Attr.fMode     = RTFS_TYPE_FIFO | RTFS_UNIX_IWUSR;
+    pObjInfo->Attr.enmAdditional = enmAddAttr;
+    switch (enmAddAttr)
+    {
+        case RTFSOBJATTRADD_UNIX:
+            pObjInfo->Attr.u.Unix.cHardlinks = 1;
+            break;
+        case RTFSOBJATTRADD_UNIX_OWNER:
+            pObjInfo->Attr.u.UnixOwner.uid = NIL_RTUID;
+            break;
+        case RTFSOBJATTRADD_UNIX_GROUP:
+            pObjInfo->Attr.u.UnixGroup.gid = NIL_RTGID;
+            break;
+        case RTFSOBJATTRADD_EASIZE:
+            break;
+        case RTFSOBJATTRADD_32BIT_SIZE_HACK:
+        case RTFSOBJATTRADD_NOTHING:
+            /* shut up gcc. */
+            break;
+        /* no default, want warnings. */
+    }
+}
+
+
 RT_C_DECLS_END
 
 #endif
diff --git a/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp b/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
index 535ce52..4810306 100644
--- a/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
+++ b/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
@@ -64,6 +64,9 @@ RTDECL(int)  RTErrConvertFromNtStatus(long lNativeCode)
         case STATUS_OBJECT_PATH_SYNTAX_BAD: return VERR_INVALID_NAME;
         case STATUS_BAD_NETWORK_PATH:       return VERR_NET_PATH_NOT_FOUND;
         case STATUS_NOT_A_DIRECTORY:        return VERR_NOT_A_DIRECTORY;
+
+        case STATUS_UNEXPECTED_NETWORK_ERROR:
+                                            return VERR_NET_IO_ERROR;
     }
 
     /* unknown error. */
diff --git a/src/VBox/Runtime/r3/nt/direnum-r3-nt.cpp b/src/VBox/Runtime/r3/nt/direnum-r3-nt.cpp
index 4e88c65..c41e4c5 100644
--- a/src/VBox/Runtime/r3/nt/direnum-r3-nt.cpp
+++ b/src/VBox/Runtime/r3/nt/direnum-r3-nt.cpp
@@ -349,7 +349,10 @@ static int rtDirNtFetchMore(PRTDIR pThis)
          *
          * Thus the mess.
          */
-        pThis->enmInfoClass = FileIdBothDirectoryInformation;
+        if (RT_MAKE_U64(RTNtCurrentPeb()->OSMinorVersion, RTNtCurrentPeb()->OSMajorVersion) > RT_MAKE_U64(0,5) /* > W2K */)
+            pThis->enmInfoClass = FileIdBothDirectoryInformation; /* Introduced in XP, from I can tell. */
+        else
+            pThis->enmInfoClass = FileBothDirectoryInformation;
         rcNt = NtQueryDirectoryFile(pThis->hDir,
                                     NULL /* Event */,
                                     NULL /* ApcRoutine */,
diff --git a/src/VBox/Runtime/r3/os2/pipe-os2.cpp b/src/VBox/Runtime/r3/os2/pipe-os2.cpp
index 31f99a4..9876e88 100644
--- a/src/VBox/Runtime/r3/os2/pipe-os2.cpp
+++ b/src/VBox/Runtime/r3/os2/pipe-os2.cpp
@@ -878,6 +878,35 @@ RTDECL(int) RTPipeQueryReadable(RTPIPE hPipe, size_t *pcbReadable)
 }
 
 
+RTDECL(int) RTPipeQueryInfo(RTPIPE hPipe, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    RTPIPEINTERNAL *pThis = hPipe;
+    AssertPtrReturn(pThis, 0);
+    AssertReturn(pThis->u32Magic == RTPIPE_MAGIC, 0);
+
+    int rc = RTCritSectEnter(&pThis->CritSect);
+    AssertRCReturn(rc, 0);
+
+    rtPipeFakeQueryInfo(pObjInfo, enmAddAttr, pThis->fRead);
+
+    if (pThis->fRead)
+    {
+        ULONG       cbActual = 0;
+        ULONG       ulState  = 0;
+        AVAILDATA   Avail    = { 0, 0 };
+        APIRET orc = DosPeekNPipe(pThis->hPipe, NULL, 0, &cbActual, &Avail, &ulState);
+        if (orc == NO_ERROR && (Avail.cbpipe > 0 || ulState == NP_STATE_CONNECTED))
+            pObjInfo->cbObject = Avail.cbpipe;
+    }
+    else
+        pObjInfo->cbObject = rtPipeOs2GetSpace(pThis);
+    pObjInfo->cbAllocated = RTPIPE_OS2_SIZE; /** @todo this isn't necessarily true if we didn't create it... but, whatever */
+
+    RTCritSectLeave(&pThis->CritSect);
+    return VINF_SUCCESS;
+}
+
+
 int rtPipePollGetHandle(RTPIPE hPipe, uint32_t fEvents, PRTHCINTPTR phNative)
 {
     RTPIPEINTERNAL *pThis = hPipe;
diff --git a/src/VBox/Runtime/r3/posix/pipe-posix.cpp b/src/VBox/Runtime/r3/posix/pipe-posix.cpp
index f266422..494a735 100644
--- a/src/VBox/Runtime/r3/posix/pipe-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/pipe-posix.cpp
@@ -671,6 +671,51 @@ RTDECL(int) RTPipeQueryReadable(RTPIPE hPipe, size_t *pcbReadable)
 }
 
 
+RTDECL(int) RTPipeQueryInfo(RTPIPE hPipe, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    RTPIPEINTERNAL *pThis = hPipe;
+    AssertPtrReturn(pThis, 0);
+    AssertReturn(pThis->u32Magic == RTPIPE_MAGIC, 0);
+
+    rtPipeFakeQueryInfo(pObjInfo, enmAddAttr, pThis->fRead);
+
+    if (pThis->fRead)
+    {
+        int cb = 0;
+        int rc = ioctl(pThis->fd, FIONREAD, &cb);
+        if (rc >= 0)
+            pObjInfo->cbObject = cb;
+    }
+#ifdef FIONSPACE
+    else
+    {
+        int cb = 0;
+        int rc = ioctl(pThis->fd, FIONSPACE, &cb);
+        if (rc >= 0)
+            pObjInfo->cbObject = cb;
+    }
+#endif
+
+    /** @todo Check this out on linux, solaris and darwin... (Currently going by a
+     *        FreeBSD manpage.) */
+    struct stat St;
+    if (fstat(pThis->fd, &St))
+    {
+        pObjInfo->cbAllocated = St.st_blksize;
+        if (   enmAddAttr == RTFSOBJATTRADD_NOTHING
+            || enmAddAttr == RTFSOBJATTRADD_UNIX)
+        {
+            pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_UNIX;
+            pObjInfo->Attr.u.Unix.INodeId       = St.st_ino;
+            pObjInfo->Attr.u.Unix.INodeIdDevice = St.st_dev;
+        }
+    }
+    /** @todo error handling?  */
+
+    return VINF_SUCCESS;
+}
+
+
 int rtPipePollGetHandle(RTPIPE hPipe, uint32_t fEvents, PRTHCINTPTR phNative)
 {
     RTPIPEINTERNAL *pThis = hPipe;
diff --git a/src/VBox/Runtime/r3/posix/process-creation-posix.cpp b/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
index bbf75d9..8aea1ed 100644
--- a/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
@@ -40,9 +40,9 @@
 #include <fcntl.h>
 #include <signal.h>
 #include <grp.h>
+#include <pwd.h>
 #if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS)
 # include <crypt.h>
-# include <pwd.h>
 # include <shadow.h>
 #endif
 
@@ -71,6 +71,15 @@
 # include <libcontract.h>
 #endif
 
+#ifndef RT_OS_SOLARIS
+# include <paths.h>
+#else
+# define _PATH_MAILDIR "/var/mail"
+# define _PATH_DEFPATH "/usr/bin:/bin"
+# define _PATH_STDPATH "/sbin:/usr/sbin:/bin:/usr/bin"
+#endif
+
+
 #include <iprt/process.h>
 #include "internal/iprt.h"
 
@@ -102,7 +111,7 @@ static int rtCheckCredentials(const char *pszUser, const char *pszPasswd, gid_t
 
     pw = getpwnam(pszUser);
     if (!pw)
-        return VERR_PERMISSION_DENIED;
+        return VERR_AUTHENTICATION_FAILURE;
 
     if (!pszPasswd)
         pszPasswd = "";
@@ -126,7 +135,7 @@ static int rtCheckCredentials(const char *pszUser, const char *pszPasswd, gid_t
         RTMemTmpFree(data);
     }
     if (!fCorrect)
-        return VERR_PERMISSION_DENIED;
+        return VERR_AUTHENTICATION_FAILURE;
 
     *pGid = pw->pw_gid;
     *pUid = pw->pw_uid;
@@ -137,7 +146,7 @@ static int rtCheckCredentials(const char *pszUser, const char *pszPasswd, gid_t
     char szBuf[1024];
 
     if (getpwnam_r(pszUser, &pw, szBuf, sizeof(szBuf), &ppw) != 0 || ppw == NULL)
-        return VERR_PERMISSION_DENIED;
+        return VERR_AUTHENTICATION_FAILURE;
 
     if (!pszPasswd)
         pszPasswd = "";
@@ -150,7 +159,7 @@ static int rtCheckCredentials(const char *pszUser, const char *pszPasswd, gid_t
 
     char *pszEncPasswd = crypt(pszPasswd, ppw->pw_passwd);
     if (strcmp(pszEncPasswd, ppw->pw_passwd))
-        return VERR_PERMISSION_DENIED;
+        return VERR_AUTHENTICATION_FAILURE;
 
     *pGid = ppw->pw_gid;
     *pUid = ppw->pw_uid;
@@ -158,7 +167,7 @@ static int rtCheckCredentials(const char *pszUser, const char *pszPasswd, gid_t
 
 #else
     NOREF(pszUser); NOREF(pszPasswd); NOREF(pGid); NOREF(pUid);
-    return VERR_PERMISSION_DENIED;
+    return VERR_AUTHENTICATION_FAILURE;
 #endif
 }
 
@@ -274,6 +283,138 @@ RTR3DECL(int)   RTProcCreate(const char *pszExec, const char * const *papszArgs,
 
 
 /**
+ * Adjust the profile environment after forking the child process and changing
+ * the UID.
+ *
+ * @returns IRPT status code.
+ * @param   hEnvToUse       The environment we're going to use with execve.
+ * @param   fFlags          The process creation flags.
+ * @param   hEnv            The environment passed in by the user.
+ */
+static int rtProcPosixAdjustProfileEnvFromChild(RTENV hEnvToUse, uint32_t fFlags, RTENV hEnv)
+{
+    int rc = VINF_SUCCESS;
+#ifdef RT_OS_DARWIN
+    if (   RT_SUCCESS(rc)
+        && (!(fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD) || RTEnvExistEx(hEnv, "TMPDIR")) )
+    {
+        char szValue[_4K];
+        size_t cbNeeded = confstr(_CS_DARWIN_USER_TEMP_DIR, szValue, sizeof(szValue));
+        if (cbNeeded > 0 && cbNeeded < sizeof(szValue))
+        {
+            char *pszTmp;
+            rc = RTStrCurrentCPToUtf8(&pszTmp, szValue);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTEnvSetEx(hEnvToUse, "TMPDIR", pszTmp);
+                RTStrFree(pszTmp);
+            }
+        }
+        else
+            rc = VERR_BUFFER_OVERFLOW;
+    }
+#endif
+    return rc;
+}
+
+
+/**
+ * Create a very very basic environment for a user.
+ *
+ * @returns IPRT status code.
+ * @param   phEnvToUse  Where to return the created environment.
+ * @param   pszUser     The user name for the profile.
+ */
+static int rtProcPosixCreateProfileEnv(PRTENV phEnvToUse, const char *pszUser)
+{
+    struct passwd   Pwd;
+    struct passwd  *pPwd = NULL;
+    char            achBuf[_4K];
+    int             rc;
+    errno = 0;
+    if (pszUser)
+        rc = getpwnam_r(pszUser, &Pwd, achBuf, sizeof(achBuf), &pPwd);
+    else
+        rc = getpwuid_r(getuid(), &Pwd, achBuf, sizeof(achBuf), &pPwd);
+    if (rc == 0 && pPwd)
+    {
+        char *pszDir;
+        rc = RTStrCurrentCPToUtf8(&pszDir, pPwd->pw_dir);
+        if (RT_SUCCESS(rc))
+        {
+            char *pszShell;
+            rc = RTStrCurrentCPToUtf8(&pszShell, pPwd->pw_shell);
+            if (RT_SUCCESS(rc))
+            {
+                char *pszUserFree = NULL;
+                if (!pszUser)
+                {
+                    rc = RTStrCurrentCPToUtf8(&pszUserFree, pPwd->pw_name);
+                    if (RT_SUCCESS(rc))
+                        pszUser = pszUserFree;
+                }
+                if (RT_SUCCESS(rc))
+                {
+                    rc = RTEnvCreate(phEnvToUse);
+                    if (RT_SUCCESS(rc))
+                    {
+                        RTENV hEnvToUse = *phEnvToUse;
+
+                        rc = RTEnvSetEx(hEnvToUse, "HOME", pszDir);
+                        if (RT_SUCCESS(rc))
+                            rc = RTEnvSetEx(hEnvToUse, "SHELL", pszShell);
+                        if (RT_SUCCESS(rc))
+                            rc = RTEnvSetEx(hEnvToUse, "USER", pszUser);
+                        if (RT_SUCCESS(rc))
+                            rc = RTEnvSetEx(hEnvToUse, "LOGNAME", pszUser);
+
+                        if (RT_SUCCESS(rc))
+                            rc = RTEnvSetEx(hEnvToUse, "PATH", pPwd->pw_uid == 0 ? _PATH_STDPATH : _PATH_DEFPATH);
+
+                        if (RT_SUCCESS(rc))
+                        {
+                            RTStrPrintf(achBuf, sizeof(achBuf), "%s/%s", _PATH_MAILDIR, pszUser);
+                            rc = RTEnvSetEx(hEnvToUse, "MAIL", achBuf);
+                        }
+
+#ifdef RT_OS_DARWIN
+                        if (RT_SUCCESS(rc) && !pszUserFree)
+                        {
+                            size_t cbNeeded = confstr(_CS_DARWIN_USER_TEMP_DIR, achBuf, sizeof(achBuf));
+                            if (cbNeeded > 0 && cbNeeded < sizeof(achBuf))
+                            {
+                                char *pszTmp;
+                                rc = RTStrCurrentCPToUtf8(&pszTmp, achBuf);
+                                if (RT_SUCCESS(rc))
+                                {
+                                    rc = RTEnvSetEx(hEnvToUse, "TMPDIR", pszTmp);
+                                    RTStrFree(pszTmp);
+                                }
+                            }
+                            else
+                                rc = VERR_BUFFER_OVERFLOW;
+                        }
+#endif
+
+                        /** @todo load /etc/environment, /etc/profile.env and ~/.pam_environment? */
+
+                        if (RT_FAILURE(rc))
+                            RTEnvDestroy(hEnvToUse);
+                    }
+                    RTStrFree(pszUserFree);
+                }
+                RTStrFree(pszShell);
+            }
+            RTStrFree(pszDir);
+        }
+    }
+    else
+        rc = errno ? RTErrConvertFromErrno(errno) : VERR_ACCESS_DENIED;
+    return rc;
+}
+
+
+/**
  * RTPathTraverseList callback used by RTProcCreateEx to locate the executable.
  */
 static DECLCALLBACK(int) rtPathFindExec(char const *pchPath, size_t cchPath, void *pvUser1, void *pvUser2)
@@ -291,6 +432,16 @@ static DECLCALLBACK(int) rtPathFindExec(char const *pchPath, size_t cchPath, voi
     return VERR_TRY_AGAIN;
 }
 
+/**
+ * Cleans up the environment on the way out.
+ */
+static int rtProcPosixCreateReturn(int rc, RTENV hEnvToUse, RTENV hEnv)
+{
+    if (hEnvToUse != hEnv)
+        RTEnvDestroy(hEnvToUse);
+    return rc;
+}
+
 
 RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArgs, RTENV hEnv, uint32_t fFlags,
                                PCRTHANDLE phStdIn, PCRTHANDLE phStdOut, PCRTHANDLE phStdErr, const char *pszAsUser,
@@ -306,10 +457,7 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
     AssertReturn(!(fFlags & ~RTPROC_FLAGS_VALID_MASK), VERR_INVALID_PARAMETER);
     AssertReturn(!(fFlags & RTPROC_FLAGS_DETACHED) || !phProcess, VERR_INVALID_PARAMETER);
     AssertReturn(hEnv != NIL_RTENV, VERR_INVALID_PARAMETER);
-    const char * const *papszEnv = RTEnvGetExecEnvP(hEnv);
-    AssertPtrReturn(papszEnv, VERR_INVALID_HANDLE);
     AssertPtrReturn(papszArgs, VERR_INVALID_PARAMETER);
-    /** @todo search the PATH (add flag for this). */
     AssertPtrNullReturn(pszAsUser, VERR_INVALID_POINTER);
     AssertReturn(!pszAsUser || *pszAsUser, VERR_INVALID_PARAMETER);
     AssertReturn(!pszPassword || pszAsUser, VERR_INVALID_PARAMETER);
@@ -378,26 +526,60 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
     }
 
     /*
+     * Create the child environment if either RTPROC_FLAGS_PROFILE or
+     * RTPROC_FLAGS_ENV_CHANGE_RECORD are in effect.
+     */
+    RTENV hEnvToUse = hEnv;
+    if (   (fFlags & (RTPROC_FLAGS_ENV_CHANGE_RECORD | RTPROC_FLAGS_PROFILE))
+        && (   (fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD)
+            || hEnv == RTENV_DEFAULT) )
+    {
+        if (fFlags & RTPROC_FLAGS_PROFILE)
+            rc = rtProcPosixCreateProfileEnv(&hEnvToUse, pszAsUser);
+        else
+            rc = RTEnvClone(&hEnvToUse, RTENV_DEFAULT);
+        if (RT_SUCCESS(rc))
+        {
+            if ((fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD) && hEnv != RTENV_DEFAULT)
+                rc = RTEnvApplyChanges(hEnvToUse, hEnv);
+            if (RT_FAILURE(rc))
+                RTEnvDestroy(hEnvToUse);
+        }
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    /*
      * Check for execute access to the file.
      */
     char szRealExec[RTPATH_MAX];
     if (access(pszExec, X_OK))
     {
+        rc = errno;
         if (   !(fFlags & RTPROC_FLAGS_SEARCH_PATH)
-            || errno != ENOENT
+            || rc != ENOENT
             || RTPathHavePath(pszExec) )
-            return RTErrConvertFromErrno(errno);
+            rc = RTErrConvertFromErrno(rc);
+        else
+        {
+            /* search */
+            char *pszPath = RTEnvDupEx(hEnvToUse, "PATH");
+            rc = RTPathTraverseList(pszPath, ':', rtPathFindExec, (void *)pszExec, &szRealExec[0]);
+            RTStrFree(pszPath);
+            if (RT_SUCCESS(rc))
+                pszExec = szRealExec;
+            else
+                rc = rc == VERR_END_OF_STRING ? VERR_FILE_NOT_FOUND : rc;
+        }
 
-        /* search */
-        char *pszPath = RTEnvDupEx(hEnv, "PATH");
-        rc = RTPathTraverseList(pszPath, ':', rtPathFindExec, (void *)pszExec, &szRealExec[0]);
-        RTStrFree(pszPath);
         if (RT_FAILURE(rc))
-            return rc == VERR_END_OF_STRING ? VERR_FILE_NOT_FOUND : rc;
-        pszExec = szRealExec;
+            return rtProcPosixCreateReturn(rc, hEnvToUse, hEnv);
     }
 
     pid_t pid = -1;
+    const char * const *papszEnv = RTEnvGetExecEnvP(hEnvToUse);
+    AssertPtrReturn(papszEnv, rtProcPosixCreateReturn(VERR_INVALID_HANDLE, hEnvToUse, hEnv));
+
 
     /*
      * Take care of detaching the process.
@@ -417,7 +599,7 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
         {
             templateFd = rtSolarisContractPreFork();
             if (templateFd == -1)
-                return VERR_OPEN_FAILED;
+                return rtProcPosixCreateReturn(VERR_OPEN_FAILED, hEnvToUse, hEnv);
         }
 # endif /* RT_OS_SOLARIS */
         pid = fork();
@@ -426,7 +608,7 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
 # ifdef RT_OS_SOLARIS
             if (!(fFlags & RTPROC_FLAGS_SAME_CONTRACT))
                 rtSolarisContractPostForkChild(templateFd);
-# endif /* RT_OS_SOLARIS */
+# endif
             setsid(); /* see comment above */
 
             pid = -1;
@@ -434,10 +616,10 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
         }
         else
         {
-#ifdef RT_OS_SOLARIS
+# ifdef RT_OS_SOLARIS
             if (!(fFlags & RTPROC_FLAGS_SAME_CONTRACT))
                 rtSolarisContractPostForkParent(templateFd, pid);
-#endif /* RT_OS_SOLARIS */
+# endif
             if (pid > 0)
             {
                 /* Must wait for the temporary process to avoid a zombie. */
@@ -453,12 +635,12 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
 
                 /* Assume that something wasn't found. No detailed info. */
                 if (status)
-                    return VERR_PROCESS_NOT_FOUND;
+                    return rtProcPosixCreateReturn(VERR_PROCESS_NOT_FOUND, hEnvToUse, hEnv);
                 if (phProcess)
                     *phProcess = 0;
-                return VINF_SUCCESS;
+                return rtProcPosixCreateReturn(VINF_SUCCESS, hEnvToUse, hEnv);
             }
-            return RTErrConvertFromErrno(errno);
+            return rtProcPosixCreateReturn(RTErrConvertFromErrno(errno), hEnvToUse, hEnv);
         }
     }
 #endif
@@ -559,7 +741,7 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
                     _Exit(0);
                 if (phProcess)
                     *phProcess = pid;
-                return VINF_SUCCESS;
+                return rtProcPosixCreateReturn(VINF_SUCCESS, hEnvToUse, hEnv);
             }
         }
         /* For a detached process this happens in the temp process, so
@@ -576,7 +758,7 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
         {
             templateFd = rtSolarisContractPreFork();
             if (templateFd == -1)
-                return VERR_OPEN_FAILED;
+                return rtProcPosixCreateReturn(VERR_OPEN_FAILED, hEnvToUse, hEnv);
         }
 #endif /* RT_OS_SOLARIS */
         pid = fork();
@@ -628,6 +810,25 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
 #endif
 
             /*
+             * Some final profile environment tweaks, if running as user.
+             */
+            if (   (fFlags & RTPROC_FLAGS_PROFILE)
+                && pszAsUser
+                && (   (fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD)
+                    || hEnv == RTENV_DEFAULT) )
+            {
+                rc = rtProcPosixAdjustProfileEnvFromChild(hEnvToUse, fFlags, hEnv);
+                papszEnv = RTEnvGetExecEnvP(hEnvToUse);
+                if (RT_FAILURE(rc) || !papszEnv)
+                {
+                    if (fFlags & RTPROC_FLAGS_DETACHED)
+                        _Exit(126);
+                    else
+                        exit(126);
+                }
+            }
+
+            /*
              * Unset the signal mask.
              */
             sigset_t SigMask;
@@ -693,16 +894,16 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
                 _Exit(0);
             if (phProcess)
                 *phProcess = pid;
-            return VINF_SUCCESS;
+            return rtProcPosixCreateReturn(VINF_SUCCESS, hEnvToUse, hEnv);
         }
         /* For a detached process this happens in the temp process, so
          * it's not worth doing anything as this process must exit. */
         if (fFlags & RTPROC_FLAGS_DETACHED)
             _Exit(124);
-        return RTErrConvertFromErrno(errno);
+        return rtProcPosixCreateReturn(RTErrConvertFromErrno(errno), hEnvToUse, hEnv);
     }
 
-    return VERR_NOT_IMPLEMENTED;
+    return rtProcPosixCreateReturn(VERR_NOT_IMPLEMENTED, hEnvToUse, hEnv);
 }
 
 
diff --git a/src/VBox/Runtime/r3/posix/process-posix.cpp b/src/VBox/Runtime/r3/posix/process-posix.cpp
index 0eefa6a..3129958 100644
--- a/src/VBox/Runtime/r3/posix/process-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/process-posix.cpp
@@ -158,45 +158,112 @@ RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent)
 }
 
 
-RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser,
-                                  size_t *pcbUser)
+RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser, size_t *pcbUser)
 {
     AssertReturn(   (pszUser && cbUser > 0)
                  || (!pszUser && !cbUser), VERR_INVALID_PARAMETER);
+    AssertReturn(pcbUser || pszUser, VERR_INVALID_PARAMETER);
 
-    if (hProcess != RTProcSelf())
-        return VERR_NOT_SUPPORTED;
+    int rc;
+    if (   hProcess == NIL_RTPROCESS
+        || hProcess == RTProcSelf())
+    {
+        /*
+         * Figure a good buffer estimate.
+         */
+        int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX);
+        if (cbPwdMax <= _1K)
+            cbPwdMax = _1K;
+        else
+            AssertStmt(cbPwdMax <= 32*_1M, cbPwdMax = 32*_1M);
+        char *pchBuf = (char *)RTMemTmpAllocZ(cbPwdMax);
+        if (pchBuf)
+        {
+            /*
+             * Get the password file entry.
+             */
+            struct passwd  Pwd;
+            struct passwd *pPwd = NULL;
+            rc = getpwuid_r(geteuid(), &Pwd, pchBuf, cbPwdMax, &pPwd);
+            if (!rc)
+            {
+                /*
+                 * Convert the name to UTF-8, assuming that we're getting it in the local codeset.
+                 */
+                /** @todo This isn't exactly optimal... the current codeset/page conversion
+                 *        stuff never was.  Should optimize that for UTF-8 and ASCII one day.
+                 *        And also optimize for avoiding heap. */
+                char *pszTmp = NULL;
+                rc = RTStrCurrentCPToUtf8(&pszTmp, pPwd->pw_name);
+                if (RT_SUCCESS(rc))
+                {
+                    size_t cbTmp = strlen(pszTmp) + 1;
+                    if (pcbUser)
+                        *pcbUser = cbTmp;
+                    if (cbTmp <= cbUser)
+                    {
+                        memcpy(pszUser, pszTmp, cbTmp);
+                        rc = VINF_SUCCESS;
+                    }
+                    else
+                        rc = VERR_BUFFER_OVERFLOW;
+                    RTStrFree(pszTmp);
+                }
+            }
+            else
+                rc = RTErrConvertFromErrno(rc);
+            RTMemFree(pchBuf);
+        }
+        else
+            rc = VERR_NO_TMP_MEMORY;
+    }
+    else
+        rc = VERR_NOT_SUPPORTED;
+    return rc;
+}
 
-    int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX);
-    if (cbPwdMax == -1)
-        return RTErrConvertFromErrno(errno);
 
-    char *pbBuf = (char *)RTMemAllocZ(cbPwdMax);
-    if (!pbBuf)
-        return VERR_NO_MEMORY;
+RTR3DECL(int) RTProcQueryUsernameA(RTPROCESS hProcess, char **ppszUser)
+{
+    AssertPtrReturn(ppszUser, VERR_INVALID_POINTER);
 
-    struct passwd Pwd, *pPwd;
-    int rc = getpwuid_r(geteuid(), &Pwd, pbBuf, cbPwdMax, &pPwd);
-    if (!rc)
+    int rc;
+    if (   hProcess == NIL_RTPROCESS
+        || hProcess == RTProcSelf())
     {
-        size_t cbPwdUser = strlen(pPwd->pw_name) + 1;
-
-        if (pcbUser)
-            *pcbUser = cbPwdUser;
-
-        if (cbPwdUser > cbUser)
-            rc = VERR_BUFFER_OVERFLOW;
+        /*
+         * Figure a good buffer estimate.
+         */
+        int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX);
+        if (cbPwdMax <= _1K)
+            cbPwdMax = _1K;
         else
+            AssertStmt(cbPwdMax <= 32*_1M, cbPwdMax = 32*_1M);
+        char *pchBuf = (char *)RTMemTmpAllocZ(cbPwdMax);
+        if (pchBuf)
         {
-/** @todo this needs to be UTF-8 checked or converted...   */
-            memcpy(pszUser, pPwd->pw_name, cbPwdUser);
-            rc = VINF_SUCCESS;
+            /*
+             * Get the password file entry.
+             */
+            struct passwd  Pwd;
+            struct passwd *pPwd = NULL;
+            rc = getpwuid_r(geteuid(), &Pwd, pchBuf, cbPwdMax, &pPwd);
+            if (!rc)
+            {
+                /*
+                 * Convert the name to UTF-8, assuming that we're getting it in the local codeset.
+                 */
+                rc = RTStrCurrentCPToUtf8(ppszUser, pPwd->pw_name);
+            }
+            else
+                rc = RTErrConvertFromErrno(rc);
+            RTMemFree(pchBuf);
         }
+        else
+            rc = VERR_NO_TMP_MEMORY;
     }
     else
-        rc = RTErrConvertFromErrno(rc);
-
-    RTMemFree(pbBuf);
+        rc = VERR_NOT_SUPPORTED;
     return rc;
 }
 
diff --git a/src/VBox/Runtime/r3/win/RTSystemQueryTotalRam-win.cpp b/src/VBox/Runtime/r3/win/RTSystemQueryTotalRam-win.cpp
index 3449d19..e97f9a8 100644
--- a/src/VBox/Runtime/r3/win/RTSystemQueryTotalRam-win.cpp
+++ b/src/VBox/Runtime/r3/win/RTSystemQueryTotalRam-win.cpp
@@ -36,32 +36,86 @@
 #include <iprt/assert.h>
 #include <iprt/string.h>
 
+#include "internal-r3-win.h"
 
-RTDECL(int) RTSystemQueryTotalRam(uint64_t *pcb)
+
+/*********************************************************************************************************************************
+*   Global Variables                                                                                                             *
+*********************************************************************************************************************************/
+static bool volatile            g_fInitialized = false;
+typedef BOOL (WINAPI *PFNGLOBALMEMORYSTATUSEX)(LPMEMORYSTATUSEX);
+static PFNGLOBALMEMORYSTATUSEX  g_pfnGlobalMemoryStatusEx = NULL;
+
+
+/**
+ * The GlobalMemoryStatusEx API is not available on older Windows version.
+ *
+ * @returns Pointer to GlobalMemoryStatusEx or NULL if not available.
+ */
+DECLINLINE(PFNGLOBALMEMORYSTATUSEX) rtSystemWinGetExApi(void)
 {
-    MEMORYSTATUSEX MemStatus;
+    PFNGLOBALMEMORYSTATUSEX pfnEx;
+    if (g_fInitialized)
+        pfnEx = g_pfnGlobalMemoryStatusEx;
+    else
+    {
+        pfnEx = (PFNGLOBALMEMORYSTATUSEX)GetProcAddress(g_hModKernel32, "GlobalMemoryStatusEx");
+        g_pfnGlobalMemoryStatusEx = pfnEx;
+        g_fInitialized = true;
+    }
+    return pfnEx;
+}
 
-    AssertPtrReturn(pcb, VERR_INVALID_POINTER);
 
-    MemStatus.dwLength = sizeof(MemStatus);
-    if (!GlobalMemoryStatusEx(&MemStatus))
-        return RTErrConvertFromWin32(GetLastError());
+RTDECL(int) RTSystemQueryTotalRam(uint64_t *pcb)
+{
+    AssertPtrReturn(pcb, VERR_INVALID_POINTER);
 
-    *pcb = MemStatus.ullTotalPhys;
-    return VINF_SUCCESS;
+    int rc = VINF_SUCCESS;
+    PFNGLOBALMEMORYSTATUSEX pfnGlobalMemoryStatusEx = rtSystemWinGetExApi();
+    if (pfnGlobalMemoryStatusEx)
+    {
+        MEMORYSTATUSEX MemStatus;
+        MemStatus.dwLength = sizeof(MemStatus);
+        if (pfnGlobalMemoryStatusEx(&MemStatus))
+            *pcb = MemStatus.ullTotalPhys;
+        else
+            rc = RTErrConvertFromWin32(GetLastError());
+    }
+    else
+    {
+        MEMORYSTATUS MemStatus;
+        RT_ZERO(MemStatus);
+        MemStatus.dwLength = sizeof(MemStatus);
+        GlobalMemoryStatus(&MemStatus);
+        *pcb = MemStatus.dwTotalPhys;
+    }
+    return rc;
 }
 
 
 RTDECL(int) RTSystemQueryAvailableRam(uint64_t *pcb)
 {
-    MEMORYSTATUSEX MemStatus;
-
     AssertPtrReturn(pcb, VERR_INVALID_POINTER);
 
-    MemStatus.dwLength = sizeof(MemStatus);
-    if (!GlobalMemoryStatusEx(&MemStatus))
-        return RTErrConvertFromWin32(GetLastError());
-
-    *pcb = MemStatus.ullAvailPhys;
-    return VINF_SUCCESS;
+    int rc = VINF_SUCCESS;
+    PFNGLOBALMEMORYSTATUSEX pfnGlobalMemoryStatusEx = rtSystemWinGetExApi();
+    if (pfnGlobalMemoryStatusEx)
+    {
+        MEMORYSTATUSEX MemStatus;
+        MemStatus.dwLength = sizeof(MemStatus);
+        if (pfnGlobalMemoryStatusEx(&MemStatus))
+            *pcb = MemStatus.ullAvailPhys;
+        else
+            rc = RTErrConvertFromWin32(GetLastError());
+    }
+    else
+    {
+        MEMORYSTATUS MemStatus;
+        RT_ZERO(MemStatus);
+        MemStatus.dwLength = sizeof(MemStatus);
+        GlobalMemoryStatus(&MemStatus);
+        *pcb = MemStatus.dwAvailPhys;
+    }
+    return rc;
 }
diff --git a/src/VBox/Runtime/r3/win/VBoxRT-msvcp100-win32.def b/src/VBox/Runtime/r3/win/VBoxRT-msvcp100-win32.def
new file mode 100644
index 0000000..5395dc5
--- /dev/null
+++ b/src/VBox/Runtime/r3/win/VBoxRT-msvcp100-win32.def
@@ -0,0 +1,1678 @@
+
+  ??0?$_Yarn at D@std@@QAE at ABV01@@Z
+  ??0?$_Yarn at D@std@@QAE at PBD@Z
+  ??0?$_Yarn at D@std@@QAE at XZ
+  ??0?$basic_ios at DU?$char_traits at D@std@@@std@@IAE at XZ
+  ??0?$basic_ios at DU?$char_traits at D@std@@@std@@QAE at PAV?$basic_streambuf at DU?$char_traits at D@std@@@1@@Z
+  ??0?$basic_ios at GU?$char_traits at G@std@@@std@@IAE at XZ
+  ??0?$basic_ios at GU?$char_traits at G@std@@@std@@QAE at PAV?$basic_streambuf at GU?$char_traits at G@std@@@1@@Z
+  ??0?$basic_ios at _WU?$char_traits at _W@std@@@std@@IAE at XZ
+  ??0?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAE at PAV?$basic_streambuf at _WU?$char_traits at _W@std@@@1@@Z
+  ??0?$basic_iostream at DU?$char_traits at D@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_iostream at DU?$char_traits at D@std@@@std@@QAE at PAV?$basic_streambuf at DU?$char_traits at D@std@@@1@@Z
+  ??0?$basic_iostream at GU?$char_traits at G@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_iostream at GU?$char_traits at G@std@@@std@@QAE at PAV?$basic_streambuf at GU?$char_traits at G@std@@@1@@Z
+  ??0?$basic_iostream at _WU?$char_traits at _W@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_iostream at _WU?$char_traits at _W@std@@@std@@QAE at PAV?$basic_streambuf at _WU?$char_traits at _W@std@@@1@@Z
+  ??0?$basic_istream at DU?$char_traits at D@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_istream at DU?$char_traits at D@std@@@std@@QAE at PAV?$basic_streambuf at DU?$char_traits at D@std@@@1 at _N1@Z
+  ??0?$basic_istream at DU?$char_traits at D@std@@@std@@QAE at PAV?$basic_streambuf at DU?$char_traits at D@std@@@1 at _N@Z
+  ??0?$basic_istream at DU?$char_traits at D@std@@@std@@QAE at W4_Uninitialized@1@@Z
+  ??0?$basic_istream at GU?$char_traits at G@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_istream at GU?$char_traits at G@std@@@std@@QAE at PAV?$basic_streambuf at GU?$char_traits at G@std@@@1 at _N1@Z
+  ??0?$basic_istream at GU?$char_traits at G@std@@@std@@QAE at PAV?$basic_streambuf at GU?$char_traits at G@std@@@1 at _N@Z
+  ??0?$basic_istream at GU?$char_traits at G@std@@@std@@QAE at W4_Uninitialized@1@@Z
+  ??0?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE at PAV?$basic_streambuf at _WU?$char_traits at _W@std@@@1 at _N1@Z
+  ??0?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE at PAV?$basic_streambuf at _WU?$char_traits at _W@std@@@1 at _N@Z
+  ??0?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE at W4_Uninitialized@1@@Z
+  ??0?$basic_ostream at DU?$char_traits at D@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_ostream at DU?$char_traits at D@std@@@std@@QAE at PAV?$basic_streambuf at DU?$char_traits at D@std@@@1 at _N@Z
+  ??0?$basic_ostream at DU?$char_traits at D@std@@@std@@QAE at W4_Uninitialized@1 at _N@Z
+  ??0?$basic_ostream at GU?$char_traits at G@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_ostream at GU?$char_traits at G@std@@@std@@QAE at PAV?$basic_streambuf at GU?$char_traits at G@std@@@1 at _N@Z
+  ??0?$basic_ostream at GU?$char_traits at G@std@@@std@@QAE at W4_Uninitialized@1 at _N@Z
+  ??0?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAE@$$QAV01@@Z
+  ??0?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAE at PAV?$basic_streambuf at _WU?$char_traits at _W@std@@@1 at _N@Z
+  ??0?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAE at W4_Uninitialized@1 at _N@Z
+  ??0?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAE at ABV01@@Z
+  ??0?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAE at W4_Uninitialized@1@@Z
+  ??0?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAE at XZ
+  ??0?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAE at ABV01@@Z
+  ??0?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAE at W4_Uninitialized@1@@Z
+  ??0?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAE at XZ
+  ??0?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAE at ABV01@@Z
+  ??0?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAE at W4_Uninitialized@1@@Z
+  ??0?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAE at XZ
+  ??0?$codecvt at DDH@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$codecvt at DDH@std@@QAE at I@Z
+  ??0?$codecvt at GDH@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$codecvt at GDH@std@@QAE at I@Z
+  ??0?$codecvt at _WDH@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$codecvt at _WDH@std@@QAE at I@Z
+  ??0?$ctype at D@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$ctype at D@std@@QAE at PBF_NI@Z
+  ??0?$ctype at G@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$ctype at G@std@@QAE at I@Z
+  ??0?$ctype at _W@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$ctype at _W@std@@QAE at I@Z
+  ??0?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at I@Z
+  ??0?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at I@Z
+  ??0?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at I@Z
+  ??0?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at I@Z
+  ??0?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at I@Z
+  ??0?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at I@Z
+  ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IAE at PBDI@Z
+  ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at I@Z
+  ??0?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@IAE at PBDI@Z
+  ??0?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at I@Z
+  ??0?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@IAE at PBDI@Z
+  ??0?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at I@Z
+  ??0?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at I@Z
+  ??0?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@IAE at PBDI@Z
+  ??0?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAE at I@Z
+  ??0?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@IAE at PBDI@Z
+  ??0?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z
+  ??0?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAE at I@Z
+  ??0Init at ios_base@std@@QAE at XZ
+  ??0_Concurrent_queue_base_v4 at details@Concurrency@@IAE at I@Z
+  ??0_Concurrent_queue_iterator_base_v4 at details@Concurrency@@IAE at ABV_Concurrent_queue_base_v4@12@@Z
+  ??0_Container_base12 at std@@QAE at ABU01@@Z
+  ??0_Container_base12 at std@@QAE at XZ
+  ??0_Init_locks at std@@QAE at XZ
+  ??0_Locimp at locale@std@@AAE at ABV012@@Z
+  ??0_Locimp at locale@std@@AAE at _N@Z
+  ??0_Locinfo at std@@QAE at HPBD@Z
+  ??0_Locinfo at std@@QAE at PBD@Z
+  ??0_Lockit at std@@QAE at H@Z
+  ??0_Lockit at std@@QAE at XZ
+  ??0_Mutex at std@@QAE at W4_Uninitialized@1@@Z
+  ??0_Mutex at std@@QAE at XZ
+  ??0_Runtime_object at details@Concurrency@@QAE at H@Z
+  ??0_Runtime_object at details@Concurrency@@QAE at XZ
+  ??0_Timevec at std@@QAE at ABV01@@Z
+  ??0_Timevec at std@@QAE at PAX@Z
+  ??0_UShinit at std@@QAE at XZ
+  ??0_Winit at std@@QAE at XZ
+  ??0agent at Concurrency@@QAE at AAVScheduleGroup@1@@Z
+  ??0agent at Concurrency@@QAE at AAVScheduler@1@@Z
+  ??0agent at Concurrency@@QAE at XZ
+  ??0codecvt_base at std@@QAE at I@Z
+  ??0ctype_base at std@@QAE at I@Z
+  ??0facet at locale@std@@IAE at I@Z
+  ??0id at locale@std@@QAE at I@Z
+  ??0ios_base at std@@IAE at XZ
+  ??0ios_base at std@@QAE at ABV01@@Z
+  ??0time_base at std@@QAE at I@Z
+  ??1?$_Yarn at D@std@@QAE at XZ
+  ??1?$basic_ios at DU?$char_traits at D@std@@@std@@UAE at XZ
+  ??1?$basic_ios at GU?$char_traits at G@std@@@std@@UAE at XZ
+  ??1?$basic_ios at _WU?$char_traits at _W@std@@@std@@UAE at XZ
+  ??1?$basic_iostream at DU?$char_traits at D@std@@@std@@UAE at XZ
+  ??1?$basic_iostream at GU?$char_traits at G@std@@@std@@UAE at XZ
+  ??1?$basic_iostream at _WU?$char_traits at _W@std@@@std@@UAE at XZ
+  ??1?$basic_istream at DU?$char_traits at D@std@@@std@@UAE at XZ
+  ??1?$basic_istream at GU?$char_traits at G@std@@@std@@UAE at XZ
+  ??1?$basic_istream at _WU?$char_traits at _W@std@@@std@@UAE at XZ
+  ??1?$basic_ostream at DU?$char_traits at D@std@@@std@@UAE at XZ
+  ??1?$basic_ostream at GU?$char_traits at G@std@@@std@@UAE at XZ
+  ??1?$basic_ostream at _WU?$char_traits at _W@std@@@std@@UAE at XZ
+  ??1?$basic_streambuf at DU?$char_traits at D@std@@@std@@UAE at XZ
+  ??1?$basic_streambuf at GU?$char_traits at G@std@@@std@@UAE at XZ
+  ??1?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@UAE at XZ
+  ??1?$codecvt at DDH@std@@MAE at XZ
+  ??1?$codecvt at GDH@std@@MAE at XZ
+  ??1?$codecvt at _WDH@std@@MAE at XZ
+  ??1?$ctype at D@std@@MAE at XZ
+  ??1?$ctype at G@std@@MAE at XZ
+  ??1?$ctype at _W@std@@MAE at XZ
+  ??1?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MAE at XZ
+  ??1?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MAE at XZ
+  ??1?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MAE at XZ
+  ??1?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MAE at XZ
+  ??1?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MAE at XZ
+  ??1?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MAE at XZ
+  ??1?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MAE at XZ
+  ??1?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MAE at XZ
+  ??1?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MAE at XZ
+  ??1?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MAE at XZ
+  ??1?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MAE at XZ
+  ??1?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MAE at XZ
+  ??1Init at ios_base@std@@QAE at XZ
+  ??1_Concurrent_queue_base_v4 at details@Concurrency@@MAE at XZ
+  ??1_Concurrent_queue_iterator_base_v4 at details@Concurrency@@IAE at XZ
+  ??1_Concurrent_vector_base_v4 at details@Concurrency@@IAE at XZ
+  ??1_Container_base12 at std@@QAE at XZ
+  ??1_Init_locks at std@@QAE at XZ
+  ??1_Locimp at locale@std@@MAE at XZ
+  ??1_Locinfo at std@@QAE at XZ
+  ??1_Lockit at std@@QAE at XZ
+  ??1_Mutex at std@@QAE at XZ
+  ??1_Timevec at std@@QAE at XZ
+  ??1_UShinit at std@@QAE at XZ
+  ??1_Winit at std@@QAE at XZ
+  ??1agent at Concurrency@@UAE at XZ
+  ??1codecvt_base at std@@UAE at XZ
+  ??1ctype_base at std@@UAE at XZ
+  ??1facet at locale@std@@UAE at XZ
+  ??1ios_base at std@@UAE at XZ
+  ??1time_base at std@@UAE at XZ
+  ??4?$_Iosb at H@std@@QAEAAV01 at ABV01@@Z
+  ??4?$_Yarn at D@std@@QAEAAV01 at ABV01@@Z
+  ??4?$_Yarn at D@std@@QAEAAV01 at PBD@Z
+  ??4?$basic_iostream at DU?$char_traits at D@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_iostream at GU?$char_traits at G@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_iostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01@$$QAV01@@Z
+  ??4?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEAAV01 at ABV01@@Z
+  ??4?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEAAV01 at ABV01@@Z
+  ??4?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at C@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at D@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at E@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at F@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at G@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at H@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at I@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at J@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at K@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at M@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at N@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at O@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at _J@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at _K@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at _N@std@@QAEAAV01 at ABV01@@Z
+  ??4?$numeric_limits at _W@std@@QAEAAV01 at ABV01@@Z
+  ??4Init at ios_base@std@@QAEAAV012 at ABV012@@Z
+  ??4_Container_base0 at std@@QAEAAU01 at ABU01@@Z
+  ??4_Container_base12 at std@@QAEAAU01 at ABU01@@Z
+  ??4_Init_locks at std@@QAEAAV01 at ABV01@@Z
+  ??4_Num_base at std@@QAEAAU01 at ABU01@@Z
+  ??4_Num_float_base at std@@QAEAAU01 at ABU01@@Z
+  ??4_Num_int_base at std@@QAEAAU01 at ABU01@@Z
+  ??4_Timevec at std@@QAEAAV01 at ABV01@@Z
+  ??4_UShinit at std@@QAEAAV01 at ABV01@@Z
+  ??4_Winit at std@@QAEAAV01 at ABV01@@Z
+  ??4ios_base at std@@QAEAAV01 at ABV01@@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAF@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAG@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAH@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAI@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAJ@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAK@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAM@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAN@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAO@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AAPAX@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AA_J@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AA_K@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at AA_N@Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at P6AAAV01@AAV01@@Z at Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at P6AAAV?$basic_ios at DU?$char_traits at D@std@@@1 at AAV21@@Z at Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at P6AAAVios_base@1 at AAV21@@Z at Z
+  ??5?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV01 at PAV?$basic_streambuf at DU?$char_traits at D@std@@@1@@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAF@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAG@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAH@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAI@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAJ@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAK@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAM@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAN@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAO@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AAPAX@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AA_J@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AA_K@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at AA_N@Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at P6AAAV01@AAV01@@Z at Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at P6AAAV?$basic_ios at GU?$char_traits at G@std@@@1 at AAV21@@Z at Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at P6AAAVios_base@1 at AAV21@@Z at Z
+  ??5?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV01 at PAV?$basic_streambuf at GU?$char_traits at G@std@@@1@@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAF@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAG@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAH@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAI@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAJ@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAK@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAM@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAN@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAO@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AAPAX@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AA_J@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AA_K@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at AA_N@Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at P6AAAV01@AAV01@@Z at Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at P6AAAV?$basic_ios at _WU?$char_traits at _W@std@@@1 at AAV21@@Z at Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at P6AAAVios_base@1 at AAV21@@Z at Z
+  ??5?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at PAV?$basic_streambuf at _WU?$char_traits at _W@std@@@1@@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at F@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at G@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at H@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at I@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at J@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at K@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at M@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at N@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at O@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at P6AAAV01@AAV01@@Z at Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at P6AAAV?$basic_ios at DU?$char_traits at D@std@@@1 at AAV21@@Z at Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at P6AAAVios_base@1 at AAV21@@Z at Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at PAV?$basic_streambuf at DU?$char_traits at D@std@@@1@@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at PBX@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at _J@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at _K@Z
+  ??6?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV01 at _N@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at F@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at G@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at H@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at I@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at J@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at K@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at M@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at N@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at O@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at P6AAAV01@AAV01@@Z at Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at P6AAAV?$basic_ios at GU?$char_traits at G@std@@@1 at AAV21@@Z at Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at P6AAAVios_base@1 at AAV21@@Z at Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at PAV?$basic_streambuf at GU?$char_traits at G@std@@@1@@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at PBX@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at _J@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at _K@Z
+  ??6?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV01 at _N@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at F@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at G@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at H@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at I@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at J@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at K@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at M@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at N@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at O@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at P6AAAV01@AAV01@@Z at Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at P6AAAV?$basic_ios at _WU?$char_traits at _W@std@@@1 at AAV21@@Z at Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at P6AAAVios_base@1 at AAV21@@Z at Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at PAV?$basic_streambuf at _WU?$char_traits at _W@std@@@1@@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at PBX@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at _J@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at _K@Z
+  ??6?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV01 at _N@Z
+  ??7ios_base at std@@QBE_NXZ
+  ??Bid at locale@std@@QAEIXZ
+  ??Bios_base at std@@QBEPAXXZ
+  ??_7?$basic_ios at DU?$char_traits at D@std@@@std@@6B@
+  ??_7?$basic_ios at GU?$char_traits at G@std@@@std@@6B@
+  ??_7?$basic_ios at _WU?$char_traits at _W@std@@@std@@6B@
+  ??_7?$basic_iostream at DU?$char_traits at D@std@@@std@@6B@
+  ??_7?$basic_iostream at GU?$char_traits at G@std@@@std@@6B@
+  ??_7?$basic_iostream at _WU?$char_traits at _W@std@@@std@@6B@
+  ??_7?$basic_istream at DU?$char_traits at D@std@@@std@@6B@
+  ??_7?$basic_istream at GU?$char_traits at G@std@@@std@@6B@
+  ??_7?$basic_istream at _WU?$char_traits at _W@std@@@std@@6B@
+  ??_7?$basic_ostream at DU?$char_traits at D@std@@@std@@6B@
+  ??_7?$basic_ostream at GU?$char_traits at G@std@@@std@@6B@
+  ??_7?$basic_ostream at _WU?$char_traits at _W@std@@@std@@6B@
+  ??_7?$basic_streambuf at DU?$char_traits at D@std@@@std@@6B@
+  ??_7?$basic_streambuf at GU?$char_traits at G@std@@@std@@6B@
+  ??_7?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@6B@
+  ??_7?$codecvt at DDH@std@@6B@
+  ??_7?$codecvt at GDH@std@@6B@
+  ??_7?$codecvt at _WDH@std@@6B@
+  ??_7?$ctype at D@std@@6B@
+  ??_7?$ctype at G@std@@6B@
+  ??_7?$ctype at _W@std@@6B@
+  ??_7?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@6B@
+  ??_7?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@6B@
+  ??_7?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@6B@
+  ??_7?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@6B@
+  ??_7?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@6B@
+  ??_7?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@6B@
+  ??_7?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@6B@
+  ??_7?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@6B@
+  ??_7?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@6B@
+  ??_7?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@6B@
+  ??_7?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@6B@
+  ??_7?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@6B@
+  ??_7_Locimp at locale@std@@6B@
+  ??_7codecvt_base at std@@6B@
+  ??_7ctype_base at std@@6B@
+  ??_7ios_base at std@@6B@
+  ??_7time_base at std@@6B@
+  ??_8?$basic_iostream at DU?$char_traits at D@std@@@std@@7B?$basic_istream at DU?$char_traits at D@std@@@1@@
+  ??_8?$basic_iostream at DU?$char_traits at D@std@@@std@@7B?$basic_ostream at DU?$char_traits at D@std@@@1@@
+  ??_8?$basic_iostream at GU?$char_traits at G@std@@@std@@7B?$basic_istream at GU?$char_traits at G@std@@@1@@
+  ??_8?$basic_iostream at GU?$char_traits at G@std@@@std@@7B?$basic_ostream at GU?$char_traits at G@std@@@1@@
+  ??_8?$basic_iostream at _WU?$char_traits at _W@std@@@std@@7B?$basic_istream at _WU?$char_traits at _W@std@@@1@@
+  ??_8?$basic_iostream at _WU?$char_traits at _W@std@@@std@@7B?$basic_ostream at _WU?$char_traits at _W@std@@@1@@
+  ??_8?$basic_istream at DU?$char_traits at D@std@@@std@@7B@
+  ??_8?$basic_istream at GU?$char_traits at G@std@@@std@@7B@
+  ??_8?$basic_istream at _WU?$char_traits at _W@std@@@std@@7B@
+  ??_8?$basic_ostream at DU?$char_traits at D@std@@@std@@7B@
+  ??_8?$basic_ostream at GU?$char_traits at G@std@@@std@@7B@
+  ??_8?$basic_ostream at _WU?$char_traits at _W@std@@@std@@7B@
+  ??_D?$basic_iostream at DU?$char_traits at D@std@@@std@@QAEXXZ
+  ??_D?$basic_iostream at GU?$char_traits at G@std@@@std@@QAEXXZ
+  ??_D?$basic_iostream at _WU?$char_traits at _W@std@@@std@@QAEXXZ
+  ??_D?$basic_istream at DU?$char_traits at D@std@@@std@@QAEXXZ
+  ??_D?$basic_istream at GU?$char_traits at G@std@@@std@@QAEXXZ
+  ??_D?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEXXZ
+  ??_D?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEXXZ
+  ??_D?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEXXZ
+  ??_D?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEXXZ
+  ??_F?$codecvt at DDH@std@@QAEXXZ
+  ??_F?$codecvt at GDH@std@@QAEXXZ
+  ??_F?$codecvt at _WDH@std@@QAEXXZ
+  ??_F?$ctype at D@std@@QAEXXZ
+  ??_F?$ctype at G@std@@QAEXXZ
+  ??_F?$ctype at _W@std@@QAEXXZ
+  ??_F?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAEXXZ
+  ??_F?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAEXXZ
+  ??_F?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAEXXZ
+  ??_F?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAEXXZ
+  ??_F?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAEXXZ
+  ??_F?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAEXXZ
+  ??_F?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAEXXZ
+  ??_F?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAEXXZ
+  ??_F?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAEXXZ
+  ??_F?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAEXXZ
+  ??_F?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QAEXXZ
+  ??_F?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QAEXXZ
+  ??_F_Locimp at locale@std@@QAEXXZ
+  ??_F_Locinfo at std@@QAEXXZ
+  ??_F_Timevec at std@@QAEXXZ
+  ??_Fcodecvt_base at std@@QAEXXZ
+  ??_Fctype_base at std@@QAEXXZ
+  ??_Ffacet at locale@std@@QAEXXZ
+  ??_Fid at locale@std@@QAEXXZ
+  ??_Ftime_base at std@@QAEXXZ
+  ?NFS_Allocate at details@Concurrency@@YAPAXIIPAX at Z
+  ?NFS_Free at details@Concurrency@@YAXPAX at Z
+  ?NFS_GetLineSize at details@Concurrency@@YAIXZ
+  ?_Addcats at _Locinfo@std@@QAEAAV12 at HPBD@Z
+  ?_Addfac at _Locimp@locale at std@@AAEXPAVfacet at 23@I at Z
+  ?_Addstd at ios_base@std@@SAXPAV12@@Z
+  ?_Advance at _Concurrent_queue_iterator_base_v4@details at Concurrency@@IAEXXZ
+  ?_Assign at _Concurrent_queue_iterator_base_v4@details at Concurrency@@IAEXABV123@@Z
+  ?_Atexit@@YAXP6AXXZ at Z
+  ?_BADOFF at std@@3_JB
+  ?_C_str@?$_Yarn at D@std@@QBEPBDXZ
+  ?_Callfns at ios_base@std@@AAEXW4event at 12@@Z
+  ?_Clocptr at _Locimp@locale at std@@0PAV123 at A
+  ?_Decref at facet@locale at std@@QAEPAV123 at XZ
+  ?_Donarrow@?$ctype at G@std@@IBEDGD at Z
+  ?_Donarrow@?$ctype at _W@std@@IBED_WD at Z
+  ?_Dowiden@?$ctype at G@std@@IBEGD at Z
+  ?_Dowiden@?$ctype at _W@std@@IBE_WD at Z
+  ?_Empty@?$_Yarn at D@std@@QBE_NXZ
+  ?_Ffmt@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABAPADPADDH at Z
+  ?_Ffmt@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABAPADPADDH at Z
+  ?_Ffmt@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABAPADPADDH at Z
+  ?_Findarr at ios_base@std@@AAEAAU_Iosarray at 12@H at Z
+  ?_Fiopen at std@@YAPAU_iobuf@@PBDHH at Z
+  ?_Fiopen at std@@YAPAU_iobuf@@PBGHH at Z
+  ?_Fiopen at std@@YAPAU_iobuf@@PB_WHH at Z
+  ?_Fput@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPBDIIII at Z
+  ?_Fput@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GPBDIIII at Z
+  ?_Fput@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WPBDIIII at Z
+  ?_GetCombinableSize at details@Concurrency@@YAIXZ
+  ?_GetCurrentThreadId at details@Concurrency@@YAKXZ
+  ?_Getcat@?$codecvt at DDH@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$codecvt at GDH@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$codecvt at _WDH@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$ctype at D@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$ctype at G@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$ctype at _W@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat@?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z
+  ?_Getcat at facet@locale at std@@SAIPAPBV123 at PBV23@@Z
+  ?_Getcoll at _Locinfo@std@@QBE?AU_Collvec@@XZ
+  ?_Getctype at _Locinfo@std@@QBE?AU_Ctypevec@@XZ
+  ?_Getcvt at _Locinfo@std@@QBE?AU_Cvtvec@@XZ
+  ?_Getdateorder at _Locinfo@std@@QBEHXZ
+  ?_Getdays at _Locinfo@std@@QBEPBDXZ
+  ?_Getfalse at _Locinfo@std@@QBEPBDXZ
+  ?_Getffld@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at 1AAVios_base@2 at PAH@Z
+  ?_Getffld@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at 1AAVios_base@2 at PAH@Z
+  ?_Getffld@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at 1AAVios_base@2 at PAH@Z
+  ?_Getffldx@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at 1AAVios_base@2 at PAH@Z
+  ?_Getffldx@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at 1AAVios_base@2 at PAH@Z
+  ?_Getffldx@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at 1AAVios_base@2 at PAH@Z
+  ?_Getfmt@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@PBD at Z
+  ?_Getfmt@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@IBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@PBD at Z
+  ?_Getfmt@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@IBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@PBD at Z
+  ?_Getgloballocale at locale@std@@CAPAV_Locimp at 12@XZ
+  ?_Getifld@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at 1HABVlocale@2@@Z
+  ?_Getifld@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at 1HABVlocale@2@@Z
+  ?_Getifld@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at 1HABVlocale@2@@Z
+  ?_Getint@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at 0HHAAH@Z
+  ?_Getint@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at 0HHAAH@Z
+  ?_Getint@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at 0HHAAH@Z
+  ?_Getlconv at _Locinfo@std@@QBEPBUlconv@@XZ
+  ?_Getmonths at _Locinfo@std@@QBEPBDXZ
+  ?_Getname at _Locinfo@std@@QBEPBDXZ
+  ?_Getpfirst at _Container_base12@std@@QBEPAPAU_Iterator_base12 at 2@XZ
+  ?_Getptr at _Timevec@std@@QBEPAXXZ
+  ?_Gettnames at _Locinfo@std@@QBE?AV_Timevec at 2@XZ
+  ?_Gettrue at _Locinfo@std@@QBEPBDXZ
+  ?_Gnavail@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBE_JXZ
+  ?_Gnavail@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBE_JXZ
+  ?_Gnavail@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBE_JXZ
+  ?_Gndec@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEPADXZ
+  ?_Gndec@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEPAGXZ
+  ?_Gndec@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEPA_WXZ
+  ?_Gninc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEPADXZ
+  ?_Gninc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEPAGXZ
+  ?_Gninc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEPA_WXZ
+  ?_Gnpreinc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEPADXZ
+  ?_Gnpreinc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEPAGXZ
+  ?_Gnpreinc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEPA_WXZ
+  ?_Hexdig@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABAHDDDD at Z
+  ?_Hexdig@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABAHGGGG at Z
+  ?_Hexdig@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABAH_W000 at Z
+  ?_Id_cnt at id@locale at std@@0HA
+  ?_Ifmt@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABAPADPADPBDH at Z
+  ?_Ifmt@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABAPADPADPBDH at Z
+  ?_Ifmt@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABAPADPADPBDH at Z
+  ?_Incref at facet@locale at std@@QAEXXZ
+  ?_Index at ios_base@std@@0HA
+  ?_Init@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXPAPAD0PAH001 at Z
+  ?_Init@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXXZ
+  ?_Init@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXPAPAG0PAH001 at Z
+  ?_Init@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXXZ
+  ?_Init@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXPAPA_W0PAH001 at Z
+  ?_Init@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXXZ
+  ?_Init@?$codecvt at DDH@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$codecvt at GDH@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$codecvt at _WDH@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$ctype at D@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$ctype at G@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$ctype at _W@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init@?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@IAEXABV_Locinfo at 2@@Z
+  ?_Init at ios_base@std@@IAEXXZ
+  ?_Init at locale@std@@CAPAV_Locimp at 12@XZ
+  ?_Init_cnt at Init@ios_base at std@@0HA
+  ?_Init_cnt at _UShinit@std@@0HA
+  ?_Init_cnt at _Winit@std@@0HA
+  ?_Init_cnt_func at Init@ios_base at std@@CAAAHXZ
+  ?_Init_ctor at Init@ios_base at std@@CAXPAV123@@Z
+  ?_Init_dtor at Init@ios_base at std@@CAXPAV123@@Z
+  ?_Init_locks_ctor at _Init_locks@std@@CAXPAV12@@Z
+  ?_Init_locks_dtor at _Init_locks@std@@CAXPAV12@@Z
+  ?_Internal_assign at _Concurrent_vector_base_v4@details at Concurrency@@IAEXABV123 at IP6AXPAXI@ZP6AX1PBXI at Z4@Z
+  ?_Internal_capacity at _Concurrent_vector_base_v4@details at Concurrency@@IBEIXZ
+  ?_Internal_clear at _Concurrent_vector_base_v4@details at Concurrency@@IAEIP6AXPAXI at Z@Z
+  ?_Internal_compact at _Concurrent_vector_base_v4@details at Concurrency@@IAEPAXIPAXP6AX0I at ZP6AX0PBXI@Z at Z
+  ?_Internal_copy at _Concurrent_vector_base_v4@details at Concurrency@@IAEXABV123 at IP6AXPAXPBXI@Z at Z
+  ?_Internal_empty at _Concurrent_queue_base_v4@details at Concurrency@@IBE_NXZ
+  ?_Internal_finish_clear at _Concurrent_queue_base_v4@details at Concurrency@@IAEXXZ
+  ?_Internal_grow_by at _Concurrent_vector_base_v4@details at Concurrency@@IAEIIIP6AXPAXPBXI at Z1@Z
+  ?_Internal_grow_to_at_least_with_result at _Concurrent_vector_base_v4@details at Concurrency@@IAEIIIP6AXPAXPBXI at Z1@Z
+  ?_Internal_pop_if_present at _Concurrent_queue_base_v4@details at Concurrency@@IAE_NPAX at Z
+  ?_Internal_push at _Concurrent_queue_base_v4@details at Concurrency@@IAEXPBX at Z
+  ?_Internal_push_back at _Concurrent_vector_base_v4@details at Concurrency@@IAEPAXIAAI at Z
+  ?_Internal_reserve at _Concurrent_vector_base_v4@details at Concurrency@@IAEXIII at Z
+  ?_Internal_resize at _Concurrent_vector_base_v4@details at Concurrency@@IAEXIIIP6AXPAXI at ZP6AX0PBXI@Z2 at Z
+  ?_Internal_size at _Concurrent_queue_base_v4@details at Concurrency@@IBEIXZ
+  ?_Internal_swap at _Concurrent_vector_base_v4@details at Concurrency@@IAEXAAV123@@Z
+  ?_Internal_throw_exception at _Concurrent_queue_base_v4@details at Concurrency@@IBEXXZ
+  ?_Internal_throw_exception at _Concurrent_vector_base_v4@details at Concurrency@@IBEXI at Z
+  ?_Ios_base_dtor at ios_base@std@@CAXPAV12@@Z
+  ?_Ipfx@?$basic_istream at DU?$char_traits at D@std@@@std@@QAE_N_N at Z
+  ?_Ipfx@?$basic_istream at GU?$char_traits at G@std@@@std@@QAE_N_N at Z
+  ?_Ipfx@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE_N_N at Z
+  ?_Iput@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPADI at Z
+  ?_Iput@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GPADI at Z
+  ?_Iput@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WPADI at Z
+  ?_Locimp_Addfac at _Locimp@locale at std@@CAXPAV123 at PAVfacet@23 at I@Z
+  ?_Locimp_ctor at _Locimp@locale at std@@CAXPAV123 at ABV123@@Z
+  ?_Locimp_dtor at _Locimp@locale at std@@CAXPAV123@@Z
+  ?_Locinfo_Addcats at _Locinfo@std@@SAAAV12 at PAV12@HPBD at Z
+  ?_Locinfo_ctor at _Locinfo@std@@SAXPAV12 at HPBD@Z
+  ?_Locinfo_ctor at _Locinfo@std@@SAXPAV12 at PBD@Z
+  ?_Locinfo_dtor at _Locinfo@std@@SAXPAV12@@Z
+  ?_Lock@?$basic_streambuf at DU?$char_traits at D@std@@@std@@UAEXXZ
+  ?_Lock@?$basic_streambuf at GU?$char_traits at G@std@@@std@@UAEXXZ
+  ?_Lock@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@UAEXXZ
+  ?_Lock at _Mutex@std@@QAEXXZ
+  ?_Lockit_ctor at _Lockit@std@@CAXPAV12@@Z
+  ?_Lockit_ctor at _Lockit@std@@CAXPAV12 at H@Z
+  ?_Lockit_ctor at _Lockit@std@@SAXH at Z
+  ?_Lockit_dtor at _Lockit@std@@CAXPAV12@@Z
+  ?_Lockit_dtor at _Lockit@std@@SAXH at Z
+  ?_MP_Add at tr1@std@@YAXQA_K_K at Z
+  ?_MP_Get at tr1@std@@YA_KQA_K at Z
+  ?_MP_Mul at tr1@std@@YAXQA_K_K1 at Z
+  ?_MP_Rem at tr1@std@@YAXQA_K_K at Z
+  ?_Makeloc at _Locimp@locale at std@@CAPAV123 at ABV_Locinfo@3 at HPAV123@PBV23@@Z
+  ?_Makeushloc at _Locimp@locale at std@@CAXABV_Locinfo at 3@HPAV123 at PBV23@@Z
+  ?_Makewloc at _Locimp@locale at std@@CAXABV_Locinfo at 3@HPAV123 at PBV23@@Z
+  ?_Makexloc at _Locimp@locale at std@@CAXABV_Locinfo at 3@HPAV123 at PBV23@@Z
+  ?_Mtx_delete at threads@stdext@@YAXPAX at Z
+  ?_Mtx_lock at threads@stdext@@YAXPAX at Z
+  ?_Mtx_new at threads@stdext@@YAXAAPAX at Z
+  ?_Mtx_unlock at threads@stdext@@YAXPAX at Z
+  ?_Mutex_Lock at _Mutex@std@@CAXPAV12@@Z
+  ?_Mutex_Unlock at _Mutex@std@@CAXPAV12@@Z
+  ?_Mutex_ctor at _Mutex@std@@CAXPAV12@@Z
+  ?_Mutex_dtor at _Mutex@std@@CAXPAV12@@Z
+  ?_Nomemory at std@@YAXXZ
+  ?_Orphan_all at _Container_base0@std@@QAEXXZ
+  ?_Orphan_all at _Container_base12@std@@QAEXXZ
+  ?_Osfx@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEXXZ
+  ?_Osfx@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEXXZ
+  ?_Osfx@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEXXZ
+  ?_Pnavail@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBE_JXZ
+  ?_Pnavail@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBE_JXZ
+  ?_Pnavail@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBE_JXZ
+  ?_Pninc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEPADXZ
+  ?_Pninc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEPAGXZ
+  ?_Pninc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEPA_WXZ
+  ?_Ptr_cerr at std@@3PAV?$basic_ostream at DU?$char_traits at D@std@@@1 at A
+  ?_Ptr_cin at std@@3PAV?$basic_istream at DU?$char_traits at D@std@@@1 at A
+  ?_Ptr_clog at std@@3PAV?$basic_ostream at DU?$char_traits at D@std@@@1 at A
+  ?_Ptr_cout at std@@3PAV?$basic_ostream at DU?$char_traits at D@std@@@1 at A
+  ?_Ptr_wcerr at std@@3PAV?$basic_ostream at GU?$char_traits at G@std@@@1 at A
+  ?_Ptr_wcerr at std@@3PAV?$basic_ostream at _WU?$char_traits at _W@std@@@1 at A
+  ?_Ptr_wcin at std@@3PAV?$basic_istream at GU?$char_traits at G@std@@@1 at A
+  ?_Ptr_wcin at std@@3PAV?$basic_istream at _WU?$char_traits at _W@std@@@1 at A
+  ?_Ptr_wclog at std@@3PAV?$basic_ostream at GU?$char_traits at G@std@@@1 at A
+  ?_Ptr_wclog at std@@3PAV?$basic_ostream at _WU?$char_traits at _W@std@@@1 at A
+  ?_Ptr_wcout at std@@3PAV?$basic_ostream at GU?$char_traits at G@std@@@1 at A
+  ?_Ptr_wcout at std@@3PAV?$basic_ostream at _WU?$char_traits at _W@std@@@1 at A
+  ?_Put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@PBDI at Z
+  ?_Put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@PBGI at Z
+  ?_Put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@PB_WI at Z
+  ?_Putc@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@PBDI at Z
+  ?_Putc@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@PBDI at Z
+  ?_Putc@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@PBDI at Z
+  ?_Putgrouped@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@PBDID at Z
+  ?_Putgrouped@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@PBDIG at Z
+  ?_Putgrouped@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@PBDI_W at Z
+  ?_Raise_handler at std@@3P6AXABVexception at stdext@@@ZA
+  ?_Random_device at tr1@std@@YAIXZ
+  ?_Rep@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@DI at Z
+  ?_Rep@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@GI at Z
+  ?_Rep@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@_WI at Z
+  ?_Rng_abort at tr1@std@@YAXPBD at Z
+  ?_Segment_index_of at _Concurrent_vector_base_v4@details at Concurrency@@KAII at Z
+  ?_Setgloballocale at locale@std@@CAXPAX at Z
+  ?_Swap_all at _Container_base0@std@@QAEXAAU12@@Z
+  ?_Swap_all at _Container_base12@std@@QAEXAAU12@@Z
+  ?_Sync at ios_base@std@@0_NA
+  ?_Tidy@?$_Yarn at D@std@@AAEXXZ
+  ?_Tidy@?$ctype at D@std@@IAEXXZ
+  ?_Tidy@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@AAEXXZ
+  ?_Tidy@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@AAEXXZ
+  ?_Tidy@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@AAEXXZ
+  ?_Tidy at ios_base@std@@AAEXXZ
+  ?_Unlock@?$basic_streambuf at DU?$char_traits at D@std@@@std@@UAEXXZ
+  ?_Unlock@?$basic_streambuf at GU?$char_traits at G@std@@@std@@UAEXXZ
+  ?_Unlock@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@UAEXXZ
+  ?_Unlock at _Mutex@std@@QAEXXZ
+  ?_XLgamma at tr1@std@@YAMM at Z
+  ?_XLgamma at tr1@std@@YANN at Z
+  ?_XLgamma at tr1@std@@YAOO at Z
+  ?_Xbad at tr1@std@@YAXW4error_type at regex_constants@12@@Z
+  ?_Xfunc at tr1@std@@YAXXZ
+  ?_Xinvalid_argument at std@@YAXPBD at Z
+  ?_Xlength_error at std@@YAXPBD at Z
+  ?_Xmem at tr1@std@@YAXXZ
+  ?_Xout_of_range at std@@YAXPBD at Z
+  ?_Xoverflow_error at std@@YAXPBD at Z
+  ?_Xruntime_error at std@@YAXPBD at Z
+  ?always_noconv at codecvt_base@std@@QBE_NXZ
+  ?bad at ios_base@std@@QBE_NXZ
+  ?c_str@?$_Yarn at D@std@@QBEPBDXZ
+  ?cancel at agent@Concurrency@@QAE_NXZ
+  ?cerr at std@@3V?$basic_ostream at DU?$char_traits at D@std@@@1 at A
+  ?cin at std@@3V?$basic_istream at DU?$char_traits at D@std@@@1 at A
+  ?classic at locale@std@@SAABV12 at XZ
+  ?classic_table@?$ctype at D@std@@SAPBFXZ
+  ?clear@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEXH_N at Z
+  ?clear@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEXI at Z
+  ?clear@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEXH_N at Z
+  ?clear@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEXI at Z
+  ?clear@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEXH_N at Z
+  ?clear@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEXI at Z
+  ?clear at ios_base@std@@QAEXH at Z
+  ?clear at ios_base@std@@QAEXH_N at Z
+  ?clear at ios_base@std@@QAEXI at Z
+  ?clog at std@@3V?$basic_ostream at DU?$char_traits at D@std@@@1 at A
+  ?copyfmt@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEAAV12 at ABV12@@Z
+  ?copyfmt@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEAAV12 at ABV12@@Z
+  ?copyfmt@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at ABV12@@Z
+  ?copyfmt at ios_base@std@@QAEAAV12 at ABV12@@Z
+  ?cout at std@@3V?$basic_ostream at DU?$char_traits at D@std@@@1 at A
+  ?date_order@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AW4dateorder at time_base@2 at XZ
+  ?date_order@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AW4dateorder at time_base@2 at XZ
+  ?date_order@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AW4dateorder at time_base@2 at XZ
+  ?denorm_min@?$numeric_limits at C@std@@SACXZ
+  ?denorm_min@?$numeric_limits at D@std@@SADXZ
+  ?denorm_min@?$numeric_limits at E@std@@SAEXZ
+  ?denorm_min@?$numeric_limits at F@std@@SAFXZ
+  ?denorm_min@?$numeric_limits at G@std@@SAGXZ
+  ?denorm_min@?$numeric_limits at H@std@@SAHXZ
+  ?denorm_min@?$numeric_limits at I@std@@SAIXZ
+  ?denorm_min@?$numeric_limits at J@std@@SAJXZ
+  ?denorm_min@?$numeric_limits at K@std@@SAKXZ
+  ?denorm_min@?$numeric_limits at M@std@@SAMXZ
+  ?denorm_min@?$numeric_limits at N@std@@SANXZ
+  ?denorm_min@?$numeric_limits at O@std@@SAOXZ
+  ?denorm_min@?$numeric_limits at _J@std@@SA_JXZ
+  ?denorm_min@?$numeric_limits at _K@std@@SA_KXZ
+  ?denorm_min@?$numeric_limits at _N@std@@SA_NXZ
+  ?denorm_min@?$numeric_limits at _W@std@@SA_WXZ
+  ?digits10@?$numeric_limits at C@std@@2HB
+  ?digits10@?$numeric_limits at D@std@@2HB
+  ?digits10@?$numeric_limits at E@std@@2HB
+  ?digits10@?$numeric_limits at F@std@@2HB
+  ?digits10@?$numeric_limits at G@std@@2HB
+  ?digits10@?$numeric_limits at H@std@@2HB
+  ?digits10@?$numeric_limits at I@std@@2HB
+  ?digits10@?$numeric_limits at J@std@@2HB
+  ?digits10@?$numeric_limits at K@std@@2HB
+  ?digits10@?$numeric_limits at M@std@@2HB
+  ?digits10@?$numeric_limits at N@std@@2HB
+  ?digits10@?$numeric_limits at O@std@@2HB
+  ?digits10@?$numeric_limits at _J@std@@2HB
+  ?digits10@?$numeric_limits at _K@std@@2HB
+  ?digits10@?$numeric_limits at _N@std@@2HB
+  ?digits10@?$numeric_limits at _W@std@@2HB
+  ?digits10 at _Num_base@std@@2HB
+  ?digits@?$numeric_limits at C@std@@2HB
+  ?digits@?$numeric_limits at D@std@@2HB
+  ?digits@?$numeric_limits at E@std@@2HB
+  ?digits@?$numeric_limits at F@std@@2HB
+  ?digits@?$numeric_limits at G@std@@2HB
+  ?digits@?$numeric_limits at H@std@@2HB
+  ?digits@?$numeric_limits at I@std@@2HB
+  ?digits@?$numeric_limits at J@std@@2HB
+  ?digits@?$numeric_limits at K@std@@2HB
+  ?digits@?$numeric_limits at M@std@@2HB
+  ?digits@?$numeric_limits at N@std@@2HB
+  ?digits@?$numeric_limits at O@std@@2HB
+  ?digits@?$numeric_limits at _J@std@@2HB
+  ?digits@?$numeric_limits at _K@std@@2HB
+  ?digits@?$numeric_limits at _N@std@@2HB
+  ?digits@?$numeric_limits at _W@std@@2HB
+  ?digits at _Num_base@std@@2HB
+  ?do_always_noconv@?$codecvt at GDH@std@@MBE_NXZ
+  ?do_always_noconv@?$codecvt at _WDH@std@@MBE_NXZ
+  ?do_always_noconv at codecvt_base@std@@MBE_NXZ
+  ?do_date_order@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AW4dateorder at time_base@2 at XZ
+  ?do_date_order@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AW4dateorder at time_base@2 at XZ
+  ?do_date_order@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AW4dateorder at time_base@2 at XZ
+  ?do_encoding at codecvt_base@std@@MBEHXZ
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAG at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAI at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAJ at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAK at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAM at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAN at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAO at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAPAX at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAA_J at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAA_K at Z
+  ?do_get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAA_N at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAG at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAI at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAJ at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAK at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAM at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAN at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAO at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAPAX at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAA_J at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAA_K at Z
+  ?do_get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAA_N at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAG at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAI at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAJ at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAK at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAM at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAN at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAO at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAPAX at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAA_J at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAA_K at Z
+  ?do_get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAA_N at Z
+  ?do_get@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@DD at Z
+  ?do_get@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@DD at Z
+  ?do_get@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@DD at Z
+  ?do_get_date@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_date@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_date@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_monthname@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_monthname@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_monthname@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_time@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_time@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_time@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_weekday@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_weekday@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_weekday@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_year@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_year@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_get_year@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?do_in@?$codecvt at DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD at Z
+  ?do_in@?$codecvt at GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG at Z
+  ?do_in@?$codecvt at _WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W at Z
+  ?do_is@?$ctype at G@std@@MBEPBGPBG0PAF at Z
+  ?do_is@?$ctype at G@std@@MBE_NFG at Z
+  ?do_is@?$ctype at _W@std@@MBEPB_WPB_W0PAF at Z
+  ?do_is@?$ctype at _W@std@@MBE_NF_W at Z
+  ?do_length@?$codecvt at DDH@std@@MBEHABHPBD1I at Z
+  ?do_length@?$codecvt at GDH@std@@MBEHABHPBD1I at Z
+  ?do_length@?$codecvt at _WDH@std@@MBEHABHPBD1I at Z
+  ?do_max_length@?$codecvt at GDH@std@@MBEHXZ
+  ?do_max_length@?$codecvt at _WDH@std@@MBEHXZ
+  ?do_max_length at codecvt_base@std@@MBEHXZ
+  ?do_narrow@?$ctype at D@std@@MBEDDD at Z
+  ?do_narrow@?$ctype at D@std@@MBEPBDPBD0DPAD at Z
+  ?do_narrow@?$ctype at G@std@@MBEDGD at Z
+  ?do_narrow@?$ctype at G@std@@MBEPBGPBG0DPAD at Z
+  ?do_narrow@?$ctype at _W@std@@MBED_WD at Z
+  ?do_narrow@?$ctype at _W@std@@MBEPB_WPB_W0DPAD at Z
+  ?do_out@?$codecvt at DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD at Z
+  ?do_out@?$codecvt at GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD at Z
+  ?do_out@?$codecvt at _WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DJ at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DK at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DN at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DO at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPBX at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_J at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_K at Z
+  ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_N at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GJ at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GK at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GN at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GO at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GPBX at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@G_J at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@G_K at Z
+  ?do_put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@G_N at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WJ at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WK at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WN at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WO at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WPBX at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_W_J at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_W_K at Z
+  ?do_put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_W_N at Z
+  ?do_put@?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPBUtm@@DD at Z
+  ?do_put@?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GPBUtm@@DD at Z
+  ?do_put@?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WPBUtm@@DD at Z
+  ?do_scan_is@?$ctype at G@std@@MBEPBGFPBG0 at Z
+  ?do_scan_is@?$ctype at _W@std@@MBEPB_WFPB_W0 at Z
+  ?do_scan_not@?$ctype at G@std@@MBEPBGFPBG0 at Z
+  ?do_scan_not@?$ctype at _W@std@@MBEPB_WFPB_W0 at Z
+  ?do_tolower@?$ctype at D@std@@MBEDD at Z
+  ?do_tolower@?$ctype at D@std@@MBEPBDPADPBD at Z
+  ?do_tolower@?$ctype at G@std@@MBEGG at Z
+  ?do_tolower@?$ctype at G@std@@MBEPBGPAGPBG at Z
+  ?do_tolower@?$ctype at _W@std@@MBEPB_WPA_WPB_W at Z
+  ?do_tolower@?$ctype at _W@std@@MBE_W_W at Z
+  ?do_toupper@?$ctype at D@std@@MBEDD at Z
+  ?do_toupper@?$ctype at D@std@@MBEPBDPADPBD at Z
+  ?do_toupper@?$ctype at G@std@@MBEGG at Z
+  ?do_toupper@?$ctype at G@std@@MBEPBGPAGPBG at Z
+  ?do_toupper@?$ctype at _W@std@@MBEPB_WPA_WPB_W at Z
+  ?do_toupper@?$ctype at _W@std@@MBE_W_W at Z
+  ?do_unshift@?$codecvt at DDH@std@@MBEHAAHPAD1AAPAD at Z
+  ?do_unshift@?$codecvt at GDH@std@@MBEHAAHPAD1AAPAD at Z
+  ?do_unshift@?$codecvt at _WDH@std@@MBEHAAHPAD1AAPAD at Z
+  ?do_widen@?$ctype at D@std@@MBEDD at Z
+  ?do_widen@?$ctype at D@std@@MBEPBDPBD0PAD at Z
+  ?do_widen@?$ctype at G@std@@MBEGD at Z
+  ?do_widen@?$ctype at G@std@@MBEPBDPBD0PAG at Z
+  ?do_widen@?$ctype at _W@std@@MBEPBDPBD0PA_W at Z
+  ?do_widen@?$ctype at _W@std@@MBE_WD at Z
+  ?done at agent@Concurrency@@IAE_NXZ
+  ?eback@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBEPADXZ
+  ?eback@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBEPAGXZ
+  ?eback@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBEPA_WXZ
+  ?egptr@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBEPADXZ
+  ?egptr@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBEPAGXZ
+  ?egptr@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBEPA_WXZ
+  ?empty@?$_Yarn at D@std@@QBE_NXZ
+  ?empty at locale@std@@SA?AV12 at XZ
+  ?encoding at codecvt_base@std@@QBEHXZ
+  ?endl at std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@1 at AAV21@@Z
+  ?endl at std@@YAAAV?$basic_ostream at GU?$char_traits at G@std@@@1 at AAV21@@Z
+  ?endl at std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@1 at AAV21@@Z
+  ?ends at std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@1 at AAV21@@Z
+  ?ends at std@@YAAAV?$basic_ostream at GU?$char_traits at G@std@@@1 at AAV21@@Z
+  ?ends at std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@1 at AAV21@@Z
+  ?eof at ios_base@std@@QBE_NXZ
+  ?epptr@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBEPADXZ
+  ?epptr@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBEPAGXZ
+  ?epptr@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBEPA_WXZ
+  ?epsilon@?$numeric_limits at C@std@@SACXZ
+  ?epsilon@?$numeric_limits at D@std@@SADXZ
+  ?epsilon@?$numeric_limits at E@std@@SAEXZ
+  ?epsilon@?$numeric_limits at F@std@@SAFXZ
+  ?epsilon@?$numeric_limits at G@std@@SAGXZ
+  ?epsilon@?$numeric_limits at H@std@@SAHXZ
+  ?epsilon@?$numeric_limits at I@std@@SAIXZ
+  ?epsilon@?$numeric_limits at J@std@@SAJXZ
+  ?epsilon@?$numeric_limits at K@std@@SAKXZ
+  ?epsilon@?$numeric_limits at M@std@@SAMXZ
+  ?epsilon@?$numeric_limits at N@std@@SANXZ
+  ?epsilon@?$numeric_limits at O@std@@SAOXZ
+  ?epsilon@?$numeric_limits at _J@std@@SA_JXZ
+  ?epsilon@?$numeric_limits at _K@std@@SA_KXZ
+  ?epsilon@?$numeric_limits at _N@std@@SA_NXZ
+  ?epsilon@?$numeric_limits at _W@std@@SA_WXZ
+  ?exceptions at ios_base@std@@QAEXH at Z
+  ?exceptions at ios_base@std@@QAEXI at Z
+  ?exceptions at ios_base@std@@QBEHXZ
+  ?fail at ios_base@std@@QBE_NXZ
+  ?fill@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEDD at Z
+  ?fill@?$basic_ios at DU?$char_traits at D@std@@@std@@QBEDXZ
+  ?fill@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEGG at Z
+  ?fill@?$basic_ios at GU?$char_traits at G@std@@@std@@QBEGXZ
+  ?fill@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAE_W_W at Z
+  ?fill@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QBE_WXZ
+  ?flags at ios_base@std@@QAEHH at Z
+  ?flags at ios_base@std@@QBEHXZ
+  ?flush@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV12 at XZ
+  ?flush@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV12 at XZ
+  ?flush@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at XZ
+  ?flush at std@@YAAAV?$basic_ostream at DU?$char_traits at D@std@@@1 at AAV21@@Z
+  ?flush at std@@YAAAV?$basic_ostream at GU?$char_traits at G@std@@@1 at AAV21@@Z
+  ?flush at std@@YAAAV?$basic_ostream at _WU?$char_traits at _W@std@@@1 at AAV21@@Z
+  ?gbump@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXH at Z
+  ?gbump@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXH at Z
+  ?gbump@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXH at Z
+  ?gcount@?$basic_istream at DU?$char_traits at D@std@@@std@@QBE_JXZ
+  ?gcount@?$basic_istream at GU?$char_traits at G@std@@@std@@QBE_JXZ
+  ?gcount@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QBE_JXZ
+  ?generic_category at std@@YAABVerror_category at 1@XZ
+  ?get@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at AAD@Z
+  ?get@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at AAV?$basic_streambuf at DU?$char_traits at D@std@@@2@@Z
+  ?get@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at AAV?$basic_streambuf at DU?$char_traits at D@std@@@2 at D@Z
+  ?get@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at PAD_J@Z
+  ?get@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at PAD_JD@Z
+  ?get@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?get@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at AAG@Z
+  ?get@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at AAV?$basic_streambuf at GU?$char_traits at G@std@@@2@@Z
+  ?get@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at AAV?$basic_streambuf at GU?$char_traits at G@std@@@2 at G@Z
+  ?get@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at PAG_J@Z
+  ?get@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at PAG_JG@Z
+  ?get@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEGXZ
+  ?get@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at AAV?$basic_streambuf at _WU?$char_traits at _W@std@@@2@@Z
+  ?get@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at AAV?$basic_streambuf at _WU?$char_traits at _W@std@@@2 at _W@Z
+  ?get@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at AA_W@Z
+  ?get@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at PA_W_J@Z
+  ?get@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at PA_W_J_W@Z
+  ?get@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEGXZ
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAG at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAI at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAJ at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAK at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAM at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAN at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAO at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAAPAX at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAA_J at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAA_K at Z
+  ?get@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHAA_N at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAG at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAI at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAJ at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAK at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAM at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAN at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAO at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAAPAX at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAA_J at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAA_K at Z
+  ?get@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHAA_N at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAG at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAI at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAJ at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAK at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAM at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAN at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAO at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAAPAX at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAA_J at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAA_K at Z
+  ?get@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHAA_N at Z
+  ?get@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@DD at Z
+  ?get@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@PBD4 at Z
+  ?get@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@DD at Z
+  ?get@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@PBG4 at Z
+  ?get@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@DD at Z
+  ?get@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@PB_W4 at Z
+  ?get_date@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_date@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_date@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_monthname@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_monthname@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_monthname@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_time@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_time@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_time@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_weekday@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_weekday@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_weekday@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_year@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_year@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?get_year@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z
+  ?getline@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at PAD_J@Z
+  ?getline@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at PAD_JD@Z
+  ?getline@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at PAG_J@Z
+  ?getline@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at PAG_JG@Z
+  ?getline@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at PA_W_J@Z
+  ?getline@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at PA_W_J_W@Z
+  ?getloc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QBE?AVlocale at 2@XZ
+  ?getloc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QBE?AVlocale at 2@XZ
+  ?getloc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QBE?AVlocale at 2@XZ
+  ?getloc at ios_base@std@@QBE?AVlocale at 2@XZ
+  ?global at locale@std@@SA?AV12 at ABV12@@Z
+  ?good at ios_base@std@@QBE_NXZ
+  ?gptr@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBEPADXZ
+  ?gptr@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBEPAGXZ
+  ?gptr@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBEPA_WXZ
+  ?has_denorm at _Num_base@std@@2W4float_denorm_style at 2@B
+  ?has_denorm at _Num_float_base@std@@2W4float_denorm_style at 2@B
+  ?has_denorm_loss at _Num_base@std@@2_NB
+  ?has_denorm_loss at _Num_float_base@std@@2_NB
+  ?has_infinity at _Num_base@std@@2_NB
+  ?has_infinity at _Num_float_base@std@@2_NB
+  ?has_quiet_NaN at _Num_base@std@@2_NB
+  ?has_quiet_NaN at _Num_float_base@std@@2_NB
+  ?has_signaling_NaN at _Num_base@std@@2_NB
+  ?has_signaling_NaN at _Num_float_base@std@@2_NB
+  ?id@?$codecvt at DDH@std@@2V0locale at 2@A
+  ?id@?$codecvt at GDH@std@@2V0locale at 2@A
+  ?id@?$codecvt at _WDH@std@@2V0locale at 2@A
+  ?id@?$collate at D@std@@2V0locale at 2@A
+  ?id@?$collate at G@std@@2V0locale at 2@A
+  ?id@?$collate at _W@std@@2V0locale at 2@A
+  ?id@?$ctype at D@std@@2V0locale at 2@A
+  ?id@?$ctype at G@std@@2V0locale at 2@A
+  ?id@?$ctype at _W@std@@2V0locale at 2@A
+  ?id@?$messages at D@std@@2V0locale at 2@A
+  ?id@?$messages at G@std@@2V0locale at 2@A
+  ?id@?$messages at _W@std@@2V0locale at 2@A
+  ?id@?$money_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$money_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$money_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$money_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$money_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$money_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$moneypunct at D$00 at std@@2V0locale at 2@A
+  ?id@?$moneypunct at D$0A@@std@@2V0locale at 2@A
+  ?id@?$moneypunct at G$00 at std@@2V0locale at 2@A
+  ?id@?$moneypunct at G$0A@@std@@2V0locale at 2@A
+  ?id@?$moneypunct at _W$00 at std@@2V0locale at 2@A
+  ?id@?$moneypunct at _W$0A@@std@@2V0locale at 2@A
+  ?id@?$num_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$num_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$num_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$numpunct at D@std@@2V0locale at 2@A
+  ?id@?$numpunct at G@std@@2V0locale at 2@A
+  ?id@?$numpunct at _W@std@@2V0locale at 2@A
+  ?id@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$time_get at GV?$istreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$time_get at _WV?$istreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@2V0locale at 2@A
+  ?id@?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@2V0locale at 2@A
+  ?ignore@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at _JH@Z
+  ?ignore@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at _JG@Z
+  ?ignore@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at _JG@Z
+  ?imbue@?$basic_ios at DU?$char_traits at D@std@@@std@@QAE?AVlocale at 2@ABV32@@Z
+  ?imbue@?$basic_ios at GU?$char_traits at G@std@@@std@@QAE?AVlocale at 2@ABV32@@Z
+  ?imbue@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAE?AVlocale at 2@ABV32@@Z
+  ?imbue@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAEXABVlocale at 2@@Z
+  ?imbue@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAEXABVlocale at 2@@Z
+  ?imbue@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAEXABVlocale at 2@@Z
+  ?imbue at ios_base@std@@QAE?AVlocale at 2@ABV32@@Z
+  ?in@?$codecvt at DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD at Z
+  ?in@?$codecvt at GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG at Z
+  ?in@?$codecvt at _WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W at Z
+  ?in_avail@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE_JXZ
+  ?in_avail@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE_JXZ
+  ?in_avail@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE_JXZ
+  ?infinity@?$numeric_limits at C@std@@SACXZ
+  ?infinity@?$numeric_limits at D@std@@SADXZ
+  ?infinity@?$numeric_limits at E@std@@SAEXZ
+  ?infinity@?$numeric_limits at F@std@@SAFXZ
+  ?infinity@?$numeric_limits at G@std@@SAGXZ
+  ?infinity@?$numeric_limits at H@std@@SAHXZ
+  ?infinity@?$numeric_limits at I@std@@SAIXZ
+  ?infinity@?$numeric_limits at J@std@@SAJXZ
+  ?infinity@?$numeric_limits at K@std@@SAKXZ
+  ?infinity@?$numeric_limits at M@std@@SAMXZ
+  ?infinity@?$numeric_limits at N@std@@SANXZ
+  ?infinity@?$numeric_limits at O@std@@SAOXZ
+  ?infinity@?$numeric_limits at _J@std@@SA_JXZ
+  ?infinity@?$numeric_limits at _K@std@@SA_KXZ
+  ?infinity@?$numeric_limits at _N@std@@SA_NXZ
+  ?infinity@?$numeric_limits at _W@std@@SA_WXZ
+  ?init@?$basic_ios at DU?$char_traits at D@std@@@std@@IAEXPAV?$basic_streambuf at DU?$char_traits at D@std@@@2 at _N@Z
+  ?init@?$basic_ios at GU?$char_traits at G@std@@@std@@IAEXPAV?$basic_streambuf at GU?$char_traits at G@std@@@2 at _N@Z
+  ?init@?$basic_ios at _WU?$char_traits at _W@std@@@std@@IAEXPAV?$basic_streambuf at _WU?$char_traits at _W@std@@@2 at _N@Z
+  ?intl@?$moneypunct at D$00 at std@@2_NB
+  ?intl@?$moneypunct at D$0A@@std@@2_NB
+  ?intl@?$moneypunct at G$00 at std@@2_NB
+  ?intl@?$moneypunct at G$0A@@std@@2_NB
+  ?intl@?$moneypunct at _W$00 at std@@2_NB
+  ?intl@?$moneypunct at _W$0A@@std@@2_NB
+  ?iostream_category at std@@YAABVerror_category at 1@XZ
+  ?ipfx@?$basic_istream at DU?$char_traits at D@std@@@std@@QAE_N_N at Z
+  ?ipfx@?$basic_istream at GU?$char_traits at G@std@@@std@@QAE_N_N at Z
+  ?ipfx@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE_N_N at Z
+  ?is@?$ctype at D@std@@QBEPBDPBD0PAF at Z
+  ?is@?$ctype at D@std@@QBE_NFD at Z
+  ?is@?$ctype at G@std@@QBEPBGPBG0PAF at Z
+  ?is@?$ctype at G@std@@QBE_NFG at Z
+  ?is@?$ctype at _W@std@@QBEPB_WPB_W0PAF at Z
+  ?is@?$ctype at _W@std@@QBE_NF_W at Z
+  ?is_bounded at _Num_base@std@@2_NB
+  ?is_bounded at _Num_float_base@std@@2_NB
+  ?is_bounded at _Num_int_base@std@@2_NB
+  ?is_current_task_group_canceling at Concurrency@@YA_NXZ
+  ?is_exact at _Num_base@std@@2_NB
+  ?is_exact at _Num_float_base@std@@2_NB
+  ?is_exact at _Num_int_base@std@@2_NB
+  ?is_iec559 at _Num_base@std@@2_NB
+  ?is_iec559 at _Num_float_base@std@@2_NB
+  ?is_integer at _Num_base@std@@2_NB
+  ?is_integer at _Num_float_base@std@@2_NB
+  ?is_integer at _Num_int_base@std@@2_NB
+  ?is_modulo@?$numeric_limits at _N@std@@2_NB
+  ?is_modulo at _Num_base@std@@2_NB
+  ?is_modulo at _Num_float_base@std@@2_NB
+  ?is_modulo at _Num_int_base@std@@2_NB
+  ?is_signed@?$numeric_limits at C@std@@2_NB
+  ?is_signed@?$numeric_limits at D@std@@2_NB
+  ?is_signed@?$numeric_limits at E@std@@2_NB
+  ?is_signed@?$numeric_limits at F@std@@2_NB
+  ?is_signed@?$numeric_limits at G@std@@2_NB
+  ?is_signed@?$numeric_limits at H@std@@2_NB
+  ?is_signed@?$numeric_limits at I@std@@2_NB
+  ?is_signed@?$numeric_limits at J@std@@2_NB
+  ?is_signed@?$numeric_limits at K@std@@2_NB
+  ?is_signed@?$numeric_limits at _J@std@@2_NB
+  ?is_signed@?$numeric_limits at _K@std@@2_NB
+  ?is_signed@?$numeric_limits at _N@std@@2_NB
+  ?is_signed@?$numeric_limits at _W@std@@2_NB
+  ?is_signed at _Num_base@std@@2_NB
+  ?is_signed at _Num_float_base@std@@2_NB
+  ?is_specialized at _Num_base@std@@2_NB
+  ?is_specialized at _Num_float_base@std@@2_NB
+  ?is_specialized at _Num_int_base@std@@2_NB
+  ?isfx@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEXXZ
+  ?isfx@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEXXZ
+  ?isfx@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEXXZ
+  ?iword at ios_base@std@@QAEAAJH at Z
+  ?length@?$codecvt at DDH@std@@QBEHABHPBD1I at Z
+  ?length@?$codecvt at GDH@std@@QBEHABHPBD1I at Z
+  ?length@?$codecvt at _WDH@std@@QBEHABHPBD1I at Z
+  ?lowest@?$numeric_limits at C@std@@SACXZ
+  ?lowest@?$numeric_limits at D@std@@SADXZ
+  ?lowest@?$numeric_limits at E@std@@SAEXZ
+  ?lowest@?$numeric_limits at F@std@@SAFXZ
+  ?lowest@?$numeric_limits at G@std@@SAGXZ
+  ?lowest@?$numeric_limits at H@std@@SAHXZ
+  ?lowest@?$numeric_limits at I@std@@SAIXZ
+  ?lowest@?$numeric_limits at J@std@@SAJXZ
+  ?lowest@?$numeric_limits at K@std@@SAKXZ
+  ?lowest@?$numeric_limits at M@std@@SAMXZ
+  ?lowest@?$numeric_limits at N@std@@SANXZ
+  ?lowest@?$numeric_limits at O@std@@SAOXZ
+  ?lowest@?$numeric_limits at _J@std@@SA_JXZ
+  ?lowest@?$numeric_limits at _K@std@@SA_KXZ
+  ?lowest@?$numeric_limits at _N@std@@SA_NXZ
+  ?lowest@?$numeric_limits at _W@std@@SA_WXZ
+  ?max@?$numeric_limits at C@std@@SACXZ
+  ?max@?$numeric_limits at D@std@@SADXZ
+  ?max@?$numeric_limits at E@std@@SAEXZ
+  ?max@?$numeric_limits at F@std@@SAFXZ
+  ?max@?$numeric_limits at G@std@@SAGXZ
+  ?max@?$numeric_limits at H@std@@SAHXZ
+  ?max@?$numeric_limits at I@std@@SAIXZ
+  ?max@?$numeric_limits at J@std@@SAJXZ
+  ?max@?$numeric_limits at K@std@@SAKXZ
+  ?max@?$numeric_limits at M@std@@SAMXZ
+  ?max@?$numeric_limits at N@std@@SANXZ
+  ?max@?$numeric_limits at O@std@@SAOXZ
+  ?max@?$numeric_limits at _J@std@@SA_JXZ
+  ?max@?$numeric_limits at _K@std@@SA_KXZ
+  ?max@?$numeric_limits at _N@std@@SA_NXZ
+  ?max@?$numeric_limits at _W@std@@SA_WXZ
+  ?max_digits10@?$numeric_limits at C@std@@2HB
+  ?max_digits10@?$numeric_limits at D@std@@2HB
+  ?max_digits10@?$numeric_limits at E@std@@2HB
+  ?max_digits10@?$numeric_limits at F@std@@2HB
+  ?max_digits10@?$numeric_limits at G@std@@2HB
+  ?max_digits10@?$numeric_limits at H@std@@2HB
+  ?max_digits10@?$numeric_limits at I@std@@2HB
+  ?max_digits10@?$numeric_limits at J@std@@2HB
+  ?max_digits10@?$numeric_limits at K@std@@2HB
+  ?max_digits10@?$numeric_limits at M@std@@2HB
+  ?max_digits10@?$numeric_limits at N@std@@2HB
+  ?max_digits10@?$numeric_limits at O@std@@2HB
+  ?max_digits10@?$numeric_limits at _J@std@@2HB
+  ?max_digits10@?$numeric_limits at _K@std@@2HB
+  ?max_digits10@?$numeric_limits at _N@std@@2HB
+  ?max_digits10@?$numeric_limits at _W@std@@2HB
+  ?max_digits10 at _Num_base@std@@2HB
+  ?max_exponent10@?$numeric_limits at M@std@@2HB
+  ?max_exponent10@?$numeric_limits at N@std@@2HB
+  ?max_exponent10@?$numeric_limits at O@std@@2HB
+  ?max_exponent10 at _Num_base@std@@2HB
+  ?max_exponent@?$numeric_limits at M@std@@2HB
+  ?max_exponent@?$numeric_limits at N@std@@2HB
+  ?max_exponent@?$numeric_limits at O@std@@2HB
+  ?max_exponent at _Num_base@std@@2HB
+  ?max_length at codecvt_base@std@@QBEHXZ
+  ?min@?$numeric_limits at C@std@@SACXZ
+  ?min@?$numeric_limits at D@std@@SADXZ
+  ?min@?$numeric_limits at E@std@@SAEXZ
+  ?min@?$numeric_limits at F@std@@SAFXZ
+  ?min@?$numeric_limits at G@std@@SAGXZ
+  ?min@?$numeric_limits at H@std@@SAHXZ
+  ?min@?$numeric_limits at I@std@@SAIXZ
+  ?min@?$numeric_limits at J@std@@SAJXZ
+  ?min@?$numeric_limits at K@std@@SAKXZ
+  ?min@?$numeric_limits at M@std@@SAMXZ
+  ?min@?$numeric_limits at N@std@@SANXZ
+  ?min@?$numeric_limits at O@std@@SAOXZ
+  ?min@?$numeric_limits at _J@std@@SA_JXZ
+  ?min@?$numeric_limits at _K@std@@SA_KXZ
+  ?min@?$numeric_limits at _N@std@@SA_NXZ
+  ?min@?$numeric_limits at _W@std@@SA_WXZ
+  ?min_exponent10@?$numeric_limits at M@std@@2HB
+  ?min_exponent10@?$numeric_limits at N@std@@2HB
+  ?min_exponent10@?$numeric_limits at O@std@@2HB
+  ?min_exponent10 at _Num_base@std@@2HB
+  ?min_exponent@?$numeric_limits at M@std@@2HB
+  ?min_exponent@?$numeric_limits at N@std@@2HB
+  ?min_exponent@?$numeric_limits at O@std@@2HB
+  ?min_exponent at _Num_base@std@@2HB
+  ?move@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEX$$QAV12@@Z
+  ?move@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEX$$QAV12@@Z
+  ?move@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEX$$QAV12@@Z
+  ?narrow@?$basic_ios at DU?$char_traits at D@std@@@std@@QBEDDD at Z
+  ?narrow@?$basic_ios at GU?$char_traits at G@std@@@std@@QBEDGD at Z
+  ?narrow@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QBED_WD at Z
+  ?narrow@?$ctype at D@std@@QBEDDD at Z
+  ?narrow@?$ctype at D@std@@QBEPBDPBD0DPAD at Z
+  ?narrow@?$ctype at G@std@@QBEDGD at Z
+  ?narrow@?$ctype at G@std@@QBEPBGPBG0DPAD at Z
+  ?narrow@?$ctype at _W@std@@QBED_WD at Z
+  ?narrow@?$ctype at _W@std@@QBEPB_WPB_W0DPAD at Z
+  ?opfx@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAE_NXZ
+  ?opfx@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAE_NXZ
+  ?opfx@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAE_NXZ
+  ?osfx@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEXXZ
+  ?osfx@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEXXZ
+  ?osfx@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEXXZ
+  ?out@?$codecvt at DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD at Z
+  ?out@?$codecvt at GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD at Z
+  ?out@?$codecvt at _WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD at Z
+  ?overflow@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAEHH at Z
+  ?overflow@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAEGG at Z
+  ?overflow@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAEGG at Z
+  ?pbackfail@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAEHH at Z
+  ?pbackfail@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAEGG at Z
+  ?pbackfail@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAEGG at Z
+  ?pbase@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBEPADXZ
+  ?pbase@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBEPAGXZ
+  ?pbase@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBEPA_WXZ
+  ?pbump@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXH at Z
+  ?pbump@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXH at Z
+  ?pbump@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXH at Z
+  ?peek@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?peek@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEGXZ
+  ?peek@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEGXZ
+  ?pptr@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IBEPADXZ
+  ?pptr@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IBEPAGXZ
+  ?pptr@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IBEPA_WXZ
+  ?precision at ios_base@std@@QAE_J_J at Z
+  ?precision at ios_base@std@@QBE_JXZ
+  ?pubimbue@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE?AVlocale at 2@ABV32@@Z
+  ?pubimbue@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE?AVlocale at 2@ABV32@@Z
+  ?pubimbue@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE?AVlocale at 2@ABV32@@Z
+  ?pubseekoff@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE?AV?$fpos at H@2 at _JHH@Z
+  ?pubseekoff@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE?AV?$fpos at H@2 at _JII@Z
+  ?pubseekoff@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE?AV?$fpos at H@2 at _JHH@Z
+  ?pubseekoff@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE?AV?$fpos at H@2 at _JII@Z
+  ?pubseekoff@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE?AV?$fpos at H@2 at _JHH@Z
+  ?pubseekoff@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE?AV?$fpos at H@2 at _JII@Z
+  ?pubseekpos@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE?AV?$fpos at H@2 at V32@H at Z
+  ?pubseekpos@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE?AV?$fpos at H@2 at V32@I at Z
+  ?pubseekpos@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE?AV?$fpos at H@2 at V32@H at Z
+  ?pubseekpos@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE?AV?$fpos at H@2 at V32@I at Z
+  ?pubseekpos@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE?AV?$fpos at H@2 at V32@H at Z
+  ?pubseekpos@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE?AV?$fpos at H@2 at V32@I at Z
+  ?pubsetbuf@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEPAV12 at PAD_J@Z
+  ?pubsetbuf@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEPAV12 at PAG_J@Z
+  ?pubsetbuf@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEPAV12 at PA_W_J@Z
+  ?pubsync@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?pubsync@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEHXZ
+  ?pubsync@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEHXZ
+  ?put@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV12 at D@Z
+  ?put@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV12 at G@Z
+  ?put@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at _W@Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DJ at Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DK at Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DN at Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DO at Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPBX at Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_J at Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_K at Z
+  ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_N at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GJ at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GK at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GN at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GO at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GPBX at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@G_J at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@G_K at Z
+  ?put@?$num_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@G_N at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WJ at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WK at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WN at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WO at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WPBX at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_W_J at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_W_K at Z
+  ?put@?$num_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_W_N at Z
+  ?put@?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPBUtm@@DD at Z
+  ?put@?$time_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPBUtm@@PBD3 at Z
+  ?put@?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GPBUtm@@DD at Z
+  ?put@?$time_put at GV?$ostreambuf_iterator at GU?$char_traits at G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at GU?$char_traits at G@std@@@2 at V32@AAVios_base at 2@GPBUtm@@PBG3 at Z
+  ?put@?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WPBUtm@@DD at Z
+  ?put@?$time_put at _WV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at _WU?$char_traits at _W@std@@@2 at V32@AAVios_base at 2@_WPBUtm@@PB_W4 at Z
+  ?putback@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at D@Z
+  ?putback@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at G@Z
+  ?putback@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at _W@Z
+  ?pword at ios_base@std@@QAEAAPAXH at Z
+  ?quiet_NaN@?$numeric_limits at C@std@@SACXZ
+  ?quiet_NaN@?$numeric_limits at D@std@@SADXZ
+  ?quiet_NaN@?$numeric_limits at E@std@@SAEXZ
+  ?quiet_NaN@?$numeric_limits at F@std@@SAFXZ
+  ?quiet_NaN@?$numeric_limits at G@std@@SAGXZ
+  ?quiet_NaN@?$numeric_limits at H@std@@SAHXZ
+  ?quiet_NaN@?$numeric_limits at I@std@@SAIXZ
+  ?quiet_NaN@?$numeric_limits at J@std@@SAJXZ
+  ?quiet_NaN@?$numeric_limits at K@std@@SAKXZ
+  ?quiet_NaN@?$numeric_limits at M@std@@SAMXZ
+  ?quiet_NaN@?$numeric_limits at N@std@@SANXZ
+  ?quiet_NaN@?$numeric_limits at O@std@@SAOXZ
+  ?quiet_NaN@?$numeric_limits at _J@std@@SA_JXZ
+  ?quiet_NaN@?$numeric_limits at _K@std@@SA_KXZ
+  ?quiet_NaN@?$numeric_limits at _N@std@@SA_NXZ
+  ?quiet_NaN@?$numeric_limits at _W@std@@SA_WXZ
+  ?radix at _Num_base@std@@2HB
+  ?radix at _Num_float_base@std@@2HB
+  ?radix at _Num_int_base@std@@2HB
+  ?rdbuf@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEPAV?$basic_streambuf at DU?$char_traits at D@std@@@2 at PAV32@@Z
+  ?rdbuf@?$basic_ios at DU?$char_traits at D@std@@@std@@QBEPAV?$basic_streambuf at DU?$char_traits at D@std@@@2 at XZ
+  ?rdbuf@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEPAV?$basic_streambuf at GU?$char_traits at G@std@@@2 at PAV32@@Z
+  ?rdbuf@?$basic_ios at GU?$char_traits at G@std@@@std@@QBEPAV?$basic_streambuf at GU?$char_traits at G@std@@@2 at XZ
+  ?rdbuf@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEPAV?$basic_streambuf at _WU?$char_traits at _W@std@@@2 at PAV32@@Z
+  ?rdbuf@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QBEPAV?$basic_streambuf at _WU?$char_traits at _W@std@@@2 at XZ
+  ?rdstate at ios_base@std@@QBEHXZ
+  ?read@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at PAD_J@Z
+  ?read@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at PAG_J@Z
+  ?read@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at PA_W_J@Z
+  ?readsome@?$basic_istream at DU?$char_traits at D@std@@@std@@QAE_JPAD_J at Z
+  ?readsome@?$basic_istream at GU?$char_traits at G@std@@@std@@QAE_JPAG_J at Z
+  ?readsome@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE_JPA_W_J at Z
+  ?register_callback at ios_base@std@@QAEXP6AXW4event at 12@AAV12 at H@ZH at Z
+  ?resetiosflags at std@@YA?AU?$_Smanip at H@1 at H@Z
+  ?round_error@?$numeric_limits at C@std@@SACXZ
+  ?round_error@?$numeric_limits at D@std@@SADXZ
+  ?round_error@?$numeric_limits at E@std@@SAEXZ
+  ?round_error@?$numeric_limits at F@std@@SAFXZ
+  ?round_error@?$numeric_limits at G@std@@SAGXZ
+  ?round_error@?$numeric_limits at H@std@@SAHXZ
+  ?round_error@?$numeric_limits at I@std@@SAIXZ
+  ?round_error@?$numeric_limits at J@std@@SAJXZ
+  ?round_error@?$numeric_limits at K@std@@SAKXZ
+  ?round_error@?$numeric_limits at M@std@@SAMXZ
+  ?round_error@?$numeric_limits at N@std@@SANXZ
+  ?round_error@?$numeric_limits at O@std@@SAOXZ
+  ?round_error@?$numeric_limits at _J@std@@SA_JXZ
+  ?round_error@?$numeric_limits at _K@std@@SA_KXZ
+  ?round_error@?$numeric_limits at _N@std@@SA_NXZ
+  ?round_error@?$numeric_limits at _W@std@@SA_WXZ
+  ?round_style at _Num_base@std@@2W4float_round_style at 2@B
+  ?round_style at _Num_float_base@std@@2W4float_round_style at 2@B
+  ?sbumpc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?sbumpc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEGXZ
+  ?sbumpc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEGXZ
+  ?scan_is@?$ctype at D@std@@QBEPBDFPBD0 at Z
+  ?scan_is@?$ctype at G@std@@QBEPBGFPBG0 at Z
+  ?scan_is@?$ctype at _W@std@@QBEPB_WFPB_W0 at Z
+  ?scan_not@?$ctype at D@std@@QBEPBDFPBD0 at Z
+  ?scan_not@?$ctype at G@std@@QBEPBGFPBG0 at Z
+  ?scan_not@?$ctype at _W@std@@QBEPB_WFPB_W0 at Z
+  ?seekg@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at V?$fpos at H@2@@Z
+  ?seekg@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at _JH@Z
+  ?seekg@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at V?$fpos at H@2@@Z
+  ?seekg@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at _JH@Z
+  ?seekg@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at V?$fpos at H@2@@Z
+  ?seekg@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at _JH@Z
+  ?seekoff@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAE?AV?$fpos at H@2 at _JHH@Z
+  ?seekoff@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAE?AV?$fpos at H@2 at _JHH@Z
+  ?seekoff@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAE?AV?$fpos at H@2 at _JHH@Z
+  ?seekp@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV12 at V?$fpos at H@2@@Z
+  ?seekp@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV12 at _JH@Z
+  ?seekp@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV12 at V?$fpos at H@2@@Z
+  ?seekp@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV12 at _JH@Z
+  ?seekp@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at V?$fpos at H@2@@Z
+  ?seekp@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at _JH@Z
+  ?seekpos@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAE?AV?$fpos at H@2 at V32@H at Z
+  ?seekpos@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAE?AV?$fpos at H@2 at V32@H at Z
+  ?seekpos@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAE?AV?$fpos at H@2 at V32@H at Z
+  ?set_new_handler at std@@YAP6AXXZH at Z
+  ?set_new_handler at std@@YAP6AXXZP6AXXZ at Z
+  ?set_rdbuf@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEXPAV?$basic_streambuf at DU?$char_traits at D@std@@@2@@Z
+  ?set_rdbuf@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEXPAV?$basic_streambuf at GU?$char_traits at G@std@@@2@@Z
+  ?set_rdbuf@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEXPAV?$basic_streambuf at _WU?$char_traits at _W@std@@@2@@Z
+  ?setbase at std@@YA?AU?$_Smanip at H@1 at H@Z
+  ?setbuf@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAEPAV12 at PAD_J@Z
+  ?setbuf@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAEPAV12 at PAG_J@Z
+  ?setbuf@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAEPAV12 at PA_W_J@Z
+  ?setf at ios_base@std@@QAEHH at Z
+  ?setf at ios_base@std@@QAEHHH at Z
+  ?setg@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXPAD00 at Z
+  ?setg@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXPAG00 at Z
+  ?setg@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXPA_W00 at Z
+  ?setiosflags at std@@YA?AU?$_Smanip at H@1 at H@Z
+  ?setp@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXPAD00 at Z
+  ?setp@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXPAD0 at Z
+  ?setp@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXPAG00 at Z
+  ?setp@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXPAG0 at Z
+  ?setp@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXPA_W00 at Z
+  ?setp@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXPA_W0 at Z
+  ?setprecision at std@@YA?AU?$_Smanip at _J@1 at _J@Z
+  ?setstate@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEXH_N at Z
+  ?setstate@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEXI at Z
+  ?setstate@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEXH_N at Z
+  ?setstate@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEXI at Z
+  ?setstate@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEXH_N at Z
+  ?setstate@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEXI at Z
+  ?setstate at ios_base@std@@QAEXH at Z
+  ?setstate at ios_base@std@@QAEXH_N at Z
+  ?setstate at ios_base@std@@QAEXI at Z
+  ?setw at std@@YA?AU?$_Smanip at _J@1 at _J@Z
+  ?sgetc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?sgetc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEGXZ
+  ?sgetc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEGXZ
+  ?sgetn@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE_JPAD_J at Z
+  ?sgetn@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE_JPAG_J at Z
+  ?sgetn@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE_JPA_W_J at Z
+  ?showmanyc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAE_JXZ
+  ?showmanyc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAE_JXZ
+  ?showmanyc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAE_JXZ
+  ?signaling_NaN@?$numeric_limits at C@std@@SACXZ
+  ?signaling_NaN@?$numeric_limits at D@std@@SADXZ
+  ?signaling_NaN@?$numeric_limits at E@std@@SAEXZ
+  ?signaling_NaN@?$numeric_limits at F@std@@SAFXZ
+  ?signaling_NaN@?$numeric_limits at G@std@@SAGXZ
+  ?signaling_NaN@?$numeric_limits at H@std@@SAHXZ
+  ?signaling_NaN@?$numeric_limits at I@std@@SAIXZ
+  ?signaling_NaN@?$numeric_limits at J@std@@SAJXZ
+  ?signaling_NaN@?$numeric_limits at K@std@@SAKXZ
+  ?signaling_NaN@?$numeric_limits at M@std@@SAMXZ
+  ?signaling_NaN@?$numeric_limits at N@std@@SANXZ
+  ?signaling_NaN@?$numeric_limits at O@std@@SAOXZ
+  ?signaling_NaN@?$numeric_limits at _J@std@@SA_JXZ
+  ?signaling_NaN@?$numeric_limits at _K@std@@SA_KXZ
+  ?signaling_NaN@?$numeric_limits at _N@std@@SA_NXZ
+  ?signaling_NaN@?$numeric_limits at _W@std@@SA_WXZ
+  ?snextc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?snextc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEGXZ
+  ?snextc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEGXZ
+  ?sputbackc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEHD at Z
+  ?sputbackc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEGG at Z
+  ?sputbackc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEG_W at Z
+  ?sputc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEHD at Z
+  ?sputc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEGG at Z
+  ?sputc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEG_W at Z
+  ?sputn@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAE_JPBD_J at Z
+  ?sputn@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAE_JPBG_J at Z
+  ?sputn@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAE_JPB_W_J at Z
+  ?start at agent@Concurrency@@QAE_NXZ
+  ?status at agent@Concurrency@@QAE?AW4agent_status at 2@XZ
+  ?status_port at agent@Concurrency@@QAEPAV?$ISource at W4agent_status@Concurrency@@@2 at XZ
+  ?stossc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEXXZ
+  ?stossc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEXXZ
+  ?stossc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEXXZ
+  ?sungetc@?$basic_streambuf at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?sungetc@?$basic_streambuf at GU?$char_traits at G@std@@@std@@QAEGXZ
+  ?sungetc@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@QAEGXZ
+  ?swap@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_iostream at DU?$char_traits at D@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_iostream at GU?$char_traits at G@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_iostream at _WU?$char_traits at _W@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEXAAV12@@Z
+  ?swap@?$basic_streambuf at DU?$char_traits at D@std@@@std@@IAEXAAV12@@Z
+  ?swap@?$basic_streambuf at GU?$char_traits at G@std@@@std@@IAEXAAV12@@Z
+  ?swap@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@IAEXAAV12@@Z
+  ?swap at ios_base@std@@QAEXAAV12@@Z
+  ?sync@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEHXZ
+  ?sync@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEHXZ
+  ?sync@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEHXZ
+  ?sync@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAEHXZ
+  ?sync@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAEHXZ
+  ?sync@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAEHXZ
+  ?sync_with_stdio at ios_base@std@@SA_N_N at Z
+  ?system_category at std@@YAABVerror_category at 1@XZ
+  ?table@?$ctype at D@std@@QBEPBFXZ
+  ?table_size@?$ctype at D@std@@2IB
+  ?tellg@?$basic_istream at DU?$char_traits at D@std@@@std@@QAE?AV?$fpos at H@2 at XZ
+  ?tellg@?$basic_istream at GU?$char_traits at G@std@@@std@@QAE?AV?$fpos at H@2 at XZ
+  ?tellg@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAE?AV?$fpos at H@2 at XZ
+  ?tellp@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAE?AV?$fpos at H@2 at XZ
+  ?tellp@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAE?AV?$fpos at H@2 at XZ
+  ?tellp@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAE?AV?$fpos at H@2 at XZ
+  ?tie@?$basic_ios at DU?$char_traits at D@std@@@std@@QAEPAV?$basic_ostream at DU?$char_traits at D@std@@@2 at PAV32@@Z
+  ?tie@?$basic_ios at DU?$char_traits at D@std@@@std@@QBEPAV?$basic_ostream at DU?$char_traits at D@std@@@2 at XZ
+  ?tie@?$basic_ios at GU?$char_traits at G@std@@@std@@QAEPAV?$basic_ostream at GU?$char_traits at G@std@@@2 at PAV32@@Z
+  ?tie@?$basic_ios at GU?$char_traits at G@std@@@std@@QBEPAV?$basic_ostream at GU?$char_traits at G@std@@@2 at XZ
+  ?tie@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QAEPAV?$basic_ostream at _WU?$char_traits at _W@std@@@2 at PAV32@@Z
+  ?tie@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QBEPAV?$basic_ostream at _WU?$char_traits at _W@std@@@2 at XZ
+  ?tinyness_before at _Num_base@std@@2_NB
+  ?tinyness_before at _Num_float_base@std@@2_NB
+  ?tolower@?$ctype at D@std@@QBEDD at Z
+  ?tolower@?$ctype at D@std@@QBEPBDPADPBD at Z
+  ?tolower@?$ctype at G@std@@QBEGG at Z
+  ?tolower@?$ctype at G@std@@QBEPBGPAGPBG at Z
+  ?tolower@?$ctype at _W@std@@QBEPB_WPA_WPB_W at Z
+  ?tolower@?$ctype at _W@std@@QBE_W_W at Z
+  ?toupper@?$ctype at D@std@@QBEDD at Z
+  ?toupper@?$ctype at D@std@@QBEPBDPADPBD at Z
+  ?toupper@?$ctype at G@std@@QBEGG at Z
+  ?toupper@?$ctype at G@std@@QBEPBGPAGPBG at Z
+  ?toupper@?$ctype at _W@std@@QBEPB_WPA_WPB_W at Z
+  ?toupper@?$ctype at _W@std@@QBE_W_W at Z
+  ?traps at _Num_base@std@@2_NB
+  ?traps at _Num_float_base@std@@2_NB
+  ?uflow@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAEHXZ
+  ?uflow@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAEGXZ
+  ?uflow@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAEGXZ
+  ?uncaught_exception at std@@YA_NXZ
+  ?underflow@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAEHXZ
+  ?underflow@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAEGXZ
+  ?underflow@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAEGXZ
+  ?unget@?$basic_istream at DU?$char_traits at D@std@@@std@@QAEAAV12 at XZ
+  ?unget@?$basic_istream at GU?$char_traits at G@std@@@std@@QAEAAV12 at XZ
+  ?unget@?$basic_istream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at XZ
+  ?unsetf at ios_base@std@@QAEXH at Z
+  ?unshift@?$codecvt at DDH@std@@QBEHAAHPAD1AAPAD at Z
+  ?unshift@?$codecvt at GDH@std@@QBEHAAHPAD1AAPAD at Z
+  ?unshift@?$codecvt at _WDH@std@@QBEHAAHPAD1AAPAD at Z
+  ?wait at agent@Concurrency@@SA?AW4agent_status at 2@PAV12 at I@Z
+  ?wait_for_all at agent@Concurrency@@SAXIPAPAV12 at PAW4agent_status@2 at I@Z
+  ?wait_for_one at agent@Concurrency@@SAXIPAPAV12 at AAW4agent_status@2 at AAII@Z
+  ?wcerr at std@@3V?$basic_ostream at GU?$char_traits at G@std@@@1 at A
+  ?wcerr at std@@3V?$basic_ostream at _WU?$char_traits at _W@std@@@1 at A
+  ?wcin at std@@3V?$basic_istream at GU?$char_traits at G@std@@@1 at A
+  ?wcin at std@@3V?$basic_istream at _WU?$char_traits at _W@std@@@1 at A
+  ?wclog at std@@3V?$basic_ostream at GU?$char_traits at G@std@@@1 at A
+  ?wclog at std@@3V?$basic_ostream at _WU?$char_traits at _W@std@@@1 at A
+  ?wcout at std@@3V?$basic_ostream at GU?$char_traits at G@std@@@1 at A
+  ?wcout at std@@3V?$basic_ostream at _WU?$char_traits at _W@std@@@1 at A
+  ?widen@?$basic_ios at DU?$char_traits at D@std@@@std@@QBEDD at Z
+  ?widen@?$basic_ios at GU?$char_traits at G@std@@@std@@QBEGD at Z
+  ?widen@?$basic_ios at _WU?$char_traits at _W@std@@@std@@QBE_WD at Z
+  ?widen@?$ctype at D@std@@QBEDD at Z
+  ?widen@?$ctype at D@std@@QBEPBDPBD0PAD at Z
+  ?widen@?$ctype at G@std@@QBEGD at Z
+  ?widen@?$ctype at G@std@@QBEPBDPBD0PAG at Z
+  ?widen@?$ctype at _W@std@@QBEPBDPBD0PA_W at Z
+  ?widen@?$ctype at _W@std@@QBE_WD at Z
+  ?width at ios_base@std@@QAE_J_J at Z
+  ?width at ios_base@std@@QBE_JXZ
+  ?write@?$basic_ostream at DU?$char_traits at D@std@@@std@@QAEAAV12 at PBD_J@Z
+  ?write@?$basic_ostream at GU?$char_traits at G@std@@@std@@QAEAAV12 at PBG_J@Z
+  ?write@?$basic_ostream at _WU?$char_traits at _W@std@@@std@@QAEAAV12 at PB_W_J@Z
+  ?ws at std@@YAAAV?$basic_istream at DU?$char_traits at D@std@@@1 at AAV21@@Z
+  ?ws at std@@YAAAV?$basic_istream at GU?$char_traits at G@std@@@1 at AAV21@@Z
+  ?ws at std@@YAAAV?$basic_istream at _WU?$char_traits at _W@std@@@1 at AAV21@@Z
+  ?xalloc at ios_base@std@@SAHXZ
+  ?xsgetn@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAE_JPAD_J at Z
+  ?xsgetn@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAE_JPAG_J at Z
+  ?xsgetn@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAE_JPA_W_J at Z
+  ?xsputn@?$basic_streambuf at DU?$char_traits at D@std@@@std@@MAE_JPBD_J at Z
+  ?xsputn@?$basic_streambuf at GU?$char_traits at G@std@@@std@@MAE_JPBG_J at Z
+  ?xsputn@?$basic_streambuf at _WU?$char_traits at _W@std@@@std@@MAE_JPB_W_J at Z
+  _Cosh
+  _Denorm
+  _Dnorm
+  _Dscale
+  _Dtest
+  _Eps
+  _Exp
+  _FCosh
+  _FDenorm
+  _FDnorm
+  _FDscale
+  _FDtest
+  _FEps
+  _FExp
+  _FInf
+  _FNan
+  _FRteps
+  _FSinh
+  _FSnan
+  _FXbig
+  _GetLocaleForCP
+  _Getcoll
+  _Getctype
+  _Getcvt
+  _Getdateorder
+  _Getwctype
+  _Getwctypes
+  _Hugeval
+  _Inf
+  _LCosh
+  _LDenorm
+  _LDscale
+  _LDtest
+  _LEps
+  _LExp
+  _LInf
+  _LNan
+  _LPoly
+  _LRteps
+  _LSinh
+  _LSnan
+  _LXbig
+  _LZero
+  _Mbrtowc
+  _Mtxdst
+  _Mtxinit
+  _Mtxlock
+  _Mtxunlock
+  _Nan
+  _Once
+  _Poly
+  _Rteps
+  _Sinh
+  _Snan
+  _Stod
+  _Stodx
+  _Stof
+  _Stofx
+  _Stold
+  _Stoldx
+  _Stoll
+  _Stollx
+  _Stolx
+  _Stoul
+  _Stoull
+  _Stoullx
+  _Stoulx
+  _Strcoll
+  _Strxfrm
+  _Tolower
+  _Toupper
+  _Towlower
+  _Towupper
+  _Wcrtomb
+  _Wcscoll
+  _Wcsxfrm
+  _Xbig
+  __Wcrtomb_lk
+  towctrans
+  wctrans
+  wctype
+
diff --git a/src/VBox/Runtime/r3/win/VBoxRT-msvcr100-win32.def b/src/VBox/Runtime/r3/win/VBoxRT-msvcr100-win32.def
new file mode 100644
index 0000000..eb52122
--- /dev/null
+++ b/src/VBox/Runtime/r3/win/VBoxRT-msvcr100-win32.def
@@ -0,0 +1,1641 @@
+
+  ;
+  _except_handler4
+  ;_heap_init
+  ;__crtExitProcess
+  ;_NMSG_WRITE
+  ;_FF_MSGBANNER
+  ;_cinit
+  ;_setenvp
+  ;__crtGetEnvironmentStringsA
+  ;_ioinit
+  ;_mtinit
+
+  _initterm=my_initterm
+  __dllonexit=my_dllonexit
+  __getmainargs=my_getmainargs
+  __setusermatherr=my_setusermatherr
+
+  _onexit DATA ; the one is crazy. atonexit.obj in msvcrt.lib which calls the __imp___onexit directly.
+
+  ; MSVCR100.DLL exports
+  ??0?$_SpinWait@$0A@@details at Concurrency@@QAE at P6AXXZ@Z
+  ??0SchedulerPolicy at Concurrency@@QAA at IZZ
+  ??0SchedulerPolicy at Concurrency@@QAE at ABV01@@Z
+  ??0SchedulerPolicy at Concurrency@@QAE at XZ
+  ??0_NonReentrantBlockingLock at details@Concurrency@@QAE at XZ
+  ??0_NonReentrantPPLLock at details@Concurrency@@QAE at XZ
+  ??0_ReaderWriterLock at details@Concurrency@@QAE at XZ
+  ??0_ReentrantBlockingLock at details@Concurrency@@QAE at XZ
+  ??0_ReentrantLock at details@Concurrency@@QAE at XZ
+  ??0_ReentrantPPLLock at details@Concurrency@@QAE at XZ
+  ??0_Scoped_lock at _NonReentrantPPLLock@details at Concurrency@@QAE at AAV123@@Z
+  ??0_Scoped_lock at _ReentrantPPLLock@details at Concurrency@@QAE at AAV123@@Z
+  ??0_SpinLock at details@Concurrency@@QAE at ACJ@Z
+  ??0_TaskCollection at details@Concurrency@@QAE at XZ
+  ??0_Timer at details@Concurrency@@IAE at I_N@Z
+  ??0__non_rtti_object at std@@QAE at ABV01@@Z
+  ??0__non_rtti_object at std@@QAE at PBD@Z
+  ;fixme-not-in-libcmt.lib; ??0bad_cast at std@@AAE at PBQBD@Z
+  ??0bad_cast at std@@QAE at ABV01@@Z
+  ??0bad_cast at std@@QAE at PBD@Z
+  ??0bad_target at Concurrency@@QAE at PBD@Z
+  ??0bad_target at Concurrency@@QAE at XZ
+  ??0bad_typeid at std@@QAE at ABV01@@Z
+  ??0bad_typeid at std@@QAE at PBD@Z
+  ??0context_self_unblock at Concurrency@@QAE at PBD@Z
+  ??0context_self_unblock at Concurrency@@QAE at XZ
+  ??0context_unblock_unbalanced at Concurrency@@QAE at PBD@Z
+  ??0context_unblock_unbalanced at Concurrency@@QAE at XZ
+  ??0critical_section at Concurrency@@QAE at XZ
+  ??0default_scheduler_exists at Concurrency@@QAE at PBD@Z
+  ??0default_scheduler_exists at Concurrency@@QAE at XZ
+  ??0event at Concurrency@@QAE at XZ
+  ??0exception at std@@QAE at ABQBD@Z
+  ??0exception at std@@QAE at ABQBDH@Z
+  ??0exception at std@@QAE at ABV01@@Z
+  ??0exception at std@@QAE at XZ
+  ??0improper_lock at Concurrency@@QAE at PBD@Z
+  ??0improper_lock at Concurrency@@QAE at XZ
+  ??0improper_scheduler_attach at Concurrency@@QAE at PBD@Z
+  ??0improper_scheduler_attach at Concurrency@@QAE at XZ
+  ??0improper_scheduler_detach at Concurrency@@QAE at PBD@Z
+  ??0improper_scheduler_detach at Concurrency@@QAE at XZ
+  ??0improper_scheduler_reference at Concurrency@@QAE at PBD@Z
+  ??0improper_scheduler_reference at Concurrency@@QAE at XZ
+  ??0invalid_link_target at Concurrency@@QAE at PBD@Z
+  ??0invalid_link_target at Concurrency@@QAE at XZ
+  ??0invalid_multiple_scheduling at Concurrency@@QAE at PBD@Z
+  ??0invalid_multiple_scheduling at Concurrency@@QAE at XZ
+  ??0invalid_operation at Concurrency@@QAE at PBD@Z
+  ??0invalid_operation at Concurrency@@QAE at XZ
+  ??0invalid_oversubscribe_operation at Concurrency@@QAE at PBD@Z
+  ??0invalid_oversubscribe_operation at Concurrency@@QAE at XZ
+  ??0invalid_scheduler_policy_key at Concurrency@@QAE at PBD@Z
+  ??0invalid_scheduler_policy_key at Concurrency@@QAE at XZ
+  ??0invalid_scheduler_policy_thread_specification at Concurrency@@QAE at PBD@Z
+  ??0invalid_scheduler_policy_thread_specification at Concurrency@@QAE at XZ
+  ??0invalid_scheduler_policy_value at Concurrency@@QAE at PBD@Z
+  ??0invalid_scheduler_policy_value at Concurrency@@QAE at XZ
+  ??0message_not_found at Concurrency@@QAE at PBD@Z
+  ??0message_not_found at Concurrency@@QAE at XZ
+  ??0missing_wait at Concurrency@@QAE at PBD@Z
+  ??0missing_wait at Concurrency@@QAE at XZ
+  ??0nested_scheduler_missing_detach at Concurrency@@QAE at PBD@Z
+  ??0nested_scheduler_missing_detach at Concurrency@@QAE at XZ
+  ??0operation_timed_out at Concurrency@@QAE at PBD@Z
+  ??0operation_timed_out at Concurrency@@QAE at XZ
+  ??0reader_writer_lock at Concurrency@@QAE at XZ
+  ??0scheduler_not_attached at Concurrency@@QAE at PBD@Z
+  ??0scheduler_not_attached at Concurrency@@QAE at XZ
+  ??0scheduler_resource_allocation_error at Concurrency@@QAE at J@Z
+  ??0scheduler_resource_allocation_error at Concurrency@@QAE at PBDJ@Z
+  ??0scoped_lock at critical_section@Concurrency@@QAE at AAV12@@Z
+  ??0scoped_lock at reader_writer_lock@Concurrency@@QAE at AAV12@@Z
+  ??0scoped_lock_read at reader_writer_lock@Concurrency@@QAE at AAV12@@Z
+  ??0task_canceled at details@Concurrency@@QAE at PBD@Z
+  ??0task_canceled at details@Concurrency@@QAE at XZ
+  ??0unsupported_os at Concurrency@@QAE at PBD@Z
+  ??0unsupported_os at Concurrency@@QAE at XZ
+  ??1SchedulerPolicy at Concurrency@@QAE at XZ
+  ??1_NonReentrantBlockingLock at details@Concurrency@@QAE at XZ
+  ??1_ReentrantBlockingLock at details@Concurrency@@QAE at XZ
+  ??1_Scoped_lock at _NonReentrantPPLLock@details at Concurrency@@QAE at XZ
+  ??1_Scoped_lock at _ReentrantPPLLock@details at Concurrency@@QAE at XZ
+  ??1_SpinLock at details@Concurrency@@QAE at XZ
+  ??1_TaskCollection at details@Concurrency@@QAE at XZ
+  ??1_Timer at details@Concurrency@@IAE at XZ
+  ??1__non_rtti_object at std@@UAE at XZ
+  ??1bad_cast at std@@UAE at XZ
+  ??1bad_typeid at std@@UAE at XZ
+  ??1critical_section at Concurrency@@QAE at XZ
+  ??1event at Concurrency@@QAE at XZ
+  ??1exception at std@@UAE at XZ
+  ??1reader_writer_lock at Concurrency@@QAE at XZ
+  ??1scoped_lock at critical_section@Concurrency@@QAE at XZ
+  ??1scoped_lock at reader_writer_lock@Concurrency@@QAE at XZ
+  ??1scoped_lock_read at reader_writer_lock@Concurrency@@QAE at XZ
+  ??1type_info@@UAE at XZ
+  ??2 at YAPAXI@Z
+  ??2 at YAPAXIHPBDH@Z
+  ??3 at YAXPAX@Z
+  ;fixme-not-in-libcmt.lib; ??4?$_SpinWait@$00 at details@Concurrency@@QAEAAV012 at ABV012@@Z
+  ;fixme-not-in-libcmt.lib; ??4?$_SpinWait@$0A@@details at Concurrency@@QAEAAV012 at ABV012@@Z
+  ??4SchedulerPolicy at Concurrency@@QAEAAV01 at ABV01@@Z
+  ??4__non_rtti_object at std@@QAEAAV01 at ABV01@@Z
+  ??4bad_cast at std@@QAEAAV01 at ABV01@@Z
+  ??4bad_typeid at std@@QAEAAV01 at ABV01@@Z
+  ??4exception at std@@QAEAAV01 at ABV01@@Z
+  ??8type_info@@QBE_NABV0@@Z
+  ??9type_info@@QBE_NABV0@@Z
+  ??_7__non_rtti_object at std@@6B@
+  ??_7bad_cast at std@@6B@
+  ??_7bad_typeid at std@@6B@
+  ;fixme-not-in-libcmt.lib; ??_7exception@@6B@
+  ??_7exception at std@@6B@
+  ;fixme-not-in-libcmt.lib; ??_F?$_SpinWait@$00 at details@Concurrency@@QAEXXZ
+  ;fixme-not-in-libcmt.lib; ??_F?$_SpinWait@$0A@@details at Concurrency@@QAEXXZ
+  ??_Fbad_cast at std@@QAEXXZ
+  ??_Fbad_typeid at std@@QAEXXZ
+  ??_U at YAPAXI@Z
+  ??_U at YAPAXIHPBDH@Z
+  ??_V at YAXPAX@Z
+  ?Alloc at Concurrency@@YAPAXI at Z
+  ?Block at Context@Concurrency@@SAXXZ
+  ?Create at CurrentScheduler@Concurrency@@SAXABVSchedulerPolicy at 2@@Z
+  ?Create at Scheduler@Concurrency@@SAPAV12 at ABVSchedulerPolicy@2@@Z
+  ?CreateResourceManager at Concurrency@@YAPAUIResourceManager at 1@XZ
+  ?CreateScheduleGroup at CurrentScheduler@Concurrency@@SAPAVScheduleGroup at 2@XZ
+  ?CurrentContext at Context@Concurrency@@SAPAV12 at XZ
+  ?Detach at CurrentScheduler@Concurrency@@SAXXZ
+  ?DisableTracing at Concurrency@@YAJXZ
+  ?EnableTracing at Concurrency@@YAJXZ
+  ?Free at Concurrency@@YAXPAX at Z
+  ?Get at CurrentScheduler@Concurrency@@SAPAVScheduler at 2@XZ
+  ?GetExecutionContextId at Concurrency@@YAIXZ
+  ?GetNumberOfVirtualProcessors at CurrentScheduler@Concurrency@@SAIXZ
+  ?GetOSVersion at Concurrency@@YA?AW4OSVersion at IResourceManager@1 at XZ
+  ?GetPolicy at CurrentScheduler@Concurrency@@SA?AVSchedulerPolicy at 2@XZ
+  ?GetPolicyValue at SchedulerPolicy@Concurrency@@QBEIW4PolicyElementKey at 2@@Z
+  ?GetProcessorCount at Concurrency@@YAIXZ
+  ?GetProcessorNodeCount at Concurrency@@YAIXZ
+  ?GetSchedulerId at Concurrency@@YAIXZ
+  ?GetSharedTimerQueue at details@Concurrency@@YAPAXXZ
+  ?Id at Context@Concurrency@@SAIXZ
+  ?Id at CurrentScheduler@Concurrency@@SAIXZ
+  ?IsCurrentTaskCollectionCanceling at Context@Concurrency@@SA_NXZ
+  ?Log2 at details@Concurrency@@YAKI at Z
+  ?Oversubscribe at Context@Concurrency@@SAX_N at Z
+  ?RegisterShutdownEvent at CurrentScheduler@Concurrency@@SAXPAX at Z
+  ?ResetDefaultSchedulerPolicy at Scheduler@Concurrency@@SAXXZ
+  ?ScheduleGroupId at Context@Concurrency@@SAIXZ
+  ?ScheduleTask at CurrentScheduler@Concurrency@@SAXP6AXPAX at Z0@Z
+  ?SetConcurrencyLimits at SchedulerPolicy@Concurrency@@QAEXII at Z
+  ?SetDefaultSchedulerPolicy at Scheduler@Concurrency@@SAXABVSchedulerPolicy at 2@@Z
+  ?SetPolicyValue at SchedulerPolicy@Concurrency@@QAEIW4PolicyElementKey at 2@I at Z
+  ?VirtualProcessorId at Context@Concurrency@@SAIXZ
+  ?Yield at Context@Concurrency@@SAXXZ
+  ?_Abort at _StructuredTaskCollection@details at Concurrency@@AAEXXZ
+  ?_Acquire at _NonReentrantBlockingLock@details at Concurrency@@QAEXXZ
+  ?_Acquire at _NonReentrantPPLLock@details at Concurrency@@QAEXPAX at Z
+  ?_Acquire at _ReentrantBlockingLock@details at Concurrency@@QAEXXZ
+  ?_Acquire at _ReentrantLock@details at Concurrency@@QAEXXZ
+  ?_Acquire at _ReentrantPPLLock@details at Concurrency@@QAEXPAX at Z
+  ?_AcquireRead at _ReaderWriterLock@details at Concurrency@@QAEXXZ
+  ?_AcquireWrite at _ReaderWriterLock@details at Concurrency@@QAEXXZ
+  ?_Cancel at _StructuredTaskCollection@details at Concurrency@@QAEXXZ
+  ?_Cancel at _TaskCollection@details at Concurrency@@QAEXXZ
+  ?_CheckTaskCollection at _UnrealizedChore@details at Concurrency@@IAEXXZ
+  ?_ConcRT_Assert at details@Concurrency@@YAXPBD0H at Z
+  ?_ConcRT_CoreAssert at details@Concurrency@@YAXPBD0H at Z
+  ?_ConcRT_DumpMessage at details@Concurrency@@YAXPB_WZZ
+  ?_ConcRT_Trace at details@Concurrency@@YAXHPB_WZZ
+  ?_Copy_str at exception@std@@AAEXPBD at Z
+  ?_DoYield@?$_SpinWait@$00 at details@Concurrency@@IAEXXZ
+  ?_DoYield@?$_SpinWait@$0A@@details at Concurrency@@IAEXXZ
+  ?_IsCanceling at _StructuredTaskCollection@details at Concurrency@@QAE_NXZ
+  ?_IsCanceling at _TaskCollection@details at Concurrency@@QAE_NXZ
+  ?_Name_base at type_info@@CAPBDPBV1 at PAU__type_info_node@@@Z
+  ?_Name_base_internal at type_info@@CAPBDPBV1 at PAU__type_info_node@@@Z
+  ?_NumberOfSpins@?$_SpinWait@$00 at details@Concurrency@@IAEKXZ
+  ?_NumberOfSpins@?$_SpinWait@$0A@@details at Concurrency@@IAEKXZ
+  ?_Release at _NonReentrantBlockingLock@details at Concurrency@@QAEXXZ
+  ?_Release at _NonReentrantPPLLock@details at Concurrency@@QAEXXZ
+  ?_Release at _ReentrantBlockingLock@details at Concurrency@@QAEXXZ
+  ?_Release at _ReentrantLock@details at Concurrency@@QAEXXZ
+  ?_Release at _ReentrantPPLLock@details at Concurrency@@QAEXXZ
+  ?_ReleaseRead at _ReaderWriterLock@details at Concurrency@@QAEXXZ
+  ?_ReleaseWrite at _ReaderWriterLock@details at Concurrency@@QAEXXZ
+  ?_Reset@?$_SpinWait@$00 at details@Concurrency@@IAEXXZ
+  ?_Reset@?$_SpinWait@$0A@@details at Concurrency@@IAEXXZ
+  ?_RunAndWait at _StructuredTaskCollection@details at Concurrency@@QAG?AW4_TaskCollectionStatus at 23@PAV_UnrealizedChore at 23@@Z
+  ?_RunAndWait at _TaskCollection@details at Concurrency@@QAG?AW4_TaskCollectionStatus at 23@PAV_UnrealizedChore at 23@@Z
+  ?_Schedule at _StructuredTaskCollection@details at Concurrency@@QAEXPAV_UnrealizedChore at 23@@Z
+  ?_Schedule at _TaskCollection@details at Concurrency@@QAEXPAV_UnrealizedChore at 23@@Z
+  ?_SetSpinCount@?$_SpinWait@$00 at details@Concurrency@@QAEXI at Z
+  ?_SetSpinCount@?$_SpinWait@$0A@@details at Concurrency@@QAEXI at Z
+  ?_ShouldSpinAgain@?$_SpinWait@$00 at details@Concurrency@@IAE_NXZ
+  ?_ShouldSpinAgain@?$_SpinWait@$0A@@details at Concurrency@@IAE_NXZ
+  ?_SpinOnce@?$_SpinWait@$00 at details@Concurrency@@QAE_NXZ
+  ?_SpinOnce@?$_SpinWait@$0A@@details at Concurrency@@QAE_NXZ
+  ?_SpinYield at Context@Concurrency@@SAXXZ
+  ?_Start at _Timer@details at Concurrency@@IAEXXZ
+  ?_Stop at _Timer@details at Concurrency@@IAEXXZ
+  ?_Tidy at exception@std@@AAEXXZ
+  ?_Trace_ppl_function at Concurrency@@YAXABU_GUID@@EW4ConcRT_EventType at 1@@Z
+  ?_TryAcquire at _NonReentrantBlockingLock@details at Concurrency@@QAE_NXZ
+  ?_TryAcquire at _ReentrantBlockingLock@details at Concurrency@@QAE_NXZ
+  ?_TryAcquire at _ReentrantLock@details at Concurrency@@QAE_NXZ
+  ?_TryAcquireWrite at _ReaderWriterLock@details at Concurrency@@QAE_NXZ
+  ?_Type_info_dtor at type_info@@CAXPAV1@@Z
+  ?_Type_info_dtor_internal at type_info@@CAXPAV1@@Z
+  ?_UnderlyingYield at details@Concurrency@@YAXXZ
+  ?_ValidateExecute@@YAHP6GHXZ at Z
+  ?_ValidateRead@@YAHPBXI at Z
+  ?_ValidateWrite@@YAHPAXI at Z
+  ?_Value at _SpinCount@details at Concurrency@@SAIXZ
+  ?__ExceptionPtrAssign@@YAXPAXPBX at Z
+  ?__ExceptionPtrCompare@@YA_NPBX0 at Z
+  ?__ExceptionPtrCopy@@YAXPAXPBX at Z
+  ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
+  ?__ExceptionPtrCreate@@YAXPAX at Z
+  ?__ExceptionPtrCurrentException@@YAXPAX at Z
+  ?__ExceptionPtrDestroy@@YAXPAX at Z
+  ?__ExceptionPtrRethrow@@YAXPBX at Z
+  __uncaught_exception
+  ?_inconsistency@@YAXXZ
+  ?_invalid_parameter@@YAXPBG00II at Z
+  ?_is_exception_typeof@@YAHABVtype_info@@PAU_EXCEPTION_POINTERS@@@Z
+  ?_name_internal_method at type_info@@QBEPBDPAU__type_info_node@@@Z
+  ?_open@@YAHPBDHH at Z
+  ?_query_new_handler@@YAP6AHI at ZXZ
+  ?_query_new_mode@@YAHXZ
+  ?_set_new_handler@@YAP6AHI at ZH@Z
+  ?_set_new_handler@@YAP6AHI at ZP6AHI@Z at Z
+  ?_set_new_mode@@YAHH at Z
+  ?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZH at Z
+  ?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0 at Z@Z
+  ?_sopen@@YAHPBDHHH at Z
+  ?_type_info_dtor_internal_method at type_info@@QAEXXZ
+  ?_wopen@@YAHPB_WHH at Z
+  ?_wsopen@@YAHPB_WHHH at Z
+  ?before at type_info@@QBEHABV1@@Z
+  ?get_error_code at scheduler_resource_allocation_error@Concurrency@@QBEJXZ
+  ?lock at critical_section@Concurrency@@QAEXXZ
+  ?lock at reader_writer_lock@Concurrency@@QAEXXZ
+  ?lock_read at reader_writer_lock@Concurrency@@QAEXXZ
+  ?name at type_info@@QBEPBDPAU__type_info_node@@@Z
+  ?native_handle at critical_section@Concurrency@@QAEAAV12 at XZ
+  ?raw_name at type_info@@QBEPBDXZ
+  ?reset at event@Concurrency@@QAEXXZ
+  ?set at event@Concurrency@@QAEXXZ
+  ?set_new_handler@@YAP6AXXZP6AXXZ at Z
+  ?set_terminate@@YAP6AXXZH at Z
+  ?set_terminate@@YAP6AXXZP6AXXZ at Z
+  ?set_unexpected@@YAP6AXXZH at Z
+  ?set_unexpected@@YAP6AXXZP6AXXZ at Z
+  ?swprintf@@YAHPAGIPBGZZ
+  ?swprintf@@YAHPA_WIPB_WZZ
+  ?terminate@@YAXXZ ;fixme-causes-trouble-with-version-in-libcmt.lib; 
+  ?try_lock at critical_section@Concurrency@@QAE_NXZ
+  ?try_lock at reader_writer_lock@Concurrency@@QAE_NXZ
+  ?try_lock_read at reader_writer_lock@Concurrency@@QAE_NXZ
+  ?unexpected@@YAXXZ
+  ?unlock at critical_section@Concurrency@@QAEXXZ
+  ?unlock at reader_writer_lock@Concurrency@@QAEXXZ
+  ?vswprintf@@YAHPA_WIPB_WPAD at Z
+  ?wait at Concurrency@@YAXI at Z
+  ?wait at event@Concurrency@@QAEII at Z
+  ?wait_for_multiple at event@Concurrency@@SAIPAPAV12 at I_NI@Z
+  ?what at exception@std@@UBEPBDXZ
+  $I10_OUTPUT
+  _CIacos
+  _CIasin
+  _CIatan
+  _CIatan2
+  _CIcos
+  _CIcosh
+  _CIexp
+  _CIfmod
+  _CIlog
+  _CIlog10
+  _CIpow
+  _CIsin
+  _CIsinh
+  _CIsqrt
+  _CItan
+  _CItanh
+  _CRT_RTC_INIT
+  _CRT_RTC_INITW
+  _CreateFrameInfo
+  _CxxThrowException
+  _EH_prolog
+  _FindAndUnlinkFrame
+  _Getdays
+  _Getmonths
+  _Gettnames
+  _HUGE
+  _IsExceptionObjectToBeDestroyed
+  _NLG_Dispatch2
+  _NLG_Return
+  _NLG_Return2
+  _Strftime
+  _XcptFilter
+  __AdjustPointer
+  __BuildCatchObject
+  __BuildCatchObjectHelper
+  __CppXcptFilter
+  __CxxCallUnwindDelDtor
+  __CxxCallUnwindDtor
+  __CxxCallUnwindStdDelDtor
+  __CxxCallUnwindVecDtor
+  __CxxDetectRethrow
+  __CxxExceptionFilter
+  __CxxFrameHandler
+  __CxxFrameHandler2
+  __CxxFrameHandler3
+  __CxxLongjmpUnwind
+  __CxxQueryExceptionSize
+  __CxxRegisterExceptionObject
+  __CxxUnregisterExceptionObject
+  __DestructExceptionObject
+  __FrameUnwindFilter
+  __RTCastToVoid
+  __RTDynamicCast
+  __RTtypeid
+  __STRINGTOLD
+  __STRINGTOLD_L
+  __TypeMatch
+  ___lc_codepage_func
+  ___lc_collate_cp_func
+  ___lc_handle_func
+  ___mb_cur_max_func
+  ___mb_cur_max_l_func
+  ___setlc_active_func
+  ___unguarded_readlc_active_add_func
+  __argc
+  __argv
+  __badioinfo
+  __clean_type_info_names_internal
+  __control87_2
+  __create_locale
+  __crtCompareStringA
+  __crtCompareStringW
+  __crtLCMapStringA
+  __crtLCMapStringW
+  __daylight
+  __doserrno
+  __dstbias
+  ___fls_getvalue at 4
+  ___fls_setvalue at 8
+  __fpecode
+  __free_locale
+  __get_current_locale
+  __get_flsindex
+ ;fixme?; __get_tlsindex
+  __initenv
+  __iob_func
+  __isascii
+  __iscsym
+  __iscsymf
+  __iswcsym
+  __iswcsymf
+  __lconv
+  __lconv_init
+  __libm_sse2_acos
+  __libm_sse2_acosf
+  __libm_sse2_asin
+  __libm_sse2_asinf
+  __libm_sse2_atan
+  __libm_sse2_atan2
+  __libm_sse2_atanf
+  __libm_sse2_cos
+  __libm_sse2_cosf
+  __libm_sse2_exp
+  __libm_sse2_expf
+  __libm_sse2_log
+  __libm_sse2_log10
+  __libm_sse2_log10f
+  __libm_sse2_logf
+  __libm_sse2_pow
+  __libm_sse2_powf
+  __libm_sse2_sin
+  __libm_sse2_sinf
+  __libm_sse2_tan
+  __libm_sse2_tanf
+  __mb_cur_max
+ ;fixme?; __p___argc
+ ;fixme?; __p___argv
+ ;fixme?; __p___initenv
+ ;fixme?; __p___mb_cur_max
+ ;fixme?; __p___wargv
+ ;fixme?; __p___winitenv
+ ;fixme?; __p__acmdln
+ ;fixme?; __p__commode
+ ;fixme?; __p__daylight
+ ;fixme?; __p__dstbias
+ ;fixme?; __p__environ
+ ;fixme?; __p__fmode
+ ;fixme?; __p__iob
+ ;fixme?; __p__mbcasemap
+ ;fixme?; __p__mbctype
+ ;fixme?; __p__pctype
+ ;fixme?; __p__pgmptr
+ ;fixme?; __p__pwctype
+ ;fixme?; __p__timezone
+ ;fixme?; __p__tzname
+ ;fixme?; __p__wcmdln
+ ;fixme?; __p__wenviron
+ ;fixme?; __p__wpgmptr
+
+  __pctype_func
+  __pioinfo
+  __pwctype_func
+  __pxcptinfoptrs
+  __report_gsfailure
+  __set_app_type
+  __set_flsgetvalue
+  __setlc_active
+ ;fixme?; __setusermatherr
+  __strncnt
+  __swprintf_l
+  __sys_errlist
+  __sys_nerr
+  __threadhandle
+  __threadid
+  __timezone
+  __toascii
+  __tzname
+  __unDName
+  __unDNameEx
+  __unDNameHelper
+  __unguarded_readlc_active
+  __vswprintf_l
+  __wargv
+  __wcserror
+  __wcserror_s
+  __wcsncnt
+ ;fixme?; __wgetmainargs
+  __winitenv
+  _abnormal_termination
+  _abs64
+  _access
+  _access_s
+  _acmdln
+  _aligned_free
+  _aligned_malloc
+  _aligned_msize
+  _aligned_offset_malloc
+  _aligned_offset_realloc
+  _aligned_offset_recalloc
+  _aligned_realloc
+  _aligned_recalloc
+  _amsg_exit
+  _assert
+  _atodbl
+  _atodbl_l
+  _atof_l
+  _atoflt
+  _atoflt_l
+  _atoi64
+  _atoi64_l
+  _atoi_l
+  _atol_l
+  _atoldbl
+  _atoldbl_l
+  _beep
+  _beginthread
+  _beginthreadex
+  _byteswap_uint64
+  _byteswap_ulong
+  _byteswap_ushort
+  _c_exit
+  _cabs
+  _callnewh
+  _calloc_crt
+  _cexit
+  _cgets
+  _cgets_s
+  _cgetws
+  _cgetws_s
+  _chdir
+  _chdrive
+  _chgsign
+  _chkesp
+  _chmod
+  _chsize
+  _chsize_s
+  _clearfp
+  _close
+  _commit
+  ;fixme?; _commode
+  _configthreadlocale
+  _control87
+  _controlfp
+  _controlfp_s
+  _copysign
+  _cprintf
+  _cprintf_l
+  _cprintf_p
+  _cprintf_p_l
+  _cprintf_s
+  _cprintf_s_l
+  _cputs
+  _cputws
+  _creat
+  _create_locale
+  _crt_debugger_hook
+  _cscanf
+  _cscanf_l
+  _cscanf_s
+  _cscanf_s_l
+  _ctime32
+  _ctime32_s
+  _ctime64
+  _ctime64_s
+  _cwait
+  _cwprintf
+  _cwprintf_l
+  _cwprintf_p
+  _cwprintf_p_l
+  _cwprintf_s
+  _cwprintf_s_l
+  _cwscanf
+  _cwscanf_l
+  _cwscanf_s
+  _cwscanf_s_l
+  _daylight
+  _difftime32
+  _difftime64
+  _dosmaperr
+  _dstbias
+  _dup
+  _dup2
+  _dupenv_s
+  _ecvt
+  _ecvt_s
+  _encoded_null
+  _endthread
+  _endthreadex
+  _environ
+  _eof
+  _errno
+  _except_handler2
+  _except_handler3
+ ;fixme?; _except_handler4_common
+  _execl
+  _execle
+  _execlp
+  _execlpe
+  _execv
+  _execve
+  _execvp
+  _execvpe
+  _exit
+  _expand
+  _fclose_nolock
+  _fcloseall
+  _fcvt
+  _fcvt_s
+  _fdopen
+  _fflush_nolock
+  _fgetchar
+  _fgetwc_nolock
+  _fgetwchar
+  _filbuf
+  _filelength
+  _filelengthi64
+  _fileno
+  _findclose
+  _findfirst32
+  _findfirst32i64
+  _findfirst64
+  _findfirst64i32
+  _findnext32
+  _findnext32i64
+  _findnext64
+  _findnext64i32
+  _finite
+  _flsbuf
+  _flushall
+  ;fixme?; _fmode
+  _fpclass
+  _fpieee_flt
+  _fpreset
+  _fprintf_l
+  _fprintf_p
+  _fprintf_p_l
+  _fprintf_s_l
+  _fputchar
+  _fputwc_nolock
+  _fputwchar
+  _fread_nolock
+  _fread_nolock_s
+  _free_locale
+  _freea
+  _freea_s
+  _freefls
+  _fscanf_l
+  _fscanf_s_l
+  _fseek_nolock
+  _fseeki64
+  _fseeki64_nolock
+  _fsopen
+  _fstat32
+  _fstat32i64
+  _fstat64
+  _fstat64i32
+  _ftell_nolock
+  _ftelli64
+  _ftelli64_nolock
+  _ftime32
+  _ftime32_s
+  _ftime64
+  _ftime64_s
+  _ftol
+  _fullpath
+  _futime32
+  _futime64
+  _fwprintf_l
+  _fwprintf_p
+  _fwprintf_p_l
+  _fwprintf_s_l
+  _fwrite_nolock
+  _fwscanf_l
+  _fwscanf_s_l
+  _gcvt
+  _gcvt_s
+  _get_current_locale
+  _get_daylight
+  _get_doserrno
+  _get_dstbias
+  _get_errno
+  _get_fmode
+  _get_heap_handle
+  _get_invalid_parameter_handler
+  _get_osfhandle
+  _get_output_format
+  _get_pgmptr
+  _get_printf_count_output
+  _get_purecall_handler
+  _get_terminate
+  _get_timezone
+  _get_tzname
+  _get_unexpected
+  _get_wpgmptr
+  _getc_nolock
+  _getch
+  _getch_nolock
+  _getche
+  _getche_nolock
+  _getcwd
+  _getdcwd
+  _getdcwd_nolock
+  _getdiskfree
+  _getdllprocaddr
+  _getdrive
+  _getdrives
+  _getmaxstdio
+  _getmbcp
+  _getpid
+  _getptd
+  _getsystime
+  _getw
+  _getwch
+  _getwch_nolock
+  _getwche
+  _getwche_nolock
+  _getws
+  _getws_s
+  _global_unwind2
+  _gmtime32
+  _gmtime32_s
+  _gmtime64
+  _gmtime64_s
+  _heapadd
+  _heapchk
+  _heapmin
+  _heapset
+  _heapused
+  _heapwalk
+  _hypot
+  _hypotf
+  _i64toa
+  _i64toa_s
+  _i64tow
+  _i64tow_s
+  _initptd
+ ;fixme?; _initterm
+  _initterm_e
+  _inp
+  _inpd
+  _inpw
+  _invalid_parameter
+  _invalid_parameter_noinfo
+  _invalid_parameter_noinfo_noreturn
+  _invoke_watson
+  _iob
+  _isalnum_l
+  _isalpha_l
+  _isatty
+  _iscntrl_l
+  _isctype
+  _isctype_l
+  _isdigit_l
+  _isgraph_l
+  _isleadbyte_l
+  _islower_l
+  _ismbbalnum
+  _ismbbalnum_l
+  _ismbbalpha
+  _ismbbalpha_l
+  _ismbbgraph
+  _ismbbgraph_l
+  _ismbbkalnum
+  _ismbbkalnum_l
+  _ismbbkana
+  _ismbbkana_l
+  _ismbbkprint
+  _ismbbkprint_l
+  _ismbbkpunct
+  _ismbbkpunct_l
+  _ismbblead
+  _ismbblead_l
+  _ismbbprint
+  _ismbbprint_l
+  _ismbbpunct
+  _ismbbpunct_l
+  _ismbbtrail
+  _ismbbtrail_l
+  _ismbcalnum
+  _ismbcalnum_l
+  _ismbcalpha
+  _ismbcalpha_l
+  _ismbcdigit
+  _ismbcdigit_l
+  _ismbcgraph
+  _ismbcgraph_l
+  _ismbchira
+  _ismbchira_l
+  _ismbckata
+  _ismbckata_l
+  _ismbcl0
+  _ismbcl0_l
+  _ismbcl1
+  _ismbcl1_l
+  _ismbcl2
+  _ismbcl2_l
+  _ismbclegal
+  _ismbclegal_l
+  _ismbclower
+  _ismbclower_l
+  _ismbcprint
+  _ismbcprint_l
+  _ismbcpunct
+  _ismbcpunct_l
+  _ismbcspace
+  _ismbcspace_l
+  _ismbcsymbol
+  _ismbcsymbol_l
+  _ismbcupper
+  _ismbcupper_l
+  _ismbslead
+  _ismbslead_l
+  _ismbstrail
+  _ismbstrail_l
+  _isnan
+  _isprint_l
+  _ispunct_l
+  _isspace_l
+  _isupper_l
+  _iswalnum_l
+  _iswalpha_l
+  _iswcntrl_l
+  _iswcsym_l
+  _iswcsymf_l
+  _iswctype_l
+  _iswdigit_l
+  _iswgraph_l
+  _iswlower_l
+  _iswprint_l
+  _iswpunct_l
+  _iswspace_l
+  _iswupper_l
+  _iswxdigit_l
+  _isxdigit_l
+  _itoa
+  _itoa_s
+  _itow
+  _itow_s
+  _j0
+  _j1
+  _jn
+  _kbhit
+  _lfind
+  _lfind_s
+  _loaddll
+  _local_unwind2
+  _local_unwind4
+  _localtime32
+  _localtime32_s
+  _localtime64
+  _localtime64_s
+  _lock
+  _lock_file
+  _locking
+  _logb
+  _longjmpex
+  _lrotl
+  _lrotr
+  _lsearch
+  _lsearch_s
+  _lseek
+  _lseeki64
+  _ltoa
+  _ltoa_s
+  _ltow
+  _ltow_s
+  _makepath
+  _makepath_s
+  _malloc_crt
+  _mbbtombc
+  _mbbtombc_l
+  _mbbtype
+  _mbbtype_l
+  _mbcasemap
+  _mbccpy
+  _mbccpy_l
+  _mbccpy_s
+  _mbccpy_s_l
+  _mbcjistojms
+  _mbcjistojms_l
+  _mbcjmstojis
+  _mbcjmstojis_l
+  _mbclen
+  _mbclen_l
+  _mbctohira
+  _mbctohira_l
+  _mbctokata
+  _mbctokata_l
+  _mbctolower
+  _mbctolower_l
+  _mbctombb
+  _mbctombb_l
+  _mbctoupper
+  _mbctoupper_l
+  _mbctype
+  _mblen_l
+  _mbsbtype
+  _mbsbtype_l
+  _mbscat_s
+  _mbscat_s_l
+  _mbschr
+  _mbschr_l
+  _mbscmp
+  _mbscmp_l
+  _mbscoll
+  _mbscoll_l
+  _mbscpy_s
+  _mbscpy_s_l
+  _mbscspn
+  _mbscspn_l
+  _mbsdec
+  _mbsdec_l
+  _mbsicmp
+  _mbsicmp_l
+  _mbsicoll
+  _mbsicoll_l
+  _mbsinc
+  _mbsinc_l
+  _mbslen
+  _mbslen_l
+  _mbslwr
+  _mbslwr_l
+  _mbslwr_s
+  _mbslwr_s_l
+  _mbsnbcat
+  _mbsnbcat_l
+  _mbsnbcat_s
+  _mbsnbcat_s_l
+  _mbsnbcmp
+  _mbsnbcmp_l
+  _mbsnbcnt
+  _mbsnbcnt_l
+  _mbsnbcoll
+  _mbsnbcoll_l
+  _mbsnbcpy
+  _mbsnbcpy_l
+  _mbsnbcpy_s
+  _mbsnbcpy_s_l
+  _mbsnbicmp
+  _mbsnbicmp_l
+  _mbsnbicoll
+  _mbsnbicoll_l
+  _mbsnbset
+  _mbsnbset_l
+  _mbsnbset_s
+  _mbsnbset_s_l
+  _mbsncat
+  _mbsncat_l
+  _mbsncat_s
+  _mbsncat_s_l
+  _mbsnccnt
+  _mbsnccnt_l
+  _mbsncmp
+  _mbsncmp_l
+  _mbsncoll
+  _mbsncoll_l
+  _mbsncpy
+  _mbsncpy_l
+  _mbsncpy_s
+  _mbsncpy_s_l
+  _mbsnextc
+  _mbsnextc_l
+  _mbsnicmp
+  _mbsnicmp_l
+  _mbsnicoll
+  _mbsnicoll_l
+  _mbsninc
+  _mbsninc_l
+  _mbsnlen
+  _mbsnlen_l
+  _mbsnset
+  _mbsnset_l
+  _mbsnset_s
+  _mbsnset_s_l
+  _mbspbrk
+  _mbspbrk_l
+  _mbsrchr
+  _mbsrchr_l
+  _mbsrev
+  _mbsrev_l
+  _mbsset
+  _mbsset_l
+  _mbsset_s
+  _mbsset_s_l
+  _mbsspn
+  _mbsspn_l
+  _mbsspnp
+  _mbsspnp_l
+  _mbsstr
+  _mbsstr_l
+  _mbstok
+  _mbstok_l
+  _mbstok_s
+  _mbstok_s_l
+  _mbstowcs_l
+  _mbstowcs_s_l
+  _mbstrlen
+  _mbstrlen_l
+  _mbstrnlen
+  _mbstrnlen_l
+  _mbsupr
+  _mbsupr_l
+  _mbsupr_s
+  _mbsupr_s_l
+  _mbtowc_l
+  _memccpy
+  _memicmp
+  _memicmp_l
+  _mkdir
+  _mkgmtime32
+  _mkgmtime64
+  _mktemp
+  _mktemp_s
+  _mktime32
+  _mktime64
+  _msize
+  _nextafter
+  _open
+  _open_osfhandle
+  _outp
+  _outpd
+  _outpw
+  _pclose
+  _pctype
+  _pgmptr
+  _pipe
+  _popen
+  _printf_l
+  _printf_p
+  _printf_p_l
+  _printf_s_l
+  _purecall
+  _putch
+  _putch_nolock
+  _putenv
+  _putenv_s
+  _putw
+  _putwch
+  _putwch_nolock
+  _putws
+  _pwctype
+  _read
+  _realloc_crt
+  _recalloc
+  _recalloc_crt
+  _resetstkoflw
+  _rmdir
+  _rmtmp
+  _rotl
+  _rotl64
+  _rotr
+  _rotr64
+  _scalb
+  _scanf_l
+  _scanf_s_l
+  _scprintf
+  _scprintf_l
+  _scprintf_p
+  _scprintf_p_l
+  _scwprintf
+  _scwprintf_l
+  _scwprintf_p
+  _scwprintf_p_l
+  _searchenv
+  _searchenv_s
+  _seh_longjmp_unwind4
+  _seh_longjmp_unwind
+  _set_SSE2_enable
+  _set_abort_behavior
+  _set_controlfp
+  _set_doserrno
+  _set_errno
+  _set_error_mode
+  _set_fmode
+  _set_invalid_parameter_handler
+  _set_malloc_crt_max_wait
+  _set_output_format
+  _set_printf_count_output
+  _set_purecall_handler
+  _seterrormode
+  _setjmp
+  _setjmp3
+  _setmaxstdio
+  _setmbcp
+  _setmode
+  _setsystime
+  _sleep
+  _snprintf
+  _snprintf_c
+  _snprintf_c_l
+  _snprintf_l
+  _snprintf_s
+  _snprintf_s_l
+  _snscanf
+  _snscanf_l
+  _snscanf_s
+  _snscanf_s_l
+  _snwprintf
+  _snwprintf_l
+  _snwprintf_s
+  _snwprintf_s_l
+  _snwscanf
+  _snwscanf_l
+  _snwscanf_s
+  _snwscanf_s_l
+  _sopen
+  _sopen_s
+  _spawnl
+  _spawnle
+  _spawnlp
+  _spawnlpe
+  _spawnv
+  _spawnve
+  _spawnvp
+  _spawnvpe
+  _splitpath
+  _splitpath_s
+  _sprintf_l
+  _sprintf_p
+  _sprintf_p_l
+  _sprintf_s_l
+  _sscanf_l
+  _sscanf_s_l
+  _stat32
+  _stat32i64
+  _stat64
+  _stat64i32
+  _statusfp
+  _statusfp2
+  _strcoll_l
+  _strdate
+  _strdate_s
+  _strdup
+  _strerror
+  _strerror_s
+  _strftime_l
+  _stricmp
+  _stricmp_l
+  _stricoll
+  _stricoll_l
+  _strlwr
+  _strlwr_l
+  _strlwr_s
+  _strlwr_s_l
+  _strncoll
+  _strncoll_l
+  _strnicmp
+  _strnicmp_l
+  _strnicoll
+  _strnicoll_l
+  _strnset
+  _strnset_s
+  _strrev
+  _strset
+  _strset_s
+  _strtime
+  _strtime_s
+  _strtod_l
+  _strtoi64
+  _strtoi64_l
+  _strtol_l
+  _strtoui64
+  _strtoui64_l
+  _strtoul_l
+  _strupr
+  _strupr_l
+  _strupr_s
+  _strupr_s_l
+  _strxfrm_l
+  _swab
+  _swprintf
+  _swprintf_c
+  _swprintf_c_l
+  _swprintf_p
+  _swprintf_p_l
+  _swprintf_s_l
+  _swscanf_l
+  _swscanf_s_l
+  _sys_errlist
+  _sys_nerr
+  _tell
+  _telli64
+  _tempnam
+  _time32
+  _time64
+  _timezone
+  _tolower
+  _tolower_l
+  _toupper
+  _toupper_l
+  _towlower_l
+  _towupper_l
+  _tzname
+  _tzset
+  _ui64toa
+  _ui64toa_s
+  _ui64tow
+  _ui64tow_s
+  _ultoa
+  _ultoa_s
+  _ultow
+  _ultow_s
+  _umask
+  _umask_s
+  _ungetc_nolock
+  _ungetch
+  _ungetch_nolock
+  _ungetwc_nolock
+  _ungetwch
+  _ungetwch_nolock
+  _unlink
+  _unloaddll
+  _unlock
+  _unlock_file
+  _utime32
+  _utime64
+  _vcprintf
+  _vcprintf_l
+  _vcprintf_p
+  _vcprintf_p_l
+  _vcprintf_s
+  _vcprintf_s_l
+  _vcwprintf
+  _vcwprintf_l
+  _vcwprintf_p
+  _vcwprintf_p_l
+  _vcwprintf_s
+  _vcwprintf_s_l
+  _vfprintf_l
+  _vfprintf_p
+  _vfprintf_p_l
+  _vfprintf_s_l
+  _vfwprintf_l
+  _vfwprintf_p
+  _vfwprintf_p_l
+  _vfwprintf_s_l
+  _vprintf_l
+  _vprintf_p
+  _vprintf_p_l
+  _vprintf_s_l
+  _vscprintf
+  _vscprintf_l
+  _vscprintf_p
+  _vscprintf_p_l
+  _vscwprintf
+  _vscwprintf_l
+  _vscwprintf_p
+  _vscwprintf_p_l
+  _vsnprintf
+  _vsnprintf_c
+  _vsnprintf_c_l
+  _vsnprintf_l
+  _vsnprintf_s
+  _vsnprintf_s_l
+  _vsnwprintf
+  _vsnwprintf_l
+  _vsnwprintf_s
+  _vsnwprintf_s_l
+  _vsprintf_l
+  _vsprintf_p
+  _vsprintf_p_l
+  _vsprintf_s_l
+  _vswprintf
+  _vswprintf_c
+  _vswprintf_c_l
+  _vswprintf_l
+  _vswprintf_p
+  _vswprintf_p_l
+  _vswprintf_s_l
+  _vwprintf_l
+  _vwprintf_p
+  _vwprintf_p_l
+  _vwprintf_s_l
+  _waccess
+  _waccess_s
+  _wasctime
+  _wasctime_s
+  _wassert
+  _wchdir
+  _wchmod
+ ;fixme?; _wcmdln
+  _wcreat
+  _wcscoll_l
+  _wcsdup
+  _wcserror
+  _wcserror_s
+  _wcsftime_l
+  _wcsicmp
+  _wcsicmp_l
+  _wcsicoll
+  _wcsicoll_l
+  _wcslwr
+  _wcslwr_l
+  _wcslwr_s
+  _wcslwr_s_l
+  _wcsncoll
+  _wcsncoll_l
+  _wcsnicmp
+  _wcsnicmp_l
+  _wcsnicoll
+  _wcsnicoll_l
+  _wcsnset
+  _wcsnset_s
+  _wcsrev
+  _wcsset
+  _wcsset_s
+  _wcstod_l
+  _wcstoi64
+  _wcstoi64_l
+  _wcstol_l
+  _wcstombs_l
+  _wcstombs_s_l
+  _wcstoui64
+  _wcstoui64_l
+  _wcstoul_l
+  _wcsupr
+  _wcsupr_l
+  _wcsupr_s
+  _wcsupr_s_l
+  _wcsxfrm_l
+  _wctime32
+  _wctime32_s
+  _wctime64
+  _wctime64_s
+  _wctomb_l
+  _wctomb_s_l
+  _wctype
+  _wdupenv_s
+  _wenviron
+  _wexecl
+  _wexecle
+  _wexeclp
+  _wexeclpe
+  _wexecv
+  _wexecve
+  _wexecvp
+  _wexecvpe
+  _wfdopen
+  _wfindfirst32
+  _wfindfirst32i64
+  _wfindfirst64
+  _wfindfirst64i32
+  _wfindnext32
+  _wfindnext32i64
+  _wfindnext64
+  _wfindnext64i32
+  _wfopen
+  _wfopen_s
+  _wfreopen
+  _wfreopen_s
+  _wfsopen
+  _wfullpath
+  _wgetcwd
+  _wgetdcwd
+  _wgetdcwd_nolock
+  _wgetenv
+  _wgetenv_s
+  _wmakepath
+  _wmakepath_s
+  _wmkdir
+  _wmktemp
+  _wmktemp_s
+  _wopen
+  _wperror
+  _wpgmptr
+  _wpopen
+  _wprintf_l
+  _wprintf_p
+  _wprintf_p_l
+  _wprintf_s_l
+  _wputenv
+  _wputenv_s
+  _wremove
+  _wrename
+  _write
+  _wrmdir
+  _wscanf_l
+  _wscanf_s_l
+  _wsearchenv
+  _wsearchenv_s
+  _wsetlocale
+  _wsopen
+  _wsopen_s
+  _wspawnl
+  _wspawnle
+  _wspawnlp
+  _wspawnlpe
+  _wspawnv
+  _wspawnve
+  _wspawnvp
+  _wspawnvpe
+  _wsplitpath
+  _wsplitpath_s
+  _wstat32
+  _wstat32i64
+  _wstat64
+  _wstat64i32
+  _wstrdate
+  _wstrdate_s
+  _wstrtime
+  _wstrtime_s
+  _wsystem
+  _wtempnam
+  _wtmpnam
+  _wtmpnam_s
+  _wtof
+  _wtof_l
+  _wtoi
+  _wtoi64
+  _wtoi64_l
+  _wtoi_l
+  _wtol
+  _wtol_l
+  _wunlink
+  _wutime32
+  _wutime64
+  _y0
+  _y1
+  _yn
+  abort
+  abs
+  acos
+  asctime
+  asctime_s
+  asin
+  atan
+  atan2
+  atexit
+  atof
+  atoi
+  atol
+  bsearch
+  bsearch_s
+  btowc
+  calloc
+  ceil
+  clearerr
+  clearerr_s
+  clock
+  cos
+  cosh
+  div
+  exit
+  exp
+  fabs
+  fclose
+  feof
+  ferror
+  fflush
+  fgetc
+  fgetpos
+  fgets
+  fgetwc
+  fgetws
+  floor
+  fmod
+  fopen
+  fopen_s
+  fprintf
+  fprintf_s
+  fputc
+  fputs
+  fputwc
+  fputws
+  fread
+  fread_s
+  free
+  freopen
+  freopen_s
+  frexp
+  fscanf
+  fscanf_s
+  fseek
+  fsetpos
+  ftell
+  fwprintf
+  fwprintf_s
+  fwrite
+  fwscanf
+  fwscanf_s
+  getc
+  getchar
+  getenv
+  getenv_s
+  gets
+  gets_s
+  getwc
+  getwchar
+  is_wctype
+  isalnum
+  isalpha
+  iscntrl
+  isdigit
+  isgraph
+  isleadbyte
+  islower
+  isprint
+  ispunct
+  isspace
+  isupper
+  iswalnum
+  iswalpha
+  iswascii
+  iswcntrl
+  iswctype
+  iswdigit
+  iswgraph
+  iswlower
+  iswprint
+  iswpunct
+  iswspace
+  iswupper
+  iswxdigit
+  isxdigit
+  labs
+  ldexp
+  ldiv
+  llabs
+  lldiv
+  localeconv
+  log
+  log10
+  longjmp
+  malloc
+  mblen
+  mbrlen
+  mbrtowc
+  mbsrtowcs
+  mbsrtowcs_s
+  mbstowcs
+  mbstowcs_s
+  mbtowc
+  memchr
+  memcmp
+  memcpy
+  memcpy_s
+  memmove
+  memmove_s
+  memset
+  modf
+  perror
+  pow
+  printf
+  printf_s
+  putc
+  putchar
+  puts
+  putwc
+  putwchar
+  qsort
+  qsort_s
+  raise
+  rand
+  rand_s
+  realloc
+  remove
+  rename
+  rewind
+  scanf
+  scanf_s
+  setbuf
+  setlocale
+  setvbuf
+  signal
+  sin
+  sinh
+  sprintf
+  sprintf_s
+  sqrt
+  srand
+  sscanf
+  sscanf_s
+  strcat
+  strcat_s
+  strchr
+  strcmp
+  strcoll
+  strcpy
+  strcpy_s
+  strcspn
+  strerror
+  strerror_s
+  strftime
+  strlen
+  strncat
+  strncat_s
+  strncmp
+  strncpy
+  strncpy_s
+  strnlen
+  strpbrk
+  strrchr
+  strspn
+  strstr
+  strtod
+  strtok
+  strtok_s
+  strtol
+  strtoul
+  strxfrm
+  swprintf_s
+  swscanf
+  swscanf_s
+  system
+  tan
+  tanh
+  tmpfile
+  tmpfile_s
+  tmpnam
+  tmpnam_s
+  tolower
+  toupper
+  towlower
+  towupper
+  ungetc
+  ungetwc
+  vfprintf
+  vfprintf_s
+  vfwprintf
+  vfwprintf_s
+  vprintf
+  vprintf_s
+  vsprintf
+  vsprintf_s
+  vswprintf_s
+  vwprintf
+  vwprintf_s
+  wcrtomb
+  wcrtomb_s
+  wcscat
+  wcscat_s
+  wcschr
+  wcscmp
+  wcscoll
+  wcscpy
+  wcscpy_s
+  wcscspn
+  wcsftime
+  wcslen
+  wcsncat
+  wcsncat_s
+  wcsncmp
+  wcsncpy
+  wcsncpy_s
+  wcsnlen
+  wcspbrk
+  wcsrchr
+  wcsrtombs
+  wcsrtombs_s
+  wcsspn
+  wcsstr
+  wcstod
+  wcstok
+  wcstok_s
+  wcstol
+  wcstombs
+  wcstombs_s
+  wcstoul
+  wcsxfrm
+  wctob
+  wctomb
+  wctomb_s
+  wmemcpy_s
+  wmemmove_s
+  wprintf
+  wprintf_s
+  wscanf
+  wscanf_s
+
+
diff --git a/src/VBox/Runtime/r3/win/VBoxRT-openssl.def b/src/VBox/Runtime/r3/win/VBoxRT-openssl.def
index bb6e2b3..e4fb30b 100644
--- a/src/VBox/Runtime/r3/win/VBoxRT-openssl.def
+++ b/src/VBox/Runtime/r3/win/VBoxRT-openssl.def
@@ -1,4 +1,4 @@
-; $Id: VBoxRT-openssl.def 100874 2015-06-09 14:01:31Z bird $
+; $Id: VBoxRT-openssl.def $
 ;; @file
 ; IPRT - Windows OpenSSL exports.
 ;
diff --git a/src/VBox/Runtime/r3/win/init-win.cpp b/src/VBox/Runtime/r3/win/init-win.cpp
index 24f2079..47a1090 100644
--- a/src/VBox/Runtime/r3/win/init-win.cpp
+++ b/src/VBox/Runtime/r3/win/init-win.cpp
@@ -56,6 +56,8 @@ DECLHIDDEN(OSVERSIONINFOEXW)    g_WinOsInfoEx;
 DECLHIDDEN(HMODULE)             g_hModKernel32 = NULL;
 /** The native ntdll.dll handle. */
 DECLHIDDEN(HMODULE)             g_hModNtDll = NULL;
+/** GetSystemWindowsDirectoryW or GetWindowsDirectoryW (NT4). */
+DECLHIDDEN(PFNGETWINSYSDIR)     g_pfnGetSystemWindowsDirectoryW = NULL;
 
 
 
@@ -292,6 +294,14 @@ DECLHIDDEN(int) rtR3InitNativeFirst(uint32_t fFlags)
     if (!(fFlags & RTR3INIT_FLAGS_UNOBTRUSIVE))
         rc = rtR3InitNativeObtrusiveWorker();
 
+    /*
+     * Resolve some kernel32.dll APIs we may need but aren't necessarily
+     * present in older windows versions.
+     */
+    g_pfnGetSystemWindowsDirectoryW = (PFNGETWINSYSDIR)GetProcAddress(g_hModKernel32, "GetSystemWindowsDirectoryW");
+    if (g_pfnGetSystemWindowsDirectoryW)
+        g_pfnGetSystemWindowsDirectoryW = (PFNGETWINSYSDIR)GetProcAddress(g_hModKernel32, "GetWindowsDirectoryW");
+
     return rc;
 }
 
diff --git a/src/VBox/Runtime/r3/win/internal-r3-win.h b/src/VBox/Runtime/r3/win/internal-r3-win.h
index cefaf3a..e69a49b 100644
--- a/src/VBox/Runtime/r3/win/internal-r3-win.h
+++ b/src/VBox/Runtime/r3/win/internal-r3-win.h
@@ -92,6 +92,8 @@ extern DECLHIDDEN(RTWINOSTYPE)      g_enmWinVer;
 extern DECLHIDDEN(HMODULE)          g_hModKernel32;
 extern DECLHIDDEN(HMODULE)          g_hModNtDll;
 extern DECLHIDDEN(OSVERSIONINFOEXW) g_WinOsInfoEx;
+typedef UINT (WINAPI *PFNGETWINSYSDIR)(LPWSTR,UINT);
+extern DECLHIDDEN(PFNGETWINSYSDIR)  g_pfnGetSystemWindowsDirectoryW;
 #endif
 
 
diff --git a/src/VBox/Runtime/r3/win/pipe-win.cpp b/src/VBox/Runtime/r3/win/pipe-win.cpp
index e36a7c2..807df71 100644
--- a/src/VBox/Runtime/r3/win/pipe-win.cpp
+++ b/src/VBox/Runtime/r3/win/pipe-win.cpp
@@ -148,7 +148,7 @@ extern "C" NTSYSAPI NTSTATUS WINAPI NtQueryInformationFile(HANDLE, PIO_STATUS_BL
  * @param   pThis               The pipe.
  * @param   pInfo               The info structure.
  */
-static bool rtPipeQueryInfo(RTPIPEINTERNAL *pThis, FILE_PIPE_LOCAL_INFORMATION *pInfo)
+static bool rtPipeQueryNtInfo(RTPIPEINTERNAL *pThis, FILE_PIPE_LOCAL_INFORMATION *pInfo)
 {
     IO_STATUS_BLOCK Ios;
     RT_ZERO(Ios);
@@ -458,7 +458,7 @@ RTDECL(int)  RTPipeFromNative(PRTPIPE phPipe, RTHCINTPTR hNativePipe, uint32_t f
     AssertReturn(cInstances <= 1, VERR_INVALID_HANDLE);
 
     /*
-     * Looks kind of OK, create a handle so we can try rtPipeQueryInfo on it
+     * Looks kind of OK, create a handle so we can try rtPipeQueryNtInfo on it
      * and see if we need to duplicate it to make that call work.
      */
     RTPIPEINTERNAL *pThis = (RTPIPEINTERNAL *)RTMemAllocZ(sizeof(RTPIPEINTERNAL));
@@ -486,7 +486,7 @@ RTDECL(int)  RTPipeFromNative(PRTPIPE phPipe, RTHCINTPTR hNativePipe, uint32_t f
 
             HANDLE  hNative2 = INVALID_HANDLE_VALUE;
             FILE_PIPE_LOCAL_INFORMATION Info;
-            if (rtPipeQueryInfo(pThis, &Info))
+            if (rtPipeQueryNtInfo(pThis, &Info))
                 rc = VINF_SUCCESS;
             else
             {
@@ -497,7 +497,7 @@ RTDECL(int)  RTPipeFromNative(PRTPIPE phPipe, RTHCINTPTR hNativePipe, uint32_t f
                                     0 /*dwOptions*/))
                 {
                     pThis->hPipe = hNative2;
-                    if (rtPipeQueryInfo(pThis, &Info))
+                    if (rtPipeQueryNtInfo(pThis, &Info))
                         rc = VINF_SUCCESS;
                     else
                     {
@@ -537,6 +537,7 @@ RTDECL(int)  RTPipeFromNative(PRTPIPE phPipe, RTHCINTPTR hNativePipe, uint32_t f
                     /*
                      * Ok, we're good!
                      */
+/** @todo This is bogus for standard handles! */
                     if (hNative2 != INVALID_HANDLE_VALUE)
                         CloseHandle(hNative);
                     *phPipe = pThis;
@@ -745,7 +746,7 @@ RTDECL(int) RTPipeWrite(RTPIPE hPipe, const void *pvBuf, size_t cbToWrite, size_
                 FILE_PIPE_LOCAL_INFORMATION Info;
                 if (   !pThis->fPromisedWritable
                     && cbToWrite > 0
-                    && rtPipeQueryInfo(pThis, &Info))
+                    && rtPipeQueryNtInfo(pThis, &Info))
                 {
                     if (Info.NamedPipeState == FILE_PIPE_CLOSING_STATE)
                         rc = VERR_BROKEN_PIPE;
@@ -1050,7 +1051,7 @@ RTDECL(int) RTPipeSelectOne(RTPIPE hPipe, RTMSINTERVAL cMillies)
             else
             {
                 FILE_PIPE_LOCAL_INFORMATION Info;
-                if (rtPipeQueryInfo(pThis, &Info))
+                if (rtPipeQueryNtInfo(pThis, &Info))
                 {
                     /* Check for broken pipe. */
                     if (Info.NamedPipeState == FILE_PIPE_CLOSING_STATE)
@@ -1171,6 +1172,29 @@ RTDECL(int) RTPipeQueryReadable(RTPIPE hPipe, size_t *pcbReadable)
 }
 
 
+RTDECL(int) RTPipeQueryInfo(RTPIPE hPipe, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    RTPIPEINTERNAL *pThis = hPipe;
+    AssertPtrReturn(pThis, 0);
+    AssertReturn(pThis->u32Magic == RTPIPE_MAGIC, 0);
+
+    int rc = RTCritSectEnter(&pThis->CritSect);
+    AssertRCReturn(rc, 0);
+
+    rtPipeFakeQueryInfo(pObjInfo, enmAddAttr, pThis->fRead);
+
+    FILE_PIPE_LOCAL_INFORMATION Info;
+    if (rtPipeQueryNtInfo(pThis, &Info))
+    {
+        pObjInfo->cbAllocated = pThis->fRead ? Info.InboundQuota : Info.OutboundQuota;
+        pObjInfo->cbObject    = pThis->fRead ? Info.ReadDataAvailable : Info.WriteQuotaAvailable;
+    }
+
+    RTCritSectLeave(&pThis->CritSect);
+    return VINF_SUCCESS;
+}
+
+
 int rtPipePollGetHandle(RTPIPE hPipe, uint32_t fEvents, PRTHCINTPTR phNative)
 {
     RTPIPEINTERNAL *pThis = hPipe;
@@ -1231,7 +1255,7 @@ static uint32_t rtPipePollCheck(RTPIPEINTERNAL *pThis, uint32_t fEvents)
             && !fRetEvents)
         {
             FILE_PIPE_LOCAL_INFORMATION Info;
-            if (rtPipeQueryInfo(pThis, &Info))
+            if (rtPipeQueryNtInfo(pThis, &Info))
             {
                 /* Check for broken pipe. */
                 if (Info.NamedPipeState == FILE_PIPE_CLOSING_STATE)
diff --git a/src/VBox/Runtime/r3/win/process-win.cpp b/src/VBox/Runtime/r3/win/process-win.cpp
index c6dea93..c77891c 100644
--- a/src/VBox/Runtime/r3/win/process-win.cpp
+++ b/src/VBox/Runtime/r3/win/process-win.cpp
@@ -31,8 +31,8 @@
 #define LOG_GROUP RTLOGGROUP_PROCESS
 #include <iprt/asm.h> /* hack */
 
+#include <iprt/nt/nt-and-windows.h>
 #include <Userenv.h>
-#include <Windows.h>
 #include <tlhelp32.h>
 #include <process.h>
 #include <errno.h>
@@ -63,48 +63,27 @@
 /*********************************************************************************************************************************
 *   Structures and Typedefs                                                                                                      *
 *********************************************************************************************************************************/
-typedef WINADVAPI BOOL WINAPI FNCREATEPROCESSWITHLOGON(LPCWSTR,
-                                                       LPCWSTR,
-                                                       LPCWSTR,
-                                                       DWORD,
-                                                       LPCWSTR,
-                                                       LPWSTR,
-                                                       DWORD,
-                                                       LPVOID,
-                                                       LPCWSTR,
-                                                       LPSTARTUPINFOW,
-                                                       LPPROCESS_INFORMATION);
-typedef FNCREATEPROCESSWITHLOGON *PFNCREATEPROCESSWITHLOGON;
+/* kernel32.dll: */
+//typedef DWORD   (WINAPI *PFNWTSGETACTIVECONSOLESESSIONID)(VOID);
+typedef HANDLE  (WINAPI *PFNCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
+typedef BOOL    (WINAPI *PFNPROCESS32FIRST)(HANDLE, LPPROCESSENTRY32);
+typedef BOOL    (WINAPI *PFNPROCESS32FIRSTW)(HANDLE, LPPROCESSENTRY32W);
+typedef BOOL    (WINAPI *PFNPROCESS32NEXT)(HANDLE, LPPROCESSENTRY32);
+typedef BOOL    (WINAPI *PFNPROCESS32NEXTW)(HANDLE, LPPROCESSENTRY32W);
 
-typedef DWORD WINAPI FNWTSGETACTIVECONSOLESESSIONID();
-typedef FNWTSGETACTIVECONSOLESESSIONID *PFNWTSGETACTIVECONSOLESESSIONID;
+/* psapi.dll: */
+typedef BOOL    (WINAPI *PFNENUMPROCESSES)(LPDWORD, DWORD, LPDWORD);
+typedef DWORD   (WINAPI *PFNGETMODULEBASENAME)(HANDLE, HMODULE, LPTSTR, DWORD);
 
-typedef HANDLE WINAPI FNCREATETOOLHELP32SNAPSHOT(DWORD, DWORD);
-typedef FNCREATETOOLHELP32SNAPSHOT *PFNCREATETOOLHELP32SNAPSHOT;
+/* advapi32.dll: */
+typedef BOOL    (WINAPI *PFNCREATEPROCESSWITHLOGON)(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPCWSTR, LPWSTR, DWORD,
+                                                    LPVOID, LPCWSTR, LPSTARTUPINFOW, LPPROCESS_INFORMATION);
 
-typedef BOOL WINAPI FNPROCESS32FIRST(HANDLE, LPPROCESSENTRY32);
-typedef FNPROCESS32FIRST *PFNPROCESS32FIRST;
-
-typedef BOOL WINAPI FNPROCESS32NEXT(HANDLE, LPPROCESSENTRY32);
-typedef FNPROCESS32NEXT *PFNPROCESS32NEXT;
-
-typedef BOOL WINAPI FNENUMPROCESSES(DWORD*, DWORD, DWORD*);
-typedef FNENUMPROCESSES *PFNENUMPROCESSES;
-
-typedef DWORD FNGETMODULEBASENAME(HANDLE, HMODULE, LPTSTR, DWORD);
-typedef FNGETMODULEBASENAME *PFNGETMODULEBASENAME;
-
-typedef BOOL WINAPI FNCREATEENVIRONMENTBLOCK(LPVOID *, HANDLE, BOOL);
-typedef FNCREATEENVIRONMENTBLOCK *PFNCREATEENVIRONMENTBLOCK;
-
-typedef BOOL WINAPI FNPFNDESTROYENVIRONMENTBLOCK(LPVOID);
-typedef FNPFNDESTROYENVIRONMENTBLOCK *PFNPFNDESTROYENVIRONMENTBLOCK;
-
-typedef BOOL WINAPI FNLOADUSERPROFILEW(HANDLE, LPPROFILEINFOW);
-typedef FNLOADUSERPROFILEW *PFNLOADUSERPROFILEW;
-
-typedef BOOL WINAPI FNUNLOADUSERPROFILE(HANDLE, HANDLE);
-typedef FNUNLOADUSERPROFILE *PFNUNLOADUSERPROFILE;
+/* userenv.dll: */
+typedef BOOL    (WINAPI *PFNCREATEENVIRONMENTBLOCK)(LPVOID *, HANDLE, BOOL);
+typedef BOOL    (WINAPI *PFNPFNDESTROYENVIRONMENTBLOCK)(LPVOID);
+typedef BOOL    (WINAPI *PFNLOADUSERPROFILEW)(HANDLE, LPPROFILEINFOW);
+typedef BOOL    (WINAPI *PFNUNLOADUSERPROFILE)(HANDLE, HANDLE);
 
 
 /*********************************************************************************************************************************
@@ -127,6 +106,38 @@ static struct RTPROCWINENTRY
     HANDLE          hProcess;
 }                  *g_paProcesses;
 
+/** @name userenv.dll imports (we don't unload it).
+ * They're all optional. So in addition to using g_rtProcWinResolveOnce, the
+ * caller must also check if any of the necessary APIs are NULL pointers.
+ * @{ */
+/** Init once structure for run-as-user functions we need.. */
+static RTONCE                           g_rtProcWinResolveOnce          = RTONCE_INITIALIZER;
+/* kernel32.dll: */
+static PFNCREATETOOLHELP32SNAPSHOT      g_pfnCreateToolhelp32Snapshot   = NULL;
+static PFNPROCESS32FIRST                g_pfnProcess32First             = NULL;
+static PFNPROCESS32NEXT                 g_pfnProcess32Next              = NULL;
+static PFNPROCESS32FIRSTW               g_pfnProcess32FirstW            = NULL;
+static PFNPROCESS32NEXTW                g_pfnProcess32NextW             = NULL;
+/* psapi.dll: */
+static PFNGETMODULEBASENAME             g_pfnGetModuleBaseName          = NULL;
+static PFNENUMPROCESSES                 g_pfnEnumProcesses              = NULL;
+/* advapi32.dll: */
+static PFNCREATEPROCESSWITHLOGON        g_pfnCreateProcessWithLogonW    = NULL;
+/* userenv.dll: */
+static PFNCREATEENVIRONMENTBLOCK        g_pfnCreateEnvironmentBlock     = NULL;
+static PFNPFNDESTROYENVIRONMENTBLOCK    g_pfnDestroyEnvironmentBlock    = NULL;
+static PFNLOADUSERPROFILEW              g_pfnLoadUserProfileW           = NULL;
+static PFNUNLOADUSERPROFILE             g_pfnUnloadUserProfile          = NULL;
+/** @} */
+
+
+/*********************************************************************************************************************************
+*   Internal Functions                                                                                                           *
+*********************************************************************************************************************************/
+static int rtProcWinFindExe(uint32_t fFlags, RTENV hEnv, const char *pszExec, PRTUTF16 *ppwszExec);
+static int rtProcWinCreateEnvBlockAndFindExe(uint32_t fFlags, RTENV hEnv, const char *pszExec,
+                                             PRTUTF16 *ppwszzBlock, PRTUTF16 *ppwszExec);
+
 
 /**
  * Clean up the globals.
@@ -266,53 +277,84 @@ static int rtProcWinAddPid(RTPROCESS pid, HANDLE hProcess)
 }
 
 
-RTR3DECL(int) RTProcCreate(const char *pszExec, const char * const *papszArgs, RTENV Env, unsigned fFlags, PRTPROCESS pProcess)
-{
-    return RTProcCreateEx(pszExec, papszArgs, Env, fFlags,
-                          NULL, NULL, NULL,  /* standard handles */
-                          NULL /*pszAsUser*/, NULL /* pszPassword*/,
-                          pProcess);
-}
-
-
 /**
- * Map some important or much used Windows error codes
- * to our error codes.
+ * Initialize the import APIs for run-as-user and special environment support.
  *
- * @return  Mapped IPRT status code.
- * @param   dwError                         Windows error code to map to IPRT code.
+ * @returns IPRT status code.
+ * @param   pvUser              Ignored.
  */
-static int rtProcWinMapErrorCodes(DWORD dwError)
+static DECLCALLBACK(int) rtProcWinResolveOnce(void *pvUser)
 {
-    int rc;
-    switch (dwError)
+    int      rc;
+    RTLDRMOD hMod;
+
+    /*
+     * kernel32.dll APIs introduced after NT4.
+     */
+    g_pfnCreateToolhelp32Snapshot   = (PFNCREATETOOLHELP32SNAPSHOT)GetProcAddress(g_hModKernel32, "CreateToolhelp32Snapshot");
+    g_pfnProcess32First             = (PFNPROCESS32FIRST          )GetProcAddress(g_hModKernel32, "Process32First");
+    g_pfnProcess32FirstW            = (PFNPROCESS32FIRSTW         )GetProcAddress(g_hModKernel32, "Process32FirstW");
+    g_pfnProcess32Next              = (PFNPROCESS32NEXT           )GetProcAddress(g_hModKernel32, "Process32Next");
+    g_pfnProcess32NextW             = (PFNPROCESS32NEXTW          )GetProcAddress(g_hModKernel32, "Process32NextW");
+
+    /*
+     * psapi.dll APIs, if none of the above are available.
+     */
+    if (   !g_pfnCreateToolhelp32Snapshot
+        || !g_pfnProcess32First
+        || !g_pfnProcess32Next)
     {
-        case ERROR_NOACCESS:
-        case ERROR_PRIVILEGE_NOT_HELD:
-            rc = VERR_PERMISSION_DENIED;
-            break;
+        Assert(!g_pfnCreateToolhelp32Snapshot && !g_pfnProcess32First && !g_pfnProcess32Next);
 
-        case ERROR_PASSWORD_EXPIRED:
-        case ERROR_ACCOUNT_RESTRICTION: /* See: http://support.microsoft.com/kb/303846/ */
-        case ERROR_PASSWORD_RESTRICTION:
-        case ERROR_ACCOUNT_DISABLED:    /* See: http://support.microsoft.com/kb/263936 */
-            rc = VERR_ACCOUNT_RESTRICTED;
-            break;
+        rc = RTLdrLoadSystem("psapi.dll", true /*fNoUnload*/, &hMod);
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTLdrGetSymbol(hMod, "GetModuleBaseName", (void **)&g_pfnGetModuleBaseName);
+            AssertStmt(RT_SUCCESS(rc), g_pfnGetModuleBaseName = NULL);
 
-        case ERROR_FILE_CORRUPT:
-            rc = VERR_BAD_EXE_FORMAT;
-            break;
+            rc = RTLdrGetSymbol(hMod, "EnumProcesses", (void **)&g_pfnEnumProcesses);
+            AssertStmt(RT_SUCCESS(rc), g_pfnEnumProcesses = NULL);
 
-        case ERROR_BAD_DEVICE: /* Can happen when opening funny things like "CON". */
-            rc = VERR_INVALID_NAME;
-            break;
+            RTLdrClose(hMod);
+        }
+    }
 
-        default:
-            /* Could trigger a debug assertion! */
-            rc = RTErrConvertFromWin32(dwError);
-            break;
+    /*
+     * advapi32.dll APIs.
+     */
+    g_pfnCreateProcessWithLogonW    = (PFNCREATEPROCESSWITHLOGON)RTLdrGetSystemSymbol("advapi32.dll", "CreateProcessWithLogonW");
+
+    /*
+     * userenv.dll APIs.
+     */
+    rc = RTLdrLoadSystem("userenv.dll", true /*fNoUnload*/, &hMod);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTLdrGetSymbol(hMod, "LoadUserProfileW", (void **)&g_pfnLoadUserProfileW);
+        AssertStmt(RT_SUCCESS(rc), g_pfnLoadUserProfileW = NULL);
+
+        rc = RTLdrGetSymbol(hMod, "UnloadUserProfile", (void **)&g_pfnUnloadUserProfile);
+        AssertStmt(RT_SUCCESS(rc), g_pfnUnloadUserProfile = NULL);
+
+        rc = RTLdrGetSymbol(hMod, "CreateEnvironmentBlock", (void **)&g_pfnCreateEnvironmentBlock);
+        AssertStmt(RT_SUCCESS(rc), g_pfnCreateEnvironmentBlock = NULL);
+
+        rc = RTLdrGetSymbol(hMod, "DestroyEnvironmentBlock", (void **)&g_pfnDestroyEnvironmentBlock);
+        AssertStmt(RT_SUCCESS(rc), g_pfnDestroyEnvironmentBlock = NULL);
+
+        RTLdrClose(hMod);
     }
-    return rc;
+
+    return VINF_SUCCESS;
+}
+
+
+RTR3DECL(int) RTProcCreate(const char *pszExec, const char * const *papszArgs, RTENV Env, unsigned fFlags, PRTPROCESS pProcess)
+{
+    return RTProcCreateEx(pszExec, papszArgs, Env, fFlags,
+                          NULL, NULL, NULL,  /* standard handles */
+                          NULL /*pszAsUser*/, NULL /* pszPassword*/,
+                          pProcess);
 }
 
 
@@ -321,7 +363,6 @@ static int rtProcWinMapErrorCodes(DWORD dwError)
  * matches.
  *
  * @returns IPRT status code.
- *
  * @param   dwPid           The process identifier.
  * @param   pSid            The secure identifier of the user.
  * @param   phToken         Where to return the a duplicate of the process token
@@ -353,11 +394,7 @@ static int rtProcWinGetProcessTokenHandle(DWORD dwPid, PSID pSid, PHANDLE phToke
                 PTOKEN_USER pTokenUser = (PTOKEN_USER)RTMemTmpAllocZ(dwSize);
                 if (pTokenUser)
                 {
-                    if (GetTokenInformation(hTokenProc,
-                                            TokenUser,
-                                            pTokenUser,
-                                            dwSize,
-                                            &dwSize))
+                    if (GetTokenInformation(hTokenProc, TokenUser, pTokenUser, dwSize, &dwSize))
                     {
                         if (   IsValidSid(pTokenUser->User.Sid)
                             && EqualSid(pTokenUser->User.Sid, pSid))
@@ -373,13 +410,13 @@ static int rtProcWinGetProcessTokenHandle(DWORD dwPid, PSID pSid, PHANDLE phToke
                                 rc = VINF_SUCCESS;
                             }
                             else
-                                rc = rtProcWinMapErrorCodes(GetLastError());
+                                rc = RTErrConvertFromWin32(GetLastError());
                         }
                         else
                             rc = VERR_NOT_FOUND;
                     }
                     else
-                        rc = rtProcWinMapErrorCodes(GetLastError());
+                        rc = RTErrConvertFromWin32(GetLastError());
                     RTMemTmpFree(pTokenUser);
                 }
                 else
@@ -388,15 +425,15 @@ static int rtProcWinGetProcessTokenHandle(DWORD dwPid, PSID pSid, PHANDLE phToke
             else if (fRc || dwErr == NO_ERROR)
                 rc = VERR_IPE_UNEXPECTED_STATUS;
             else
-                rc = rtProcWinMapErrorCodes(dwErr);
+                rc = RTErrConvertFromWin32(dwErr);
             CloseHandle(hTokenProc);
         }
         else
-            rc = rtProcWinMapErrorCodes(GetLastError());
+            rc = RTErrConvertFromWin32(GetLastError());
         CloseHandle(hProc);
     }
     else
-        rc = rtProcWinMapErrorCodes(GetLastError());
+        rc = RTErrConvertFromWin32(GetLastError());
     return rc;
 }
 
@@ -417,31 +454,28 @@ static int rtProcWinGetProcessTokenHandle(DWORD dwPid, PSID pSid, PHANDLE phToke
  */
 static bool rtProcWinFindTokenByProcessAndPsApi(const char * const *papszNames, PSID pSid, PHANDLE phToken)
 {
-    bool fFound = false;
-
     /*
      * Load PSAPI.DLL and resolve the two symbols we need.
      */
-    PFNGETMODULEBASENAME pfnGetModuleBaseName = (PFNGETMODULEBASENAME)RTLdrGetSystemSymbol("psapi.dll", "GetModuleBaseName");
-    if (!pfnGetModuleBaseName)
-        return false;
-    PFNENUMPROCESSES pfnEnumProcesses = (PFNENUMPROCESSES)RTLdrGetSystemSymbol("psapi.dll", "EnumProcesses");
-    if (!pfnEnumProcesses)
+    if (   !g_pfnGetModuleBaseName
+        || !g_pfnEnumProcesses)
         return false;
 
     /*
      * Get a list of PID.  We retry if it looks like there are more PIDs
      * to be returned than what we supplied buffer space for.
      */
-    int    rc = VINF_SUCCESS;
+    bool   fFound          = false;
+    int    rc              = VINF_SUCCESS;
     DWORD  cbPidsAllocated = 4096;
-    DWORD  cbPidsReturned  = 0;
+    DWORD  cbPidsReturned;
     DWORD *paPids;
     for (;;)
     {
         paPids = (DWORD *)RTMemTmpAlloc(cbPidsAllocated);
         AssertBreakStmt(paPids, rc = VERR_NO_TMP_MEMORY);
-        if (!pfnEnumProcesses(paPids, cbPidsAllocated, &cbPidsReturned))
+        cbPidsReturned = 0;
+        if (!g_pfnEnumProcesses(paPids, cbPidsAllocated, &cbPidsReturned))
         {
             rc = RTErrConvertFromWin32(GetLastError());
             AssertMsgFailedBreak(("%Rrc\n", rc));
@@ -473,7 +507,7 @@ static bool rtProcWinFindTokenByProcessAndPsApi(const char * const *papszNames,
                     if (hProc)
                     {
                         *pszProcName = '\0';
-                        DWORD cbRet = pfnGetModuleBaseName(hProc, 0 /*hModule = exe */, pszProcName, cbProcName);
+                        DWORD cbRet = g_pfnGetModuleBaseName(hProc, 0 /*hModule = exe */, pszProcName, cbProcName);
                         if (   cbRet > 0
                             && _stricmp(pszProcName, papszNames[i]) == 0
                             && RT_SUCCESS(rtProcWinGetProcessTokenHandle(paPids[iPid], pSid, phToken)))
@@ -515,32 +549,33 @@ static bool rtProcWinFindTokenByProcess(const char * const *papszNames, PSID pSi
      * On modern systems (W2K+) try the Toolhelp32 API first; this is more stable
      * and reliable.  Fallback to EnumProcess on NT4.
      */
-    PFNCREATETOOLHELP32SNAPSHOT pfnCreateToolhelp32Snapshot;
-    pfnCreateToolhelp32Snapshot = (PFNCREATETOOLHELP32SNAPSHOT)GetProcAddress(g_hModKernel32, "CreateToolhelp32Snapshot");
-    PFNPROCESS32FIRST pfnProcess32First = (PFNPROCESS32FIRST)GetProcAddress(g_hModKernel32, "Process32First");
-    PFNPROCESS32NEXT  pfnProcess32Next  = (PFNPROCESS32NEXT )GetProcAddress(g_hModKernel32, "Process32Next");
     bool fFallback = true;
-    if (pfnProcess32Next && pfnProcess32First && pfnCreateToolhelp32Snapshot)
+    if (g_pfnProcess32Next && g_pfnProcess32First && g_pfnCreateToolhelp32Snapshot)
     {
-        HANDLE hSnap = pfnCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+        HANDLE hSnap = g_pfnCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+        Assert(hSnap != INVALID_HANDLE_VALUE);
         if (hSnap != INVALID_HANDLE_VALUE)
         {
             fFallback = false;
             for (size_t i = 0; papszNames[i] && !fFound; i++)
             {
-                PROCESSENTRY32 procEntry;
-                procEntry.dwSize = sizeof(PROCESSENTRY32);
-                if (pfnProcess32First(hSnap, &procEntry))
+                PROCESSENTRY32 ProcEntry;
+                ProcEntry.dwSize = sizeof(PROCESSENTRY32);
+/** @todo use W APIs here.   */
+                if (g_pfnProcess32First(hSnap, &ProcEntry))
                 {
                     do
                     {
-                        if (   _stricmp(procEntry.szExeFile, papszNames[i]) == 0
-                            && RT_SUCCESS(rtProcWinGetProcessTokenHandle(procEntry.th32ProcessID, pSid, phToken)))
+                        if (_stricmp(ProcEntry.szExeFile, papszNames[i]) == 0)
                         {
-                            fFound = true;
-                            break;
+                            int rc = rtProcWinGetProcessTokenHandle(ProcEntry.th32ProcessID, pSid, phToken);
+                            if (RT_SUCCESS(rc))
+                            {
+                                fFound = true;
+                                break;
+                            }
                         }
-                    } while (pfnProcess32Next(hSnap, &procEntry));
+                    } while (g_pfnProcess32Next(hSnap, &ProcEntry));
                 }
 #ifdef RT_STRICT
                 else
@@ -557,7 +592,7 @@ static bool rtProcWinFindTokenByProcess(const char * const *papszNames, PSID pSi
     /* If we couldn't take a process snapshot for some reason or another, fall
        back on the NT4 compatible API. */
     if (fFallback)
-        return rtProcWinFindTokenByProcessAndPsApi(papszNames, pSid, phToken);
+        fFound = rtProcWinFindTokenByProcessAndPsApi(papszNames, pSid, phToken);
     return fFound;
 }
 
@@ -565,8 +600,7 @@ static bool rtProcWinFindTokenByProcess(const char * const *papszNames, PSID pSi
 /**
  * Logs on a specified user and returns its primary token.
  *
- * @return  int
- *
+ * @returns IPRT status code.
  * @param   pwszUser            User name.
  * @param   pwszPassword        Password.
  * @param   pwszDomain          Domain (not used at the moment).
@@ -574,369 +608,831 @@ static bool rtProcWinFindTokenByProcess(const char * const *papszNames, PSID pSi
  */
 static int rtProcWinUserLogon(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 pwszDomain, HANDLE *phToken)
 {
-    /** @todo Add domain support! */
+    AssertPtrReturn(pwszUser, VERR_INVALID_POINTER);
+    AssertPtrReturn(pwszPassword, VERR_INVALID_POINTER);
+    NOREF(pwszDomain); /** @todo Add domain support! */
+
+    /*
+     * Because we have to deal with http://support.microsoft.com/kb/245683
+     * for NULL domain names when running on NT4 here, pass an empty string if so.
+     * However, passing FQDNs should work!
+     *
+     * The SE_TCB_NAME (Policy: Act as part of the operating system) right
+     * is required on older windows versions (NT4, W2K, possibly XP).
+     */
+    PCRTUTF16 pwszDomainToUse = g_enmWinVer < kRTWinOSType_2K ? L"" /* NT4 and older */ : NULL /* Windows 2000 and up */;
     BOOL fRc = LogonUserW(pwszUser,
-                          /*
-                           * Because we have to deal with http://support.microsoft.com/kb/245683
-                           * for NULL domain names when running on NT4 here, pass an empty string if so.
-                           * However, passing FQDNs should work!
-                           */
-                          ((DWORD)(LOBYTE(LOWORD(GetVersion()))) < 5)  /* < Windows 2000. */
-                          ? L""   /* NT4 and older. */
-                          : NULL, /* Windows 2000 and up. */
+                          pwszDomainToUse,
                           pwszPassword,
                           LOGON32_LOGON_INTERACTIVE,
                           LOGON32_PROVIDER_DEFAULT,
                           phToken);
-    if (!fRc)
-    {
-        DWORD dwErr = GetLastError();
-        int rc = rtProcWinMapErrorCodes(dwErr);
-        if (rc == VERR_UNRESOLVED_ERROR)
-            LogRelFunc(("dwErr=%u (%#x), rc=%Rrc\n", dwErr, dwErr, rc));
-        return rc;
-    }
-    return VINF_SUCCESS;
-}
-
+    if (fRc)
+        return VINF_SUCCESS;
 
-/**
- * Logs off a user, specified by the given token.
- *
- * @param   hToken      The token (=user) to log off.
- */
-static void rtProcWinUserLogoff(HANDLE hToken)
-{
-    CloseHandle(hToken);
+    DWORD dwErr = GetLastError();
+    int rc = dwErr == ERROR_PRIVILEGE_NOT_HELD ? VERR_PROC_TCB_PRIV_NOT_HELD : RTErrConvertFromWin32(dwErr);
+    if (rc == VERR_UNRESOLVED_ERROR)
+        LogRelFunc(("dwErr=%u (%#x), rc=%Rrc\n", dwErr, dwErr, rc));
+    return rc;
 }
 
 
 /**
- * Creates an environment block out of a handed-in Unicode and
- * RTENV block. The RTENV block can overwrite entries already
- * present in the Unicode block.
+ * Returns the environment to use for the child process.
  *
- * @return  IPRT status code.
+ * This implements the RTPROC_FLAGS_ENV_CHANGE_RECORD and environment related
+ * parts of RTPROC_FLAGS_PROFILE.
  *
- * @param   pvEnvBlock          Unicode block (array) of environment entries;
- *                              in form of "FOO=BAR\0BAR=BAZ".
- * @param   hEnv                Handle of an existing RTENV block to use.
- * @param   fOverwriteExisting  Whether to overwrite existing values of hEnv
- *                              with the ones defined in pvEnvBlock.
- * @param   ppwszBlock          Pointer to the final output.
+ * @returns IPRT status code.
+ * @param   hToken      The user token to use if RTPROC_FLAGS_PROFILE is given.
+ *                      The caller must have loaded profile for this.
+ * @param   hEnv        The environment passed in by the RTProcCreateEx caller.
+ * @param   fFlags      The process creation flags passed in by the
+ *                      RTProcCreateEx caller (RTPROC_FLAGS_XXX).
+ * @param   phEnv       Where to return the environment to use.  This can either
+ *                      be a newly created environment block or @a hEnv.  In the
+ *                      former case, the caller must destroy it.
  */
-static int rtProcWinEnvironmentCreateInternal(VOID *pvEnvBlock, RTENV hEnv,
-                                              bool fOverwriteExisting,
-                                              PRTUTF16 *ppwszBlock)
+static int rtProcWinCreateEnvFromToken(HANDLE hToken, RTENV hEnv, uint32_t fFlags, PRTENV phEnv)
 {
-    RTENV hEnvTemp;
-    int rc = RTEnvClone(&hEnvTemp, hEnv);
-    if (RT_SUCCESS(rc))
+    int rc;
+
+    /*
+     * Query the environment from the user profile associated with the token if
+     * the caller has specified it directly or indirectly.
+     */
+    if (   (fFlags & RTPROC_FLAGS_PROFILE)
+        && (   hEnv == RTENV_DEFAULT
+            || (fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD)) )
     {
-        PCRTUTF16 pwch = (PCRTUTF16)pvEnvBlock;
-        while (   pwch
-               && RT_SUCCESS(rc))
+        if (g_pfnCreateEnvironmentBlock && g_pfnDestroyEnvironmentBlock)
         {
-            if (*pwch)
+            LPVOID pvEnvBlockProfile = NULL;
+            if (g_pfnCreateEnvironmentBlock(&pvEnvBlockProfile, hToken, FALSE /* Don't inherit from parent. */))
             {
-                char *pszEntry;
-                rc = RTUtf16ToUtf8(pwch, &pszEntry);
-                if (RT_SUCCESS(rc))
+                rc = RTEnvCloneUtf16Block(phEnv, (PCRTUTF16)pvEnvBlockProfile, 0 /*fFlags*/);
+                if (   (fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD)
+                    && RT_SUCCESS(rc)
+                    && hEnv != RTENV_DEFAULT)
                 {
-                    const char *pszEq = strchr(pszEntry, '=');
-                    if (   !pszEq
-                        && fOverwriteExisting)
-                    {
-                        rc = RTEnvUnset(pszEntry);
-                    }
-                    else if (pszEq)
-                    {
-                        const char *pszValue = pszEq + 1;
-                        size_t cchVar = pszEq - pszEntry;
-                        char *pszVar = (char *)RTMemAlloc(cchVar + 1);
-                        if (pszVar)
-                        {
-                            memcpy(pszVar, pszEntry, cchVar);
-                            pszVar[cchVar] = '\0';
-                            if (   !RTEnvExistEx(hEnv, pszVar)
-                                || fOverwriteExisting)
-                            {
-                                rc = RTEnvSetEx(hEnvTemp, pszVar, pszValue);
-                            }
-                            RTMemFree(pszVar);
-                        }
-                        else
-                            rc = VERR_NO_MEMORY;
-                    }
-                    RTStrFree(pszEntry);
+                    rc = RTEnvApplyChanges(*phEnv, hEnv);
+                    if (RT_FAILURE(rc))
+                        RTEnvDestroy(*phEnv);
                 }
+                g_pfnDestroyEnvironmentBlock(pvEnvBlockProfile);
             }
             else
-                break;
-            pwch += RTUtf16Len(pwch) + 1;
-            if (!*pwch)
-                break;
+                rc = RTErrConvertFromWin32(GetLastError());
         }
-
+        else
+            rc = VERR_SYMBOL_NOT_FOUND;
+    }
+    /*
+     * We we've got an incoming change record, combine it with the default environment.
+     */
+    else if (hEnv != RTENV_DEFAULT && (fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD))
+    {
+        rc = RTEnvClone(phEnv, RTENV_DEFAULT);
         if (RT_SUCCESS(rc))
-            rc = RTEnvQueryUtf16Block(hEnvTemp, ppwszBlock);
-        RTEnvDestroy(hEnvTemp);
+        {
+            rc = RTEnvApplyChanges(*phEnv, hEnv);
+            if (RT_FAILURE(rc))
+                RTEnvDestroy(*phEnv);
+        }
+    }
+    /*
+     * Otherwise we can return the incoming environment directly.
+     */
+    else
+    {
+        *phEnv = hEnv;
+        rc = VINF_SUCCESS;
     }
+
     return rc;
 }
 
 
 /**
- * Creates the environment block using Userenv.dll.
- *
- * Builds up the environment block for a specified user (identified by a token),
- * whereas hEnv is an additional set of environment variables which overwrite existing
- * values of the user profile.  ppwszBlock needs to be destroyed after usage
- * calling rtProcWinDestoryEnv().
+ * Figures which privilege we're missing for success application of
+ * CreateProcessAsUserW.
  *
- * @return  IPRT status code.
- *
- * @param   hToken          Token of the user to use.
- * @param   hEnv            Own environment block to extend/overwrite the profile's data with.
- * @param   ppwszBlock      Pointer to a pointer of the final UTF16 environment block.
+ * @returns IPRT error status.
  */
-static int rtProcWinCreateEnvFromToken(HANDLE hToken, RTENV hEnv, PRTUTF16 *ppwszBlock)
+static int rtProcWinFigureWhichPrivilegeNotHeld2(void)
+{
+    HANDLE hToken;
+    if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
+    {
+        static struct
+        {
+            const char *pszName;
+            int         rc;
+        } const s_aPrivileges[] =
+        {
+            { SE_TCB_NAME,                      VERR_PROC_TCB_PRIV_NOT_HELD },
+            { SE_ASSIGNPRIMARYTOKEN_NAME,       VERR_PROC_APT_PRIV_NOT_HELD },
+            { SE_INCREASE_QUOTA_NAME,           VERR_PROC_IQ_PRIV_NOT_HELD  },
+        };
+        for (uint32_t i = 0; i < RT_ELEMENTS(s_aPrivileges); i++)
+        {
+            union
+            {
+                TOKEN_PRIVILEGES TokPriv;
+                char abAlloced[sizeof(TOKEN_PRIVILEGES) + sizeof(LUID_AND_ATTRIBUTES)];
+            } uNew, uOld;
+            uNew.TokPriv.PrivilegeCount = 1;
+            uNew.TokPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+            AssertStmt(LookupPrivilegeValue(NULL, s_aPrivileges[i].pszName, &uNew.TokPriv.Privileges[0].Luid), continue);
+            uOld = uNew;
+            SetLastError(NO_ERROR);
+            DWORD cbActual = RT_OFFSETOF(TOKEN_PRIVILEGES, Privileges[1]);
+            AdjustTokenPrivileges(hToken, FALSE /*fDisableAllPrivileges*/, &uNew.TokPriv, cbActual, &uOld.TokPriv, &cbActual);
+            if (GetLastError() != NO_ERROR)
+            {
+                CloseHandle(hToken);
+                return s_aPrivileges[i].rc;
+            }
+            if (uOld.TokPriv.Privileges[0].Attributes == 0)
+                AdjustTokenPrivileges(hToken, FALSE /*fDisableAllPrivileges*/, &uOld.TokPriv, 0, NULL, NULL);
+        }
+        AssertFailed();
+        CloseHandle(hToken);
+    }
+    else
+        AssertFailed();
+    return VERR_PRIVILEGE_NOT_HELD;
+}
+
+#if 0 /* debug code */
+
+static char *rtProcWinSidToString(char *psz, PSID pSid)
 {
-    Assert(hToken);
-    Assert(hEnv != NIL_RTENV);
+     char *pszRet = psz;
+
+     *psz++ = 'S';
+     *psz++ = '-';
+     *psz++ = '1';
+     *psz++ = '-';
+
+     PISID pISid = (PISID)pSid;
+
+     psz += RTStrFormatU32(psz, 32, RT_MAKE_U32_FROM_U8(pISid->IdentifierAuthority.Value[5],
+                                                        pISid->IdentifierAuthority.Value[4],
+                                                        pISid->IdentifierAuthority.Value[3],
+                                                        pISid->IdentifierAuthority.Value[2]),
+                           10, 0, 0, 0);
+     for (unsigned i = 0; i < pISid->SubAuthorityCount; i++)
+     {
+          *psz++ = '-';
+          psz += RTStrFormatU32(psz, 32, pISid->SubAuthority[i], 10, 0, 0, 0);
+     }
+     *psz++ = '\0';
+     return pszRet;
+}
 
-    RTLDRMOD hUserenv;
-    int rc = RTLdrLoadSystem("Userenv.dll", true /*fNoUnload*/, &hUserenv);
-    if (RT_SUCCESS(rc))
+static void rtProcWinLogAcl(PACL pAcl)
+{
+    if (!pAcl)
+        RTAssertMsg2("ACL is NULL\n");
+    else
     {
-        PFNCREATEENVIRONMENTBLOCK pfnCreateEnvironmentBlock;
-        rc = RTLdrGetSymbol(hUserenv, "CreateEnvironmentBlock", (void**)&pfnCreateEnvironmentBlock);
-        if (RT_SUCCESS(rc))
+        RTAssertMsg2("AceCount=%d AclSize=%#x AclRevision=%d\n", pAcl->AceCount, pAcl->AclSize, pAcl->AclRevision);
+        for (uint32_t i = 0; i < pAcl->AceCount; i++)
         {
-            PFNPFNDESTROYENVIRONMENTBLOCK pfnDestroyEnvironmentBlock;
-            rc = RTLdrGetSymbol(hUserenv, "DestroyEnvironmentBlock", (void**)&pfnDestroyEnvironmentBlock);
-            if (RT_SUCCESS(rc))
+            PACE_HEADER pAceHdr = NULL;
+            if (GetAce(pAcl, i, (PVOID *)&pAceHdr))
             {
-                LPVOID pvEnvBlockProfile = NULL;
-                if (pfnCreateEnvironmentBlock(&pvEnvBlockProfile, hToken, FALSE /* Don't inherit from parent. */))
-                {
-                    rc = rtProcWinEnvironmentCreateInternal(pvEnvBlockProfile, hEnv,
-                                                            false /* fOverwriteExisting */,
-                                                            ppwszBlock);
-                    pfnDestroyEnvironmentBlock(pvEnvBlockProfile);
-                }
+                RTAssertMsg2(" ACE[%u]: Flags=%#x Type=%#x Size=%#x", i, pAceHdr->AceFlags, pAceHdr->AceType, pAceHdr->AceSize);
+                char szTmp[256];
+                if (pAceHdr->AceType == ACCESS_ALLOWED_ACE_TYPE)
+                    RTAssertMsg2(" Mask=%#x %s\n", ((ACCESS_ALLOWED_ACE *)pAceHdr)->Mask,
+                                 rtProcWinSidToString(szTmp, &((ACCESS_ALLOWED_ACE *)pAceHdr)->SidStart));
                 else
-                    rc = RTErrConvertFromWin32(GetLastError());
+                    RTAssertMsg2(" ACE[%u]: Flags=%#x Type=%#x Size=%#x\n", i, pAceHdr->AceFlags, pAceHdr->AceType, pAceHdr->AceSize);
             }
         }
-        RTLdrClose(hUserenv);
     }
+}
 
-    /* If we don't have the Userenv-API for whatever reason or something with the
-     * native environment block failed, try to return at least our own environment block. */
-    /** @todo this probably isn't a great idea if CreateEnvironmentBlock fails. */
-    if (RT_FAILURE(rc))
-        rc = RTEnvQueryUtf16Block(hEnv, ppwszBlock);
-    return rc;
+static bool rtProcWinLogSecAttr(HANDLE hUserObj)
+{
+    /*
+     * Get the security descriptor for the user interface object.
+     */
+    uint32_t             cbSecDesc = _64K;
+    PSECURITY_DESCRIPTOR pSecDesc  = (PSECURITY_DESCRIPTOR)RTMemTmpAlloc(cbSecDesc);
+    SECURITY_INFORMATION SecInfo   = DACL_SECURITY_INFORMATION;
+    DWORD                cbNeeded;
+    AssertReturn(pSecDesc, false);
+    if (!GetUserObjectSecurity(hUserObj, &SecInfo, pSecDesc, cbSecDesc, &cbNeeded))
+    {
+        RTMemTmpFree(pSecDesc);
+        AssertReturn(GetLastError() == ERROR_INSUFFICIENT_BUFFER, false);
+        cbSecDesc = cbNeeded + 128;
+        pSecDesc  = (PSECURITY_DESCRIPTOR)RTMemTmpAlloc(cbSecDesc);
+        AssertReturn(pSecDesc, false);
+        if (!GetUserObjectSecurity(hUserObj, &SecInfo, pSecDesc, cbSecDesc, &cbNeeded))
+        {
+            RTMemTmpFree(pSecDesc);
+            AssertFailedReturn(false);
+        }
+    }
+
+    /*
+     * Get the discretionary access control list (if we have one).
+     */
+    BOOL fDaclDefaulted;
+    BOOL fDaclPresent;
+    PACL pDacl;
+    if (GetSecurityDescriptorDacl(pSecDesc, &fDaclPresent, &pDacl, &fDaclDefaulted))
+        rtProcWinLogAcl(pDacl);
+    else
+        RTAssertMsg2("GetSecurityDescriptorDacl failed\n");
+
+    RTMemFree(pSecDesc);
+    return true;
 }
 
+#endif /* debug */
 
 /**
- * Builds up the environment block for a specified user (identified by user name, password
- * and domain), whereas hEnv is an additional set of environment variables which overwrite
- * existing values of the user profile.  ppwszBlock needs to be destroyed after usage
- * calling rtProcWinDestoryEnv().
- *
- * @return  IPRT status code.
+ * Get the user SID from a token.
  *
- * @param   pwszUser        User name.
- * @param   pwszPassword    Password.
- * @param   pwszDomain      Domain.
- * @param   hEnv            Own environment block to extend/overwrite the profile's data with.
- * @param   ppwszBlock      Pointer to a pointer of the final UTF16 environment block.
+ * @returns Pointer to the SID on success. Free by calling RTMemFree.
+ * @param   hToken              The token..
  */
-static int rtProcWinCreateEnvFromAccount(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 pwszDomain,
-                                         RTENV hEnv, PRTUTF16 *ppwszBlock)
+static PSID rtProcWinGetTokenUserSid(HANDLE hToken)
 {
-    HANDLE hToken;
-    int rc = rtProcWinUserLogon(pwszUser, pwszPassword, pwszDomain, &hToken);
-    if (RT_SUCCESS(rc))
+    /*
+     * Get the groups associated with the token.  We just try a size first then
+     * reallocates if it's insufficient.
+     */
+    DWORD       cbUser = _1K;
+    PTOKEN_USER pUser  = (PTOKEN_USER)RTMemTmpAlloc(cbUser);
+    AssertReturn(pUser, NULL);
+    DWORD cbNeeded = 0;
+    if (!GetTokenInformation(hToken, TokenUser, pUser, cbUser, &cbNeeded))
     {
-        rc = rtProcWinCreateEnvFromToken(hToken, hEnv, ppwszBlock);
-        rtProcWinUserLogoff(hToken);
+        RTMemTmpFree(pUser);
+        AssertReturn(GetLastError() == ERROR_INSUFFICIENT_BUFFER, NULL);
+        cbUser = cbNeeded + 128;
+        pUser = (PTOKEN_USER)RTMemTmpAlloc(cbUser);
+        AssertReturn(pUser, NULL);
+        if (!GetTokenInformation(hToken, TokenUser, pUser, cbUser, &cbNeeded))
+        {
+            RTMemTmpFree(pUser);
+            AssertFailedReturn(NULL);
+        }
     }
-    return rc;
+
+    DWORD cbSid = GetLengthSid(pUser->User.Sid);
+    PSID pSidRet = RTMemDup(pUser->User.Sid, cbSid);
+    Assert(pSidRet);
+    RTMemTmpFree(pUser);
+    return pSidRet;
 }
 
 
+#if 0 /* not used */
 /**
- * Destroys an environment block formerly created by rtProcWinEnvironmentCreateInternal(),
- * rtProcWinCreateEnvFromToken() or rtProcWinCreateEnvFromAccount().
+ * Get the login SID from a token.
  *
- * @param   ppwszBlock      Environment block to destroy.
+ * @returns Pointer to the SID on success. Free by calling RTMemFree.
+ * @param   hToken              The token..
  */
-static void rtProcWinDestroyEnv(PRTUTF16 ppwszBlock)
+static PSID rtProcWinGetTokenLogonSid(HANDLE hToken)
 {
-    RTEnvFreeUtf16Block(ppwszBlock);
+    /*
+     * Get the groups associated with the token.  We just try a size first then
+     * reallocates if it's insufficient.
+     */
+    DWORD         cbGroups = _1K;
+    PTOKEN_GROUPS pGroups = (PTOKEN_GROUPS)RTMemTmpAlloc(cbGroups);
+    AssertReturn(pGroups, NULL);
+    DWORD cbNeeded = 0;
+    if (!GetTokenInformation(hToken, TokenGroups, pGroups, cbGroups, &cbNeeded))
+    {
+        RTMemTmpFree(pGroups);
+        AssertReturn(GetLastError() == ERROR_INSUFFICIENT_BUFFER, NULL);
+        cbGroups = cbNeeded + 128;
+        pGroups = (PTOKEN_GROUPS)RTMemTmpAlloc(cbGroups);
+        AssertReturn(pGroups, NULL);
+        if (!GetTokenInformation(hToken, TokenGroups, pGroups, cbGroups, &cbNeeded))
+        {
+            RTMemTmpFree(pGroups);
+            AssertFailedReturn(NULL);
+        }
+    }
+
+    /*
+     * Locate the logon sid.
+     */
+    PSID     pSidRet = NULL;
+    uint32_t i = pGroups->GroupCount;
+    while (i-- > 0)
+        if ((pGroups->Groups[i].Attributes & SE_GROUP_LOGON_ID) == SE_GROUP_LOGON_ID)
+        {
+            DWORD cbSid = GetLengthSid(pGroups->Groups[i].Sid);
+            pSidRet = RTMemDup(pGroups->Groups[i].Sid, cbSid);
+            break;
+        }
+
+    RTMemTmpFree(pGroups);
+    Assert(pSidRet);
+    return pSidRet;
 }
+#endif /* unused */
 
 
 /**
- * Method \#2.
+ * Retrieves the DACL security descriptor of the give GUI object.
+ *
+ * @returns Pointer to the security descriptor.
+ * @param   hUserObj        The GUI object handle.
+ * @param   pcbSecDesc      Where to return the size of the security descriptor.
+ * @param   ppDacl          Where to return the DACL pointer.
+ * @param   pfDaclPresent   Where to return the DACL-present indicator.
+ * @param   pDaclSizeInfo   Where to return the DACL size information.
  */
-static int rtProcWinCreateAsUser2(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 pwszExec, PRTUTF16 pwszCmdLine,
-                                  RTENV hEnv, DWORD dwCreationFlags,
-                                  STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo, uint32_t fFlags)
+static PSECURITY_DESCRIPTOR rtProcWinGetUserObjDacl(HANDLE hUserObj, uint32_t *pcbSecDesc, PACL *ppDacl,
+                                                    BOOL *pfDaclPresent, ACL_SIZE_INFORMATION *pDaclSizeInfo)
 {
     /*
-     * So if we want to start a process from a service (RTPROC_FLAGS_SERVICE),
-     * we have to do the following:
-     * - Check the credentials supplied and get the user SID.
-     * - If valid get the correct Explorer/VBoxTray instance corresponding to that
-     *   user. This of course is only possible if that user is logged in (over
-     *   physical console or terminal services).
-     * - If we found the user's Explorer/VBoxTray app, use and modify the token to
-     *   use it in order to allow the newly started process to access the user's
-     *   desktop. If there's no Explorer/VBoxTray app we cannot display the started
-     *   process (but run it without UI).
-     *
-     * The following restrictions apply:
-     * - A process only can show its UI when the user the process should run
-     *   under is logged in (has a desktop).
-     * - We do not want to display a process of user A run on the desktop
-     *   of user B on multi session systems.
-     *
-     * The following rights are needed in order to use LogonUserW and
-     * CreateProcessAsUserW, so the local policy has to be modified to:
-     *  - SE_TCB_NAME = Act as part of the operating system
-     *  - SE_ASSIGNPRIMARYTOKEN_NAME = Create/replace a token object
-     *  - SE_INCREASE_QUOTA_NAME
-     *
-     * We may fail here with ERROR_PRIVILEGE_NOT_HELD.
+     * Get the security descriptor for the user interface object.
      */
-    DWORD dwErr = NO_ERROR;
-    PHANDLE phToken = NULL;
-    HANDLE hTokenLogon = INVALID_HANDLE_VALUE;
-    int rc = rtProcWinUserLogon(pwszUser, pwszPassword, NULL /* Domain */, &hTokenLogon);
-    if (RT_SUCCESS(rc))
+    uint32_t             cbSecDesc = _1K;
+    PSECURITY_DESCRIPTOR pSecDesc  = (PSECURITY_DESCRIPTOR)RTMemTmpAlloc(cbSecDesc);
+    SECURITY_INFORMATION SecInfo   = DACL_SECURITY_INFORMATION;
+    DWORD                cbNeeded;
+    AssertReturn(pSecDesc, NULL);
+    if (!GetUserObjectSecurity(hUserObj, &SecInfo, pSecDesc, cbSecDesc, &cbNeeded))
     {
-        DWORD fRc;
-        bool fFound = false;
-        HANDLE hTokenUserDesktop = INVALID_HANDLE_VALUE;
-
-        if (fFlags & RTPROC_FLAGS_SERVICE)
+        RTMemTmpFree(pSecDesc);
+        AssertReturn(GetLastError() == ERROR_INSUFFICIENT_BUFFER, NULL);
+        cbSecDesc = cbNeeded + 128;
+        pSecDesc  = (PSECURITY_DESCRIPTOR)RTMemTmpAlloc(cbSecDesc);
+        AssertReturn(pSecDesc, NULL);
+        if (!GetUserObjectSecurity(hUserObj, &SecInfo, pSecDesc, cbSecDesc, &cbNeeded))
         {
-            DWORD cbSid = 0; /* Must be zero to query size! */
-            DWORD cchDomain = 0;
-            SID_NAME_USE sidNameUse = SidTypeUser;
-            fRc = LookupAccountNameW(NULL,
-                                     pwszUser,
-                                     NULL,
-                                     &cbSid,
-                                     NULL,
-                                     &cchDomain,
-                                     &sidNameUse);
-            if (!fRc)
-                dwErr = GetLastError();
-            if (   !fRc
-                && dwErr == ERROR_INSUFFICIENT_BUFFER
-                && cbSid > 0)
-            {
-                dwErr = NO_ERROR;
+            RTMemTmpFree(pSecDesc);
+            AssertFailedReturn(NULL);
+        }
+    }
+    *pcbSecDesc = cbNeeded;
 
-                PSID pSid = (PSID)RTMemAlloc(cbSid * sizeof(wchar_t)); /** @todo r=bird: What's the relationship between wchar_t and PSID? */
-                AssertReturn(pSid, VERR_NO_MEMORY); /** @todo r=bird: Leaking token handles when we're out of memory...  */
+    /*
+     * Get the discretionary access control list (if we have one).
+     */
+    BOOL fDaclDefaulted;
+    if (GetSecurityDescriptorDacl(pSecDesc, pfDaclPresent, ppDacl, &fDaclDefaulted))
+    {
+        RT_ZERO(*pDaclSizeInfo);
+        pDaclSizeInfo->AclBytesInUse = sizeof(ACL);
+        if (   !*ppDacl
+            || GetAclInformation(*ppDacl, pDaclSizeInfo, sizeof(*pDaclSizeInfo), AclSizeInformation))
+            return pSecDesc;
+        AssertFailed();
+    }
+    else
+        AssertFailed();
+    RTMemTmpFree(pSecDesc);
+    return NULL;
+}
 
-                PRTUTF16 pwszDomain = NULL;
-                if (cchDomain > 0)
-                {
-                    pwszDomain = (PRTUTF16)RTMemAlloc(cchDomain * sizeof(RTUTF16));
-                    AssertReturn(pwszDomain, VERR_NO_MEMORY); /** @todo r=bird: Leaking token handles when we're out of memory...  */
-                }
 
-                /* Note: Also supports FQDNs! */
-                if (   LookupAccountNameW(NULL,            /* lpSystemName */
-                                          pwszUser,
-                                          pSid,
-                                          &cbSid,
-                                          pwszDomain,
-                                          &cchDomain,
-                                          &sidNameUse)
-                    && IsValidSid(pSid))
-                {
-                    /* Array of process names we want to look for. */
-                    static const char * const s_papszProcNames[] =
-                    {
-#ifdef VBOX                 /* The explorer entry is a fallback in case GA aren't installed. */
-                        { "VBoxTray.exe" },
-#endif
-                        { "explorer.exe" },
-                        NULL
-                    };
-                    fFound = rtProcWinFindTokenByProcess(s_papszProcNames, pSid, &hTokenUserDesktop);
-                }
-                else
-                    dwErr = GetLastError(); /* LookupAccountNameW() failed. */
-                RTMemFree(pSid);
-                RTMemFree(pwszDomain);
-            }
-        }
-        else /* !RTPROC_FLAGS_SERVICE */
-        {
-            /* Nothing to do here right now. */
-        }
+/**
+ * Copy ACEs from one ACL to another.
+ *
+ * @returns true on success, false on failure.
+ * @param   pDst                The destination ACL.
+ * @param   pSrc                The source ACL.
+ * @param   cAces               The number of ACEs to copy.
+ */
+static bool rtProcWinCopyAces(PACL pDst, PACL pSrc, uint32_t cAces)
+{
+    for (uint32_t i = 0; i < cAces; i++)
+    {
+        PACE_HEADER pAceHdr;
+        AssertReturn(GetAce(pSrc, i, (PVOID *)&pAceHdr), false);
+        AssertReturn(AddAce(pDst, ACL_REVISION, MAXDWORD, pAceHdr, pAceHdr->AceSize), false);
+    }
+    return true;
+}
 
-        /** @todo Hmm, this function already is too big! We need to split
-         *        it up into several small parts. */
 
-        /* If we got an error due to account lookup/loading above, don't
-         * continue here. */
-        if (dwErr == NO_ERROR)
-        {
-            /*
-             * If we didn't find a matching VBoxTray, just use the token we got
-             * above from LogonUserW(). This enables us to at least run processes with
-             * desktop interaction without UI.
-             */
-            phToken = fFound ? &hTokenUserDesktop : &hTokenLogon;
-            RTLDRMOD hUserenv;
-            rc = RTLdrLoadSystem("Userenv.dll", true /*fNoUnload*/, &hUserenv);
-            if (RT_SUCCESS(rc))
+/**
+ * Adds an access-allowed access control entry to an ACL.
+ *
+ * @returns true on success, false on failure.
+ * @param   pDstAcl             The ACL.
+ * @param   fAceFlags           The ACE flags.
+ * @param   fMask               The ACE access mask.
+ * @param   pSid                The SID to go with the ACE.
+ * @param   cbSid               The size of the SID.
+ */
+static bool rtProcWinAddAccessAllowedAce(PACL pDstAcl, uint32_t fAceFlags, uint32_t fMask, PSID pSid, uint32_t cbSid)
+{
+    struct
+    {
+        ACCESS_ALLOWED_ACE  Core;
+        DWORD               abPadding[128]; /* More than enough, AFAIK. */
+    } AceBuf;
+    RT_ZERO(AceBuf);
+    uint32_t const cbAllowedAce = RT_OFFSETOF(ACCESS_ALLOWED_ACE, SidStart) + cbSid;
+    AssertReturn(cbAllowedAce <= sizeof(AceBuf), false);
+
+    AceBuf.Core.Header.AceSize     = cbAllowedAce;
+    AceBuf.Core.Header.AceType     = ACCESS_ALLOWED_ACE_TYPE;
+    AceBuf.Core.Header.AceFlags    = fAceFlags;
+    AceBuf.Core.Mask               = fMask;
+    AssertReturn(CopySid(cbSid, &AceBuf.Core.SidStart, pSid), false);
+
+    uint32_t i = pDstAcl->AceCount;
+    while (i-- > 0)
+    {
+        PACE_HEADER pAceHdr;
+        AssertStmt(GetAce(pDstAcl, i, (PVOID *)&pAceHdr), continue);
+        if (   pAceHdr->AceSize == cbAllowedAce
+            && memcmp(pAceHdr, &AceBuf.Core, cbAllowedAce) == 0)
+            return true;
+
+    }
+    AssertMsgReturn(AddAce(pDstAcl, ACL_REVISION, MAXDWORD, &AceBuf.Core, cbAllowedAce), ("%u\n", GetLastError()), false);
+    return true;
+}
+
+
+/** All window station rights we know about   */
+#define MY_WINSTATION_ALL_RIGHTS (  WINSTA_ACCESSCLIPBOARD | WINSTA_ACCESSGLOBALATOMS | WINSTA_CREATEDESKTOP \
+                                  | WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_EXITWINDOWS | WINSTA_READATTRIBUTES \
+                                  | WINSTA_READSCREEN | WINSTA_WRITEATTRIBUTES | DELETE | READ_CONTROL | WRITE_DAC | WRITE_OWNER )
+/** All desktop rights we know about   */
+#define MY_DESKTOP_ALL_RIGHTS    (  DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL \
+                                  | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS \
+                                  | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS | DELETE | READ_CONTROL | WRITE_DAC \
+                                  | WRITE_OWNER )
+/** Generic rights. */
+#define MY_GENERIC_ALL_RIGHTS    ( GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL )
+
+
+/**
+ * Grants the given SID full access to the given window station.
+ *
+ * @returns true on success, false on failure.
+ * @param   hWinStation         The window station.
+ * @param   pSid                The SID.
+ */
+static bool rtProcWinAddSidToWinStation(HWINSTA hWinStation, PSID pSid)
+{
+    bool fRet = false;
+
+    /*
+     * Get the current DACL.
+     */
+    uint32_t                cbSecDesc;
+    PACL                    pDacl;
+    ACL_SIZE_INFORMATION    DaclSizeInfo;
+    BOOL                    fDaclPresent;
+    PSECURITY_DESCRIPTOR    pSecDesc = rtProcWinGetUserObjDacl(hWinStation, &cbSecDesc, &pDacl, &fDaclPresent, &DaclSizeInfo);
+    if (pSecDesc)
+    {
+        /*
+         * Create a new DACL. This will contain two extra ACEs.
+         */
+        PSECURITY_DESCRIPTOR pNewSecDesc = (PSECURITY_DESCRIPTOR)RTMemTmpAlloc(cbSecDesc);
+        if (   pNewSecDesc
+            && InitializeSecurityDescriptor(pNewSecDesc, SECURITY_DESCRIPTOR_REVISION))
+        {
+            uint32_t const cbSid     = GetLengthSid(pSid);
+            uint32_t const cbNewDacl = DaclSizeInfo.AclBytesInUse + (sizeof(ACCESS_ALLOWED_ACE) + cbSid) * 2;
+            PACL pNewDacl = (PACL)RTMemTmpAlloc(cbNewDacl);
+            if (   pNewDacl
+                && InitializeAcl(pNewDacl, cbNewDacl, ACL_REVISION)
+                && rtProcWinCopyAces(pNewDacl, pDacl, fDaclPresent ? DaclSizeInfo.AceCount : 0))
             {
-                PFNLOADUSERPROFILEW pfnLoadUserProfileW;
-                rc = RTLdrGetSymbol(hUserenv, "LoadUserProfileW", (void**)&pfnLoadUserProfileW);
-                if (RT_SUCCESS(rc))
+                /*
+                 * Add the two new SID ACEs.
+                 */
+                if (   rtProcWinAddAccessAllowedAce(pNewDacl, CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE | OBJECT_INHERIT_ACE,
+                                                    MY_GENERIC_ALL_RIGHTS, pSid, cbSid)
+                    && rtProcWinAddAccessAllowedAce(pNewDacl, NO_PROPAGATE_INHERIT_ACE, MY_WINSTATION_ALL_RIGHTS, pSid, cbSid))
                 {
-                    PFNUNLOADUSERPROFILE pfnUnloadUserProfile;
-                    rc = RTLdrGetSymbol(hUserenv, "UnloadUserProfile", (void**)&pfnUnloadUserProfile);
-                    if (RT_SUCCESS(rc))
+                    /*
+                     * Now mate the new DECL with the security descriptor and set it.
+                     */
+                    if (SetSecurityDescriptorDacl(pNewSecDesc, TRUE /*fDaclPresent*/, pNewDacl, FALSE /*fDaclDefaulted*/))
+                    {
+                        SECURITY_INFORMATION SecInfo = DACL_SECURITY_INFORMATION;
+                        if (SetUserObjectSecurity(hWinStation, &SecInfo, pNewSecDesc))
+                            fRet = true;
+                        else
+                            AssertFailed();
+                    }
+                    else
+                        AssertFailed();
+                }
+                else
+                    AssertFailed();
+            }
+            else
+                AssertFailed();
+            RTMemTmpFree(pNewDacl);
+        }
+        else
+            AssertFailed();
+        RTMemTmpFree(pNewSecDesc);
+        RTMemTmpFree(pSecDesc);
+    }
+    return fRet;
+}
+
+
+/**
+ * Grants the given SID full access to the given desktop.
+ *
+ * @returns true on success, false on failure.
+ * @param   hWinStation         The window station.
+ * @param   pSid                The SID.
+ */
+static bool rtProcWinAddSidToDesktop(HDESK hDesktop, PSID pSid)
+{
+    bool fRet = false;
+
+    /*
+     * Get the current DACL.
+     */
+    uint32_t                cbSecDesc;
+    PACL                    pDacl;
+    ACL_SIZE_INFORMATION    DaclSizeInfo;
+    BOOL                    fDaclPresent;
+    PSECURITY_DESCRIPTOR    pSecDesc = rtProcWinGetUserObjDacl(hDesktop, &cbSecDesc, &pDacl, &fDaclPresent, &DaclSizeInfo);
+    if (pSecDesc)
+    {
+        /*
+         * Create a new DACL. This will contain one extra ACE.
+         */
+        PSECURITY_DESCRIPTOR pNewSecDesc = (PSECURITY_DESCRIPTOR)RTMemTmpAlloc(cbSecDesc);
+        if (   pNewSecDesc
+            && InitializeSecurityDescriptor(pNewSecDesc, SECURITY_DESCRIPTOR_REVISION))
+        {
+            uint32_t const cbSid     = GetLengthSid(pSid);
+            uint32_t const cbNewDacl = DaclSizeInfo.AclBytesInUse + (sizeof(ACCESS_ALLOWED_ACE) + cbSid) * 1;
+            PACL pNewDacl = (PACL)RTMemTmpAlloc(cbNewDacl);
+            if (   pNewDacl
+                && InitializeAcl(pNewDacl, cbNewDacl, ACL_REVISION)
+                && rtProcWinCopyAces(pNewDacl, pDacl, fDaclPresent ? DaclSizeInfo.AceCount : 0))
+            {
+                /*
+                 * Add the new SID ACE.
+                 */
+                if (rtProcWinAddAccessAllowedAce(pNewDacl, 0 /*fAceFlags*/, MY_DESKTOP_ALL_RIGHTS, pSid, cbSid))
+                {
+                    /*
+                     * Now mate the new DECL with the security descriptor and set it.
+                     */
+                    if (SetSecurityDescriptorDacl(pNewSecDesc, TRUE /*fDaclPresent*/, pNewDacl, FALSE /*fDaclDefaulted*/))
+                    {
+                        SECURITY_INFORMATION SecInfo = DACL_SECURITY_INFORMATION;
+                        if (SetUserObjectSecurity(hDesktop, &SecInfo, pNewSecDesc))
+                            fRet = true;
+                        else
+                            AssertFailed();
+                    }
+                    else
+                        AssertFailed();
+                }
+                else
+                    AssertFailed();
+            }
+            else
+                AssertFailed();
+            RTMemTmpFree(pNewDacl);
+        }
+        else
+            AssertFailed();
+        RTMemTmpFree(pNewSecDesc);
+        RTMemTmpFree(pSecDesc);
+    }
+    return fRet;
+}
+
+
+/**
+ * Preps the window station and desktop for the new app.
+ *
+ * EXPERIMENTAL. Thus no return code.
+ *
+ * @param   hTokenToUse     The access token of the new process.
+ * @param   pStartupInfo    The startup info (we'll change lpDesktop, maybe).
+ * @param   phWinStationOld Where to return an window station handle to restore.
+ *                          Pass this to SetProcessWindowStation if not NULL.
+ */
+static void rtProcWinStationPrep(HANDLE hTokenToUse, STARTUPINFOW *pStartupInfo, HWINSTA *phWinStationOld)
+{
+    /** @todo Always mess with the interactive one? Maybe it's not there...  */
+    *phWinStationOld = GetProcessWindowStation();
+    HWINSTA hWinStation0 = OpenWindowStationW(L"winsta0", FALSE /*fInherit*/, READ_CONTROL | WRITE_DAC);
+    if (hWinStation0)
+    {
+        if (SetProcessWindowStation(hWinStation0))
+        {
+            HDESK hDesktop = OpenDesktop("default", 0 /*fFlags*/, FALSE /*fInherit*/,
+                                         READ_CONTROL | WRITE_DAC | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS);
+            if (hDesktop)
+            {
+                /*PSID pSid = rtProcWinGetTokenLogonSid(hTokenToUse); - Better to use the user SID. Avoid overflowing the ACL. */
+                PSID pSid = rtProcWinGetTokenUserSid(hTokenToUse);
+                if (pSid)
+                {
+                    if (   rtProcWinAddSidToWinStation(hWinStation0, pSid)
+                        && rtProcWinAddSidToDesktop(hDesktop, pSid))
+                    {
+                        pStartupInfo->lpDesktop = L"winsta0\\default";
+                    }
+                    RTMemFree(pSid);
+                }
+                CloseDesktop(hDesktop);
+            }
+            else
+                AssertFailed();
+        }
+        else
+            AssertFailed();
+        CloseWindowStation(hWinStation0);
+    }
+    else
+        AssertFailed();
+}
+
+
+/**
+ * Method \#2.
+ */
+static int rtProcWinCreateAsUser2(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 *ppwszExec, PRTUTF16 pwszCmdLine,
+                                  RTENV hEnv, DWORD dwCreationFlags,
+                                  STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo,
+                                  uint32_t fFlags, const char *pszExec)
+{
+    /*
+     * So if we want to start a process from a service (RTPROC_FLAGS_SERVICE),
+     * we have to do the following:
+     * - Check the credentials supplied and get the user SID.
+     * - If valid get the correct Explorer/VBoxTray instance corresponding to that
+     *   user. This of course is only possible if that user is logged in (over
+     *   physical console or terminal services).
+     * - If we found the user's Explorer/VBoxTray app, use and modify the token to
+     *   use it in order to allow the newly started process to access the user's
+     *   desktop. If there's no Explorer/VBoxTray app we cannot display the started
+     *   process (but run it without UI).
+     *
+     * The following restrictions apply:
+     * - A process only can show its UI when the user the process should run
+     *   under is logged in (has a desktop).
+     * - We do not want to display a process of user A run on the desktop
+     *   of user B on multi session systems.
+     *
+     * The following rights are needed in order to use LogonUserW and
+     * CreateProcessAsUserW, so the local policy has to be modified to:
+     *  - SE_TCB_NAME                = Act as part of the operating system
+     *  - SE_ASSIGNPRIMARYTOKEN_NAME = Create/replace a (process) token object
+     *  - SE_INCREASE_QUOTA_NAME     = Increase quotas
+     *
+     * We may fail here with ERROR_PRIVILEGE_NOT_HELD.
+     */
+    DWORD   dwErr       = NO_ERROR;
+    HANDLE  hTokenLogon = INVALID_HANDLE_VALUE;
+    int rc = rtProcWinUserLogon(pwszUser, pwszPassword, NULL /* Domain */, &hTokenLogon);
+    if (RT_SUCCESS(rc))
+    {
+        DWORD  fRc;
+        bool   fFound = false;
+        HANDLE hTokenUserDesktop = INVALID_HANDLE_VALUE;
+
+        /*
+         * If the SERVICE flag is specified, we do something rather ugly to
+         * make things work at all.  We search for a known desktop process
+         * belonging to the user, grab its token and use it for launching
+         * the new process.  That way the process will have desktop access.
+         */
+        if (fFlags & RTPROC_FLAGS_SERVICE)
+        {
+            /* Try query the SID and domain sizes first. */
+            DWORD           cbSid      = 0; /* Must be zero to query size! */
+            DWORD           cwcDomain  = 0;
+            SID_NAME_USE    SidNameUse = SidTypeUser;
+            fRc = LookupAccountNameW(NULL, pwszUser, NULL, &cbSid, NULL, &cwcDomain, &SidNameUse);
+
+            /* Allocate memory for the LookupAccountNameW output buffers and do it for real. */
+            cbSid = fRc && cbSid != 0 ? cbSid + 16 : _1K;
+            PSID pSid = (PSID)RTMemAllocZ(cbSid);
+            if (pSid)
+            {
+                cwcDomain = fRc ? cwcDomain + 2 : _512K;
+                PRTUTF16 pwszDomain = (PRTUTF16)RTMemAllocZ(cwcDomain * sizeof(RTUTF16));
+                if (pwszDomain)
+                {
+                    /* Note: Also supports FQDNs! */
+                    if (   LookupAccountNameW(NULL /*lpSystemName*/, pwszUser, pSid, &cbSid, pwszDomain, &cwcDomain, &SidNameUse)
+                        && IsValidSid(pSid))
                     {
-                        PROFILEINFOW profileInfo;
-                        if (!(fFlags & RTPROC_FLAGS_NO_PROFILE))
+                        /* Array of process names we want to look for. */
+                        static const char * const s_papszProcNames[] =
                         {
-                            RT_ZERO(profileInfo);
-                            profileInfo.dwSize = sizeof(profileInfo);
-                            profileInfo.lpUserName = pwszUser;
-                            profileInfo.dwFlags = PI_NOUI; /* Prevents the display of profile error messages. */
+#ifdef VBOX                 /* The explorer entry is a fallback in case GA aren't installed. */
+                            { "VBoxTray.exe" },
+#endif
+                            { "explorer.exe" },
+                            NULL
+                        };
+                        fFound = rtProcWinFindTokenByProcess(s_papszProcNames, pSid, &hTokenUserDesktop);
+                    }
+                    else
+                    {
+                        dwErr = GetLastError();
+                        rc = dwErr != NO_ERROR ? RTErrConvertFromWin32(dwErr) : VERR_INTERNAL_ERROR_3;
+                    }
+                    RTMemFree(pwszDomain);
+                }
+                RTMemFree(pSid);
+            }
+        }
+        /* else: !RTPROC_FLAGS_SERVICE: Nothing to do here right now. */
 
-                            if (!pfnLoadUserProfileW(*phToken, &profileInfo))
-                                dwErr = GetLastError();
-                        }
+#if 0
+        /*
+         * If we make LogonUserW to return an impersonation token, enable this
+         * to convert it into a primary token.
+         */
+        if (!fFound && detect-impersonation-token)
+        {
+            HANDLE hNewToken;
+            if (DuplicateTokenEx(hTokenLogon, MAXIMUM_ALLOWED, NULL /*SecurityAttribs*/,
+                                 SecurityIdentification, TokenPrimary, &hNewToken))
+            {
+                CloseHandle(hTokenLogon);
+                hTokenLogon = hNewToken;
+            }
+            else
+                AssertMsgFailed(("%d\n", GetLastError()));
+        }
+#endif
 
-                        if (dwErr == NO_ERROR)
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * If we didn't find a matching VBoxTray, just use the token we got
+             * above from LogonUserW().  This enables us to at least run processes
+             * with desktop interaction without UI.
+             */
+            HANDLE hTokenToUse = fFound ? hTokenUserDesktop : hTokenLogon;
+            if (   !(fFlags & RTPROC_FLAGS_PROFILE)
+                || (g_pfnUnloadUserProfile && g_pfnLoadUserProfileW) )
+            {
+                /*
+                 * Load the profile, if requested.  (Must be done prior to
+                 * creating the enviornment.)
+                 */
+                PROFILEINFOW ProfileInfo;
+                RT_ZERO(ProfileInfo);
+                if (fFlags & RTPROC_FLAGS_PROFILE)
+                {
+                    ProfileInfo.dwSize     = sizeof(ProfileInfo);
+                    ProfileInfo.lpUserName = pwszUser;
+                    ProfileInfo.dwFlags    = PI_NOUI; /* Prevents the display of profile error messages. */
+
+                    if (!g_pfnLoadUserProfileW(hTokenToUse, &ProfileInfo))
+                        rc = RTErrConvertFromWin32(GetLastError());
+                }
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * Create the environment.
+                     */
+                    RTENV hEnvFinal;
+                    rc = rtProcWinCreateEnvFromToken(hTokenToUse, hEnv, fFlags, &hEnvFinal);
+                    if (RT_SUCCESS(rc))
+                    {
+                        PRTUTF16 pwszzBlock;
+                        rc = RTEnvQueryUtf16Block(hEnvFinal, &pwszzBlock);
+                        if (RT_SUCCESS(rc))
                         {
-                            PRTUTF16 pwszzBlock;
-                            rc = rtProcWinCreateEnvFromToken(*phToken, hEnv, &pwszzBlock);
+                            rc = rtProcWinFindExe(fFlags, hEnv, pszExec, ppwszExec);
                             if (RT_SUCCESS(rc))
                             {
+                                HWINSTA hOldWinStation = NULL;
+                                if (!fFound && g_enmWinVer <= kRTWinOSType_NT4) /** @todo test newer versions... */
+                                    rtProcWinStationPrep(hTokenToUse, pStartupInfo, &hOldWinStation);
+
                                 /*
                                  * Useful KB articles:
                                  *      http://support.microsoft.com/kb/165194/
                                  *      http://support.microsoft.com/kb/184802/
                                  *      http://support.microsoft.com/kb/327618/
                                  */
-                                fRc = CreateProcessAsUserW(*phToken,
-                                                           pwszExec,
+                                fRc = CreateProcessAsUserW(hTokenToUse,
+                                                           *ppwszExec,
                                                            pwszCmdLine,
                                                            NULL,         /* pProcessAttributes */
                                                            NULL,         /* pThreadAttributes */
@@ -949,39 +1445,48 @@ static int rtProcWinCreateAsUser2(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTU
                                                            pStartupInfo,
                                                            pProcInfo);
                                 if (fRc)
-                                    dwErr = NO_ERROR;
+                                    rc = VINF_SUCCESS;
                                 else
-                                    dwErr = GetLastError(); /* CreateProcessAsUserW() failed. */
-                                rtProcWinDestroyEnv(pwszzBlock);
-                            }
-
-                            if (!(fFlags & RTPROC_FLAGS_NO_PROFILE))
-                            {
-                                fRc = pfnUnloadUserProfile(*phToken, profileInfo.hProfile);
-#ifdef RT_STRICT
-                                if (!fRc)
                                 {
-                                    DWORD dwErr2 = GetLastError();
-                                    AssertMsgFailed(("Unloading user profile failed with error %u (%#x) - Are all handles closed? (dwErr=%u)",
-                                                     dwErr2, dwErr2, dwErr));
+                                    dwErr = GetLastError();
+                                    if (dwErr == ERROR_PRIVILEGE_NOT_HELD)
+                                        rc = rtProcWinFigureWhichPrivilegeNotHeld2();
+                                    else
+                                        rc = RTErrConvertFromWin32(dwErr);
                                 }
-#endif
+
+                                if (hOldWinStation)
+                                    SetProcessWindowStation(hOldWinStation);
                             }
+                            RTEnvFreeUtf16Block(pwszzBlock);
                         }
+
+                        if (hEnvFinal != hEnv)
+                            RTEnvDestroy(hEnvFinal);
+                    }
+
+                    if ((fFlags & RTPROC_FLAGS_PROFILE) && ProfileInfo.hProfile)
+                    {
+                        fRc = g_pfnUnloadUserProfile(hTokenToUse, ProfileInfo.hProfile);
+#ifdef RT_STRICT
+                        if (!fRc)
+                        {
+                            DWORD dwErr2 = GetLastError();
+                            AssertMsgFailed(("Unloading user profile failed with error %u (%#x) - Are all handles closed? (dwErr=%u)",
+                                             dwErr2, dwErr2, dwErr));
+                        }
+#endif
                     }
                 }
-                RTLdrClose(hUserenv);
-            } /* Userenv.dll found/loaded? */
+            }
+            else
+                rc = VERR_SYMBOL_NOT_FOUND;
         } /* Account lookup succeeded? */
+
         if (hTokenUserDesktop != INVALID_HANDLE_VALUE)
             CloseHandle(hTokenUserDesktop);
-        rtProcWinUserLogoff(hTokenLogon);
-    }
+        CloseHandle(hTokenLogon);
 
-    if (   RT_SUCCESS(rc)
-        && dwErr != NO_ERROR)
-    {
-        rc = rtProcWinMapErrorCodes(dwErr);
         if (rc == VERR_UNRESOLVED_ERROR)
             LogRelFunc(("dwErr=%u (%#x), rc=%Rrc\n", dwErr, dwErr, rc));
     }
@@ -990,76 +1495,252 @@ static int rtProcWinCreateAsUser2(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTU
 
 
 /**
+ * Plants a standard handle into a child process on older windows versions.
+ *
+ * This is only needed when using CreateProcessWithLogonW on older windows
+ * versions.  It would appear that newer versions of windows does this for us.
+ *
+ * @param   hSrcHandle              The source handle.
+ * @param   hDstProcess             The child process handle.
+ * @param   offProcParamMember      The offset to RTL_USER_PROCESS_PARAMETERS.
+ * @param   ppvDstProcParamCache    Where where cached the address of
+ *                                  RTL_USER_PROCESS_PARAMETERS in the child.
+ */
+static void rtProcWinDupStdHandleIntoChild(HANDLE hSrcHandle, HANDLE hDstProcess, uint32_t offProcParamMember,
+                                           PVOID *ppvDstProcParamCache)
+{
+    if (hSrcHandle != NULL && hSrcHandle != INVALID_HANDLE_VALUE)
+    {
+        HANDLE hDstHandle;
+        if (DuplicateHandle(GetCurrentProcess(), hSrcHandle, hDstProcess, &hDstHandle,
+                            0 /*IgnoredDesiredAccess*/, FALSE /*fInherit*/, DUPLICATE_SAME_ACCESS))
+        {
+            if (hSrcHandle == hDstHandle)
+                return;
+
+            if (!*ppvDstProcParamCache)
+            {
+                PROCESS_BASIC_INFORMATION BasicInfo;
+                ULONG cbIgn;
+                NTSTATUS rcNt = NtQueryInformationProcess(hDstProcess, ProcessBasicInformation,
+                                                          &BasicInfo, sizeof(BasicInfo), &cbIgn);
+                if (NT_SUCCESS(rcNt))
+                {
+                    SIZE_T cbCopied = 0;
+                    if (!ReadProcessMemory(hDstProcess,
+                                           (char *)BasicInfo.PebBaseAddress + RT_OFFSETOF(PEB_COMMON, ProcessParameters),
+                                           ppvDstProcParamCache, sizeof(*ppvDstProcParamCache), &cbCopied))
+                    {
+                        AssertMsgFailed(("PebBaseAddress=%p %d\n", BasicInfo.PebBaseAddress, GetLastError()));
+                        *ppvDstProcParamCache = NULL;
+                    }
+                }
+                else
+                    AssertMsgFailed(("rcNt=%#x\n", rcNt));
+            }
+            if (*ppvDstProcParamCache)
+            {
+                if (WriteProcessMemory(hDstProcess, (char *)*ppvDstProcParamCache + offProcParamMember,
+                                       &hDstHandle, sizeof(hDstHandle), NULL))
+                    return;
+            }
+
+            /*
+             * Close the handle.
+             */
+            HANDLE hSrcHandle2;
+            if (DuplicateHandle(hDstProcess, hDstHandle, GetCurrentProcess(), &hSrcHandle2,
+                                0 /*IgnoredDesiredAccess*/, FALSE /*fInherit*/, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
+                CloseHandle(hSrcHandle2);
+            else
+                AssertMsgFailed(("hDstHandle=%p %u\n", hDstHandle, GetLastError()));
+        }
+        else
+            AssertMsg(GetLastError() == ERROR_INVALID_PARAMETER, ("%u\n", GetLastError()));
+    }
+}
+
+
+/**
  * Method \#1.
  *
- * This may fail on too old (NT4) platforms or if the calling process
- * is running on a SYSTEM account (like a service, ERROR_ACCESS_DENIED) on newer
- * platforms (however, this works on W2K!).
+ * This method requires Windows 2000 or later.  It may fail if the process is
+ * running under the SYSTEM account (like a service, ERROR_ACCESS_DENIED) on
+ * newer platforms (however, this works on W2K!).
  */
-static int rtProcWinCreateAsUser1(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 pwszExec, PRTUTF16 pwszCmdLine,
+static int rtProcWinCreateAsUser1(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 *ppwszExec, PRTUTF16 pwszCmdLine,
                                   RTENV hEnv, DWORD dwCreationFlags,
-                                  STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo, uint32_t fFlags)
+                                  STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo,
+                                  uint32_t fFlags, const char *pszExec)
 {
-    PFNCREATEPROCESSWITHLOGON pfnCreateProcessWithLogonW;
-    pfnCreateProcessWithLogonW = (PFNCREATEPROCESSWITHLOGON)RTLdrGetSystemSymbol("Advapi32.dll", "CreateProcessWithLogonW");
-    if (!pfnCreateProcessWithLogonW)
+    /* The CreateProcessWithLogonW API was introduced with W2K and later.  It uses a service
+       for launching the process. */
+    if (!g_pfnCreateProcessWithLogonW)
         return VERR_SYMBOL_NOT_FOUND;
 
-    PRTUTF16 pwszzBlock;
-    int rc = rtProcWinCreateEnvFromAccount(pwszUser, pwszPassword, NULL /* Domain */,
-                                           hEnv, &pwszzBlock);
+    /*
+     * Create the environment block and find the executable first.
+     *
+     * We try to skip this when RTPROC_FLAGS_PROFILE is set so we can sidestep
+     * potential missing TCB privilege issues when calling UserLogonW.  At least
+     * NT4 and W2K requires the trusted code base (TCB) privilege for logon use.
+     * Passing pwszzBlock=NULL and LOGON_WITH_PROFILE means the child process
+     * gets the environment specified by the user profile.
+     */
+    int      rc;
+    PRTUTF16 pwszzBlock = NULL;
+
+    /* Eliminating the path search flags simplifies things a little. */
+    if (   (fFlags & RTPROC_FLAGS_SEARCH_PATH)
+        && (RTPathHasPath(pszExec) || RTPathExists(pszExec)))
+        fFlags &= ~RTPROC_FLAGS_SEARCH_PATH;
+
+    /*
+     * No profile is simple, as is a user specified environment (no change record).
+     */
+    if (   !(fFlags & RTPROC_FLAGS_PROFILE)
+        || (   !(fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD)
+            && hEnv != RTENV_DEFAULT))
+        rc = rtProcWinCreateEnvBlockAndFindExe(fFlags, hEnv, pszExec, &pwszzBlock, ppwszExec);
+    /*
+     * Default profile environment without changes or path searching we leave
+     * to the service that implements the API.
+     */
+    else if (   hEnv == RTENV_DEFAULT
+             && !(fFlags & (RTPROC_FLAGS_ENV_CHANGE_RECORD | RTPROC_FLAGS_SEARCH_PATH)))
+    {
+        pwszzBlock = NULL;
+        rc = VINF_SUCCESS;
+    }
+    /*
+     * Otherwise, we need to get the user profile environment.
+     */
+    else
+    {
+        RTENV  hEnvToUse = NIL_RTENV;
+        HANDLE hToken;
+        rc = rtProcWinUserLogon(pwszUser, pwszPassword, NULL /* Domain */, &hToken);
+        if (RT_SUCCESS(rc))
+        {
+            /* CreateEnvFromToken docs says we should load the profile, though
+               we haven't observed any difference when not doing it.  Maybe it's
+               only an issue with roaming profiles or something similar... */
+            PROFILEINFOW ProfileInfo;
+            RT_ZERO(ProfileInfo);
+            ProfileInfo.dwSize     = sizeof(ProfileInfo);
+            ProfileInfo.lpUserName = pwszUser;
+            ProfileInfo.dwFlags    = PI_NOUI; /* Prevents the display of profile error messages. */
+
+            if (g_pfnLoadUserProfileW(hToken, &ProfileInfo))
+            {
+                /*
+                 * Do what we need to do.  Don't keep any temp environment object.
+                 */
+                rc = rtProcWinCreateEnvFromToken(hToken, hEnv, fFlags, &hEnvToUse);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = rtProcWinFindExe(fFlags, hEnv, pszExec, ppwszExec);
+                    if (RT_SUCCESS(rc))
+                        rc = RTEnvQueryUtf16Block(hEnvToUse, &pwszzBlock);
+                    if (hEnvToUse != hEnv)
+                        RTEnvDestroy(hEnvToUse);
+                }
+
+                if (!g_pfnUnloadUserProfile(hToken, ProfileInfo.hProfile))
+                    AssertFailed();
+            }
+            else
+                rc = RTErrConvertFromWin32(GetLastError());
+            CloseHandle(hToken);
+        }
+    }
     if (RT_SUCCESS(rc))
     {
-        BOOL fRc = pfnCreateProcessWithLogonW(pwszUser,
-                                              NULL,                       /* lpDomain*/
-                                              pwszPassword,
-                                              1 /*LOGON_WITH_PROFILE*/,   /* dwLogonFlags */
-                                              pwszExec,
-                                              pwszCmdLine,
-                                              dwCreationFlags,
-                                              pwszzBlock,
-                                              NULL,                       /* pCurrentDirectory */
-                                              pStartupInfo,
-                                              pProcInfo);
-        if (!fRc)
+        /*
+         * Create the process.
+         */
+        Assert(!(dwCreationFlags & CREATE_SUSPENDED));
+        bool const fCreatedSuspended = g_enmWinVer < kRTWinOSType_XP;
+        BOOL fRc = g_pfnCreateProcessWithLogonW(pwszUser,
+                                                NULL,                       /* lpDomain*/
+                                                pwszPassword,
+                                                fFlags & RTPROC_FLAGS_PROFILE ? 1 /*LOGON_WITH_ PROFILE*/ : 0,
+                                                *ppwszExec,
+                                                pwszCmdLine,
+                                                dwCreationFlags | (fCreatedSuspended ? CREATE_SUSPENDED : 0),
+                                                pwszzBlock,
+                                                NULL,                       /* pCurrentDirectory */
+                                                pStartupInfo,
+                                                pProcInfo);
+        if (fRc)
+        {
+            if (!fCreatedSuspended)
+                rc = VINF_SUCCESS;
+            else
+            {
+                /*
+                 * Duplicate standard handles into the child process, we ignore failures here as it's
+                 * legal to have bad standard handle values and we cannot dup console I/O handles.*
+                 */
+                PVOID pvDstProcParamCache = NULL;
+                rtProcWinDupStdHandleIntoChild(pStartupInfo->hStdInput, pProcInfo->hProcess,
+                                               RT_OFFSETOF(RTL_USER_PROCESS_PARAMETERS, StandardInput), &pvDstProcParamCache);
+                rtProcWinDupStdHandleIntoChild(pStartupInfo->hStdOutput, pProcInfo->hProcess,
+                                               RT_OFFSETOF(RTL_USER_PROCESS_PARAMETERS, StandardOutput), &pvDstProcParamCache);
+                rtProcWinDupStdHandleIntoChild(pStartupInfo->hStdError,  pProcInfo->hProcess,
+                                               RT_OFFSETOF(RTL_USER_PROCESS_PARAMETERS, StandardError), &pvDstProcParamCache);
+
+                if (ResumeThread(pProcInfo->hThread) != ~(DWORD)0)
+                    rc = VINF_SUCCESS;
+                else
+                    rc = RTErrConvertFromWin32(GetLastError());
+                if (RT_FAILURE(rc))
+                {
+                    TerminateProcess(pProcInfo->hProcess, 127);
+                    CloseHandle(pProcInfo->hThread);
+                    CloseHandle(pProcInfo->hProcess);
+                }
+            }
+        }
+        else
         {
             DWORD dwErr = GetLastError();
-            rc = rtProcWinMapErrorCodes(dwErr);
+            rc = RTErrConvertFromWin32(dwErr);
             if (rc == VERR_UNRESOLVED_ERROR)
-                LogRelFunc(("pfnCreateProcessWithLogonW (%p) failed: dwErr=%u (%#x), rc=%Rrc\n",
-                            pfnCreateProcessWithLogonW, dwErr, dwErr, rc));
+                LogRelFunc(("g_pfnCreateProcessWithLogonW (%p) failed: dwErr=%u (%#x), rc=%Rrc\n",
+                            g_pfnCreateProcessWithLogonW, dwErr, dwErr, rc));
         }
-        rtProcWinDestroyEnv(pwszzBlock);
+        if (pwszzBlock)
+            RTEnvFreeUtf16Block(pwszzBlock);
     }
     return rc;
 }
 
 
-static int rtProcWinCreateAsUser(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 pwszExec, PRTUTF16 pwszCmdLine,
+static int rtProcWinCreateAsUser(PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 *ppwszExec, PRTUTF16 pwszCmdLine,
                                  RTENV hEnv, DWORD dwCreationFlags,
-                                 STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo, uint32_t fFlags)
+                                 STARTUPINFOW *pStartupInfo, PROCESS_INFORMATION *pProcInfo,
+                                 uint32_t fFlags, const char *pszExec)
 {
     /*
-     * If we run as a service CreateProcessWithLogon will fail,
-     * so don't even try it (because of Local System context).
+     * If we run as a service CreateProcessWithLogon will fail, so don't even
+     * try it (because of Local System context).  This method is very slow on W2K.
      */
-    int rc = VERR_TRY_AGAIN;
     if (!(fFlags & RTPROC_FLAGS_SERVICE))
-        rc = rtProcWinCreateAsUser1(pwszUser, pwszPassword, pwszExec, pwszCmdLine, hEnv, dwCreationFlags, pStartupInfo, pProcInfo, fFlags);
-
-    /*
-     * Did the API call above fail because we're running on a too old OS (NT4) or
-     * we're running as a Windows service?
-     */
-    if (RT_FAILURE(rc))
-        rc = rtProcWinCreateAsUser2(pwszUser, pwszPassword, pwszExec, pwszCmdLine, hEnv, dwCreationFlags, pStartupInfo, pProcInfo, fFlags);
-
-    return rc;
+    {
+        int rc = rtProcWinCreateAsUser1(pwszUser, pwszPassword, ppwszExec, pwszCmdLine,
+                                        hEnv, dwCreationFlags, pStartupInfo, pProcInfo, fFlags, pszExec);
+        if (RT_SUCCESS(rc))
+            return rc;
+    }
+    return rtProcWinCreateAsUser2(pwszUser, pwszPassword, ppwszExec, pwszCmdLine,
+                                  hEnv, dwCreationFlags, pStartupInfo, pProcInfo, fFlags, pszExec);
 }
 
 
 /**
- * RTPathTraverseList callback used by RTProcCreateEx to locate the executable.
+ * RTPathTraverseList callback used by rtProcWinFindExe to locate the
+ * executable.
  */
 static DECLCALLBACK(int) rtPathFindExec(char const *pchPath, size_t cchPath, void *pvUser1, void *pvUser2)
 {
@@ -1074,6 +1755,133 @@ static DECLCALLBACK(int) rtPathFindExec(char const *pchPath, size_t cchPath, voi
 }
 
 
+/**
+ * Locate the executable file if necessary.
+ *
+ * @returns IPRT status code.
+ * @param   pszExec         The UTF-8 executable string passed in by the user.
+ * @param   fFlags          The process creation flags pass in by the user.
+ * @param   hEnv            The environment to get the path variabel from.
+ * @param   ppwszExec       Pointer to the variable pointing to the UTF-16
+ *                          converted string.  If we find something, the current
+ *                          pointer will be free (RTUtf16Free) and
+ *                          replaced by a new one.
+ */
+static int rtProcWinFindExe(uint32_t fFlags, RTENV hEnv, const char *pszExec, PRTUTF16 *ppwszExec)
+{
+    /*
+     * Return immediately if we're not asked to search, or if the file has a
+     * path already or if it actually exists in the current directory.
+     */
+    if (   !(fFlags & RTPROC_FLAGS_SEARCH_PATH)
+        || RTPathHavePath(pszExec)
+        || RTPathExists(pszExec) )
+        return VINF_SUCCESS;
+
+    /*
+     * Search the Path or PATH variable for the file.
+     */
+    char *pszPath;
+    if (RTEnvExistEx(hEnv, "PATH"))
+        pszPath = RTEnvDupEx(hEnv, "PATH");
+    else if (RTEnvExistEx(hEnv, "Path"))
+        pszPath = RTEnvDupEx(hEnv, "Path");
+    else
+        return VERR_FILE_NOT_FOUND;
+
+    char szRealExec[RTPATH_MAX];
+    int rc = RTPathTraverseList(pszPath, ';', rtPathFindExec, (void *)pszExec, &szRealExec[0]);
+    RTStrFree(pszPath);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Replace the executable string.
+         */
+        RTUtf16Free(*ppwszExec);
+        *ppwszExec = NULL;
+        rc = RTStrToUtf16(szRealExec, ppwszExec);
+    }
+    else if (rc == VERR_END_OF_STRING)
+        rc = VERR_FILE_NOT_FOUND;
+    return rc;
+}
+
+
+/**
+ * Creates the UTF-16 environment block and, if necessary, find the executable.
+ *
+ * @returns IPRT status code.
+ * @param   fFlags          The process creation flags pass in by the user.
+ * @param   hEnv            The environment handle passed by the user.
+ * @param   pszExec         See rtProcWinFindExe.
+ * @param   ppwszzBlock     Where RTEnvQueryUtf16Block returns the block.
+ * @param   ppwszExec       See rtProcWinFindExe.
+ */
+static int rtProcWinCreateEnvBlockAndFindExe(uint32_t fFlags, RTENV hEnv, const char *pszExec,
+                                             PRTUTF16 *ppwszzBlock, PRTUTF16 *ppwszExec)
+{
+    int rc;
+
+    /*
+     * In most cases, we just need to convert the incoming enviornment to a
+     * UTF-16 environment block.
+     */
+    RTENV hEnvToUse;
+    if (   !(fFlags & (RTPROC_FLAGS_PROFILE | RTPROC_FLAGS_ENV_CHANGE_RECORD))
+        || (hEnv == RTENV_DEFAULT && !(fFlags & RTPROC_FLAGS_PROFILE))
+        || (hEnv != RTENV_DEFAULT && !(fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD)) )
+    {
+        hEnvToUse = hEnv;
+        rc = VINF_SUCCESS;
+    }
+    else if (fFlags & RTPROC_FLAGS_PROFILE)
+    {
+        /*
+         * We need to get the profile environment for the current user.
+         */
+        Assert((fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD) || hEnv == RTENV_DEFAULT);
+        AssertReturn(g_pfnCreateEnvironmentBlock && g_pfnDestroyEnvironmentBlock, VERR_SYMBOL_NOT_FOUND);
+        AssertReturn(g_pfnLoadUserProfileW && g_pfnUnloadUserProfile, VERR_SYMBOL_NOT_FOUND);
+        HANDLE hToken;
+        if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE, &hToken))
+        {
+            rc = rtProcWinCreateEnvFromToken(hToken, hEnv, fFlags, &hEnvToUse);
+            CloseHandle(hToken);
+        }
+        else
+            rc = RTErrConvertFromWin32(GetLastError());
+    }
+    else
+    {
+        /*
+         * Apply hEnv as a change record on top of the default environment.
+         */
+        Assert(fFlags & RTPROC_FLAGS_ENV_CHANGE_RECORD);
+        rc = RTEnvClone(&hEnvToUse, RTENV_DEFAULT);
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTEnvApplyChanges(hEnvToUse, hEnv);
+            if (RT_FAILURE(rc))
+                RTEnvDestroy(hEnvToUse);
+        }
+    }
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Query the UTF-16 environment block and locate the executable (if needed).
+         */
+        rc = RTEnvQueryUtf16Block(hEnvToUse, ppwszzBlock);
+        if (RT_SUCCESS(rc))
+            rc = rtProcWinFindExe(fFlags, hEnvToUse, pszExec, ppwszExec);
+
+        if (hEnvToUse != hEnv)
+            RTEnvDestroy(hEnvToUse);
+    }
+
+    return rc;
+}
+
+
 RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArgs, RTENV hEnv, uint32_t fFlags,
                                PCRTHANDLE phStdIn, PCRTHANDLE phStdOut, PCRTHANDLE phStdErr, const char *pszAsUser,
                                const char *pszPassword, PRTPROCESS phProcess)
@@ -1097,26 +1905,10 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
      */
     int rc = RTOnce(&g_rtProcWinInitOnce, rtProcWinInitOnce, NULL);
     AssertRCReturn(rc, rc);
-
-    /*
-     * Resolve the executable name via the PATH if requested.
-     */
-    char szRealExec[RTPATH_MAX];
-    if (   (fFlags & RTPROC_FLAGS_SEARCH_PATH)
-        && !RTPathHavePath(pszExec)
-        && !RTPathExists(pszExec) )
+    if (pszAsUser || (fFlags & (RTPROC_FLAGS_PROFILE | RTPROC_FLAGS_SERVICE)))
     {
-        /* search */
-        char *pszPath;
-        if (RTEnvExistEx(hEnv, "PATH"))
-            pszPath = RTEnvDupEx(hEnv, "PATH");
-        else
-            pszPath = RTEnvDupEx(hEnv, "Path");
-        rc = RTPathTraverseList(pszPath, ';', rtPathFindExec, (void *)pszExec, &szRealExec[0]);
-        RTStrFree(pszPath);
-        if (RT_FAILURE(rc))
-            return rc == VERR_END_OF_STRING ? VERR_FILE_NOT_FOUND : rc;
-        pszExec = szRealExec;
+        rc = RTOnce(&g_rtProcWinResolveOnce, rtProcWinResolveOnce, NULL);
+        AssertRCReturn(rc, rc);
     }
 
     /*
@@ -1206,42 +1998,42 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
         }
 
     /*
-     * Create the environment block, command line and convert the executable
-     * name.
+     * Create the command line and convert the executable name.
      */
-    PRTUTF16 pwszzBlock;
-    if (RT_SUCCESS(rc))
-        rc = RTEnvQueryUtf16Block(hEnv, &pwszzBlock);
+    PRTUTF16 pwszCmdLine;
     if (RT_SUCCESS(rc))
-    {
-        PRTUTF16 pwszCmdLine;
         rc = RTGetOptArgvToUtf16String(&pwszCmdLine, papszArgs,
                                        !(fFlags & RTPROC_FLAGS_UNQUOTED_ARGS)
                                        ? RTGETOPTARGV_CNV_QUOTE_MS_CRT : RTGETOPTARGV_CNV_UNQUOTED);
+    if (RT_SUCCESS(rc))
+    {
+        PRTUTF16 pwszExec;
+        rc = RTStrToUtf16(pszExec, &pwszExec);
         if (RT_SUCCESS(rc))
         {
-            PRTUTF16 pwszExec;
-            rc = RTStrToUtf16(pszExec, &pwszExec);
-            if (RT_SUCCESS(rc))
-            {
-                /*
-                 * Get going...
-                 */
-                PROCESS_INFORMATION ProcInfo;
-                RT_ZERO(ProcInfo);
-                DWORD dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
-                if (fFlags & RTPROC_FLAGS_DETACHED)
-                    dwCreationFlags |= DETACHED_PROCESS;
-                if (fFlags & RTPROC_FLAGS_NO_WINDOW)
-                    dwCreationFlags |= CREATE_NO_WINDOW;
+            /*
+             * Get going...
+             */
+            PROCESS_INFORMATION ProcInfo;
+            RT_ZERO(ProcInfo);
+            DWORD dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
+            if (fFlags & RTPROC_FLAGS_DETACHED)
+                dwCreationFlags |= DETACHED_PROCESS;
+            if (fFlags & RTPROC_FLAGS_NO_WINDOW)
+                dwCreationFlags |= CREATE_NO_WINDOW;
 
-                /*
-                 * Only use the normal CreateProcess stuff if we have no user name
-                 * and we are not running from a (Windows) service. Otherwise use
-                 * the more advanced version in rtProcWinCreateAsUser().
-                 */
-                if (   pszAsUser == NULL
-                    && !(fFlags & RTPROC_FLAGS_SERVICE))
+            /*
+             * Only use the normal CreateProcess stuff if we have no user name
+             * and we are not running from a (Windows) service. Otherwise use
+             * the more advanced version in rtProcWinCreateAsUser().
+             */
+            if (   pszAsUser == NULL
+                && !(fFlags & RTPROC_FLAGS_SERVICE))
+            {
+                /* Create the environment block first. */
+                PRTUTF16 pwszzBlock;
+                rc = rtProcWinCreateEnvBlockAndFindExe(fFlags, hEnv, pszExec, &pwszzBlock, &pwszExec);
+                if (RT_SUCCESS(rc))
                 {
                     if (CreateProcessW(pwszExec,
                                        pwszCmdLine,
@@ -1256,51 +2048,53 @@ RTR3DECL(int)   RTProcCreateEx(const char *pszExec, const char * const *papszArg
                         rc = VINF_SUCCESS;
                     else
                         rc = RTErrConvertFromWin32(GetLastError());
+                    RTEnvFreeUtf16Block(pwszzBlock);
                 }
-                else
+            }
+            else
+            {
+                /*
+                 * Convert the additional parameters and use a helper
+                 * function to do the actual work.
+                 */
+                PRTUTF16 pwszUser;
+                rc = RTStrToUtf16(pszAsUser, &pwszUser);
+                if (RT_SUCCESS(rc))
                 {
-                    /*
-                     * Convert the additional parameters and use a helper
-                     * function to do the actual work.
-                     */
-                    PRTUTF16 pwszUser;
-                    rc = RTStrToUtf16(pszAsUser, &pwszUser);
+                    PRTUTF16 pwszPassword;
+                    rc = RTStrToUtf16(pszPassword ? pszPassword : "", &pwszPassword);
                     if (RT_SUCCESS(rc))
                     {
-                        PRTUTF16 pwszPassword;
-                        rc = RTStrToUtf16(pszPassword ? pszPassword : "", &pwszPassword);
-                        if (RT_SUCCESS(rc))
-                        {
-                            rc = rtProcWinCreateAsUser(pwszUser, pwszPassword,
-                                                       pwszExec, pwszCmdLine, hEnv, dwCreationFlags,
-                                                       &StartupInfo, &ProcInfo, fFlags);
+                        rc = rtProcWinCreateAsUser(pwszUser, pwszPassword,
+                                                   &pwszExec, pwszCmdLine, hEnv, dwCreationFlags,
+                                                   &StartupInfo, &ProcInfo, fFlags, pszExec);
 
-                            RTUtf16Free(pwszPassword);
-                        }
-                        RTUtf16Free(pwszUser);
+                        if (pwszPassword && *pwszPassword)
+                            RTMemWipeThoroughly(pwszPassword, RTUtf16Len(pwszPassword), 5);
+                        RTUtf16Free(pwszPassword);
                     }
+                    RTUtf16Free(pwszUser);
                 }
-                if (RT_SUCCESS(rc))
+            }
+            if (RT_SUCCESS(rc))
+            {
+                CloseHandle(ProcInfo.hThread);
+                if (phProcess)
                 {
-                    CloseHandle(ProcInfo.hThread);
-                    if (phProcess)
-                    {
-                        /*
-                         * Add the process to the child process list so
-                         * RTProcWait can reuse and close the process handle.
-                         */
-                        rtProcWinAddPid(ProcInfo.dwProcessId, ProcInfo.hProcess);
-                        *phProcess = ProcInfo.dwProcessId;
-                    }
-                    else
-                        CloseHandle(ProcInfo.hProcess);
-                    rc = VINF_SUCCESS;
+                    /*
+                     * Add the process to the child process list so
+                     * RTProcWait can reuse and close the process handle.
+                     */
+                    rtProcWinAddPid(ProcInfo.dwProcessId, ProcInfo.hProcess);
+                    *phProcess = ProcInfo.dwProcessId;
                 }
-                RTUtf16Free(pwszExec);
+                else
+                    CloseHandle(ProcInfo.hProcess);
+                rc = VINF_SUCCESS;
             }
-            RTUtf16Free(pwszCmdLine);
+            RTUtf16Free(pwszExec);
         }
-        RTEnvFreeUtf16Block(pwszzBlock);
+        RTUtf16Free(pwszCmdLine);
     }
 
     /* Undo any handle inherit changes. */
@@ -1457,41 +2251,57 @@ RTR3DECL(uint64_t) RTProcGetAffinityMask(void)
 }
 
 
-RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser,
-                                  size_t *pcbUser)
+RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser, size_t *pcbUser)
 {
     AssertReturn(   (pszUser && cbUser > 0)
                  || (!pszUser && !cbUser), VERR_INVALID_PARAMETER);
+    AssertReturn(pcbUser || pszUser, VERR_INVALID_PARAMETER);
 
-    if (hProcess != RTProcSelf())
-        return VERR_NOT_SUPPORTED;
-
-    RTUTF16 awszUserName[UNLEN + 1];
-    DWORD   cchUserName = UNLEN + 1;
-
-    if (!GetUserNameW(&awszUserName[0], &cchUserName))
-        return RTErrConvertFromWin32(GetLastError());
-
-    char *pszUserName = NULL;
-    int rc = RTUtf16ToUtf8(awszUserName, &pszUserName);
-    if (RT_SUCCESS(rc))
+    int rc;
+    if (   hProcess == NIL_RTPROCESS
+        || hProcess == RTProcSelf())
     {
-        size_t cbUserName = strlen(pszUserName) + 1;
-
-        if (pcbUser)
-            *pcbUser = cbUserName;
-
-        if (cbUserName > cbUser)
-            rc = VERR_BUFFER_OVERFLOW;
-        else
+        RTUTF16 wszUsername[UNLEN + 1];
+        DWORD   cwcUsername = RT_ELEMENTS(wszUsername);
+        if (GetUserNameW(&wszUsername[0], &cwcUsername))
         {
-            memcpy(pszUser, pszUserName, cbUserName);
-            rc = VINF_SUCCESS;
+            if (pszUser)
+            {
+                rc = RTUtf16ToUtf8Ex(wszUsername, cwcUsername, &pszUser, cbUser, pcbUser);
+                if (pcbUser)
+                    *pcbUser += 1;
+            }
+            else
+            {
+                *pcbUser = RTUtf16CalcUtf8Len(wszUsername) + 1;
+                rc = VERR_BUFFER_OVERFLOW;
+            }
         }
-
-        RTStrFree(pszUserName);
+        else
+            rc = RTErrConvertFromWin32(GetLastError());
     }
+    else
+        rc = VERR_NOT_SUPPORTED;
+    return rc;
+}
+
 
+RTR3DECL(int) RTProcQueryUsernameA(RTPROCESS hProcess, char **ppszUser)
+{
+    AssertPtrReturn(ppszUser, VERR_INVALID_POINTER);
+    int rc;
+    if (   hProcess == NIL_RTPROCESS
+        || hProcess == RTProcSelf())
+    {
+        RTUTF16 wszUsername[UNLEN + 1];
+        DWORD   cwcUsername = RT_ELEMENTS(wszUsername);
+        if (GetUserNameW(&wszUsername[0], &cwcUsername))
+            rc = RTUtf16ToUtf8(wszUsername, ppszUser);
+        else
+            rc = RTErrConvertFromWin32(GetLastError());
+    }
+    else
+        rc = VERR_NOT_SUPPORTED;
     return rc;
 }
 
diff --git a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp b/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp
index 947f7e4..8e99b77 100644
--- a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp
+++ b/src/VBox/Runtime/r3/win/vcc100-kernel32-fakes.cpp
@@ -29,6 +29,9 @@
 *   Header Files                                                                                                                 *
 *********************************************************************************************************************************/
 #include <iprt/cdefs.h>
+#include <iprt/types.h>
+#include <iprt/asm.h>
+#include <iprt/string.h>
 
 #ifndef RT_ARCH_X86
 # error "This code is X86 only"
@@ -39,12 +42,34 @@
 #define InitializeCriticalSectionAndSpinCount   Ignore_InitializeCriticalSectionAndSpinCount
 #define HeapSetInformation                      Ignore_HeapSetInformation
 #define HeapQueryInformation                    Ignore_HeapQueryInformation
+#define CreateTimerQueue                        Ignore_CreateTimerQueue
+#define CreateTimerQueueTimer                   Ignore_CreateTimerQueueTimer
+#define DeleteTimerQueueTimer                   Ignore_DeleteTimerQueueTimer
+#define InitializeSListHead                     Ignore_InitializeSListHead
+#define InterlockedFlushSList                   Ignore_InterlockedFlushSList
+#define InterlockedPopEntrySList                Ignore_InterlockedPopEntrySList
+#define InterlockedPushEntrySList               Ignore_InterlockedPushEntrySList
+#define QueryDepthSList                         Ignore_QueryDepthSList
+#define VerifyVersionInfoA                      Ignore_VerifyVersionInfoA
+#define VerSetConditionMask                     Ignore_VerSetConditionMask
+
 #include <Windows.h>
+
 #undef DecodePointer
 #undef EncodePointer
 #undef InitializeCriticalSectionAndSpinCount
 #undef HeapSetInformation
 #undef HeapQueryInformation
+#undef CreateTimerQueue
+#undef CreateTimerQueueTimer
+#undef DeleteTimerQueueTimer
+#undef InitializeSListHead
+#undef InterlockedFlushSList
+#undef InterlockedPopEntrySList
+#undef InterlockedPushEntrySList
+#undef QueryDepthSList
+#undef VerifyVersionInfoA
+#undef VerSetConditionMask
 
 
 #ifndef HEAP_STANDARD
@@ -52,13 +77,29 @@
 #endif
 
 
-/** @todo Try dynamically resolve the functions the first time one of them is
- *        called. */
+/** Dynamically resolves an kernel32 API.   */
+#define RESOLVE_ME(ApiNm) \
+    static bool volatile    s_fInitialized = false; \
+    static decltype(ApiNm) *s_pfnApi = NULL; \
+    decltype(ApiNm)        *pfnApi; \
+    if (!s_fInitialized) \
+        pfnApi = s_pfnApi; \
+    else \
+    { \
+        pfnApi = (decltype(pfnApi))GetProcAddress(GetModuleHandleW(L"kernel32"), #ApiNm); \
+        s_pfnApi = pfnApi; \
+        s_fInitialized = true; \
+    } do {} while (0) \
+
 
 extern "C"
 __declspec(dllexport) PVOID WINAPI
 DecodePointer(PVOID pvEncoded)
 {
+    RESOLVE_ME(DecodePointer);
+    if (pfnApi)
+        return pfnApi(pvEncoded);
+
     /*
      * Fallback code.
      */
@@ -70,6 +111,10 @@ extern "C"
 __declspec(dllexport) PVOID WINAPI
 EncodePointer(PVOID pvNative)
 {
+    RESOLVE_ME(EncodePointer);
+    if (pfnApi)
+        return pfnApi(pvNative);
+
     /*
      * Fallback code.
      */
@@ -81,6 +126,9 @@ extern "C"
 __declspec(dllexport) BOOL WINAPI
 InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION pCritSect, DWORD cSpin)
 {
+    RESOLVE_ME(InitializeCriticalSectionAndSpinCount);
+    if (pfnApi)
+        return pfnApi(pCritSect, cSpin);
 
     /*
      * Fallback code.
@@ -94,6 +142,10 @@ extern "C"
 __declspec(dllexport) BOOL WINAPI
 HeapSetInformation(HANDLE hHeap, HEAP_INFORMATION_CLASS enmInfoClass, PVOID pvBuf, SIZE_T cbBuf)
 {
+    RESOLVE_ME(HeapSetInformation);
+    if (pfnApi)
+        return pfnApi(hHeap, enmInfoClass, pvBuf, cbBuf);
+
     /*
      * Fallback code.
      */
@@ -119,6 +171,9 @@ extern "C"
 __declspec(dllexport) BOOL WINAPI
 HeapQueryInformation(HANDLE hHeap, HEAP_INFORMATION_CLASS enmInfoClass, PVOID pvBuf, SIZE_T cbBuf, PSIZE_T pcbRet)
 {
+    RESOLVE_ME(HeapQueryInformation);
+    if (pfnApi)
+        return pfnApi(hHeap, enmInfoClass, pvBuf, cbBuf, pcbRet);
 
     /*
      * Fallback code.
@@ -139,3 +194,238 @@ HeapQueryInformation(HANDLE hHeap, HEAP_INFORMATION_CLASS enmInfoClass, PVOID pv
     return FALSE;
 }
 
+
+/* These are used by INTEL\mt_obj\Timer.obj: */
+
+extern "C"
+__declspec(dllexport)
+HANDLE WINAPI CreateTimerQueue(void)
+{
+    RESOLVE_ME(CreateTimerQueue);
+    if (pfnApi)
+        return pfnApi();
+    SetLastError(ERROR_NOT_SUPPORTED);
+    return NULL;
+}
+
+extern "C"
+__declspec(dllexport)
+BOOL WINAPI CreateTimerQueueTimer(PHANDLE phTimer, HANDLE hTimerQueue, WAITORTIMERCALLBACK pfnCallback, PVOID pvUser,
+                                  DWORD msDueTime, DWORD msPeriod, ULONG fFlags)
+{
+    RESOLVE_ME(CreateTimerQueueTimer);
+    if (pfnApi)
+        return pfnApi(phTimer, hTimerQueue, pfnCallback, pvUser, msDueTime, msPeriod, fFlags);
+    SetLastError(ERROR_NOT_SUPPORTED);
+    return FALSE;
+}
+
+extern "C"
+__declspec(dllexport)
+BOOL WINAPI DeleteTimerQueueTimer(HANDLE hTimerQueue, HANDLE hTimer, HANDLE hEvtCompletion)
+{
+    RESOLVE_ME(DeleteTimerQueueTimer);
+    if (pfnApi)
+        return pfnApi(hTimerQueue, hTimer, hEvtCompletion);
+    SetLastError(ERROR_NOT_SUPPORTED);
+    return FALSE;
+}
+
+/* This is used by several APIs. */
+
+extern "C"
+__declspec(dllexport)
+VOID WINAPI InitializeSListHead(PSLIST_HEADER pHead)
+{
+    RESOLVE_ME(InitializeSListHead);
+    if (pfnApi)
+        pfnApi(pHead);
+    else /* fallback: */
+        pHead->Alignment = 0;
+}
+
+
+extern "C"
+__declspec(dllexport)
+PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER pHead)
+{
+    RESOLVE_ME(InterlockedFlushSList);
+    if (pfnApi)
+        return pfnApi(pHead);
+
+    /* fallback: */
+    PSLIST_ENTRY pRet = NULL;
+    if (pHead->Next.Next)
+    {
+        for (;;)
+        {
+            SLIST_HEADER OldHead = *pHead;
+            SLIST_HEADER NewHead;
+            NewHead.Alignment = 0;
+            NewHead.Sequence  = OldHead.Sequence + 1;
+            if (ASMAtomicCmpXchgU64(&pHead->Alignment, NewHead.Alignment, OldHead.Alignment))
+            {
+                pRet = OldHead.Next.Next;
+                break;
+            }
+        }
+    }
+    return pRet;
+}
+
+extern "C"
+__declspec(dllexport)
+PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER pHead)
+{
+    RESOLVE_ME(InterlockedPopEntrySList);
+    if (pfnApi)
+        return pfnApi(pHead);
+
+    /* fallback: */
+    PSLIST_ENTRY pRet = NULL;
+    for (;;)
+    {
+        SLIST_HEADER OldHead = *pHead;
+        pRet = OldHead.Next.Next;
+        if (pRet)
+        {
+            SLIST_HEADER NewHead;
+            __try
+            {
+                NewHead.Next.Next = pRet->Next;
+            }
+            __except(EXCEPTION_EXECUTE_HANDLER)
+            {
+                continue;
+            }
+            NewHead.Depth     = OldHead.Depth - 1;
+            NewHead.Sequence  = OldHead.Sequence + 1;
+            if (ASMAtomicCmpXchgU64(&pHead->Alignment, NewHead.Alignment, OldHead.Alignment))
+                break;
+        }
+        else
+            break;
+    }
+    return pRet;
+}
+
+extern "C"
+__declspec(dllexport)
+PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER pHead, PSLIST_ENTRY pEntry)
+{
+    RESOLVE_ME(InterlockedPushEntrySList);
+    if (pfnApi)
+        return pfnApi(pHead, pEntry);
+
+    /* fallback: */
+    PSLIST_ENTRY pRet = NULL;
+    for (;;)
+    {
+        SLIST_HEADER OldHead = *pHead;
+        pRet = OldHead.Next.Next;
+        pEntry->Next = pRet;
+        SLIST_HEADER NewHead;
+        NewHead.Next.Next = pEntry;
+        NewHead.Depth     = OldHead.Depth + 1;
+        NewHead.Sequence  = OldHead.Sequence + 1;
+        if (ASMAtomicCmpXchgU64(&pHead->Alignment, NewHead.Alignment, OldHead.Alignment))
+            break;
+    }
+    return pRet;
+}
+
+extern "C"
+__declspec(dllexport)
+WORD WINAPI QueryDepthSList(PSLIST_HEADER pHead)
+{
+    RESOLVE_ME(QueryDepthSList);
+    if (pfnApi)
+        return pfnApi(pHead);
+    return pHead->Depth;
+}
+
+
+/* curl drags these in: */
+extern "C"
+__declspec(dllexport)
+BOOL WINAPI VerifyVersionInfoA(LPOSVERSIONINFOEXA pInfo, DWORD fTypeMask, DWORDLONG fConditionMask)
+{
+    RESOLVE_ME(VerifyVersionInfoA);
+    if (pfnApi)
+        return pfnApi(pInfo, fTypeMask, fConditionMask);
+
+    /* fallback to make curl happy: */
+    OSVERSIONINFOEXA VerInfo;
+    RT_ZERO(VerInfo);
+    VerInfo.dwOSVersionInfoSize = sizeof(VerInfo);
+    if (!GetVersionEx((OSVERSIONINFO *)&VerInfo))
+    {
+        RT_ZERO(VerInfo);
+        VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+        AssertReturn(GetVersionEx((OSVERSIONINFO *)&VerInfo), FALSE);
+    }
+
+    BOOL fRet = TRUE;
+    for (unsigned i = 0; i < 8 && fRet; i++)
+        if (fTypeMask & RT_BIT_32(i))
+        {
+            uint32_t uLeft, uRight;
+            switch (RT_BIT_32(i))
+            {
+#define MY_CASE(a_Num, a_Member) case a_Num: uLeft = VerInfo.a_Member; uRight = pInfo->a_Member; break
+                MY_CASE(VER_MINORVERSION,       dwMinorVersion);
+                MY_CASE(VER_MAJORVERSION,       dwMajorVersion);
+                MY_CASE(VER_BUILDNUMBER,        dwBuildNumber);
+                MY_CASE(VER_PLATFORMID,         dwPlatformId);
+                MY_CASE(VER_SERVICEPACKMINOR,   wServicePackMinor);
+                MY_CASE(VER_SERVICEPACKMAJOR,   wServicePackMinor);
+                MY_CASE(VER_SUITENAME,          wSuiteMask);
+                MY_CASE(VER_PRODUCT_TYPE,       wProductType);
+#undef  MY_CASE
+                default: uLeft = uRight = 0; AssertFailed();
+            }
+            switch ((uint8_t)(fConditionMask >> (i*8)))
+            {
+                case VER_EQUAL:             fRet = uLeft == uRight; break;
+                case VER_GREATER:           fRet = uLeft >  uRight; break;
+                case VER_GREATER_EQUAL:     fRet = uLeft >= uRight; break;
+                case VER_LESS:              fRet = uLeft <  uRight; break;
+                case VER_LESS_EQUAL:        fRet = uLeft <= uRight; break;
+                case VER_AND:               fRet = (uLeft & uRight) == uRight; break;
+                case VER_OR:                fRet = (uLeft & uRight) != 0; break;
+                default:                    fRet = FALSE; AssertFailed(); break;
+            }
+        }
+
+    return fRet;
+}
+
+extern "C"
+__declspec(dllexport)
+ULONGLONG WINAPI VerSetConditionMask(ULONGLONG fConditionMask, DWORD fTypeMask, BYTE bOperator)
+{
+    RESOLVE_ME(VerSetConditionMask);
+    if (pfnApi)
+        return pfnApi(fConditionMask, fTypeMask, bOperator);
+
+    /* fallback: */
+    for (unsigned i = 0; i < 8; i++)
+        if (fTypeMask & RT_BIT_32(i))
+        {
+            uint64_t fMask  = 0xff << (i*8);
+            fConditionMask &= ~fMask;
+            fConditionMask |= (uint64_t)bOperator << (i*8);
+
+        }
+    return fConditionMask;
+}
+
+
+
+/* Dummy to force dragging in this object in the link, so the linker
+   won't accidentally use the symbols from kernel32. */
+extern "C" int vcc100_kernel32_fakes_cpp(void)
+{
+    return 42;
+}
+
diff --git a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm b/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
index 42fc780..33fb13c 100644
--- a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
+++ b/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
@@ -17,11 +17,23 @@ __imp__ %+ %1 %+ @ %+ %2:
 
 
 BEGINDATA
+GLOBALNAME vcc100_kernel32_fakes_asm
 
 MAKE_IMPORT_ENTRY DecodePointer, 4
 MAKE_IMPORT_ENTRY EncodePointer, 4
 MAKE_IMPORT_ENTRY InitializeCriticalSectionAndSpinCount, 8
 MAKE_IMPORT_ENTRY HeapSetInformation, 16
 MAKE_IMPORT_ENTRY HeapQueryInformation, 20
+MAKE_IMPORT_ENTRY CreateTimerQueue, 0
+MAKE_IMPORT_ENTRY CreateTimerQueueTimer, 28
+MAKE_IMPORT_ENTRY DeleteTimerQueueTimer, 12
+MAKE_IMPORT_ENTRY InitializeSListHead, 4
+MAKE_IMPORT_ENTRY InterlockedFlushSList, 4
+MAKE_IMPORT_ENTRY InterlockedPopEntrySList, 4
+MAKE_IMPORT_ENTRY InterlockedPushEntrySList, 8
+MAKE_IMPORT_ENTRY QueryDepthSList, 4
+MAKE_IMPORT_ENTRY VerifyVersionInfoA, 16
+MAKE_IMPORT_ENTRY VerSetConditionMask, 16
+
 
 
diff --git a/src/VBox/Runtime/r3/win/vcc100-msvcrt-fakes.cpp b/src/VBox/Runtime/r3/win/vcc100-msvcrt-fakes.cpp
new file mode 100644
index 0000000..8a345c0
--- /dev/null
+++ b/src/VBox/Runtime/r3/win/vcc100-msvcrt-fakes.cpp
@@ -0,0 +1,82 @@
+/* $Id: vcc100-msvcrt-fakes.cpp $ */
+/** @file
+ * IPRT - Tricks to make the Visual C++ 2010 CRT work on NT4, W2K and XP.
+ */
+
+/*
+ * Copyright (C) 2012-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#include <iprt/assert.h>
+#include <stdlib.h>
+
+
+#ifndef RT_ARCH_X86
+# error "This code is X86 only"
+#endif
+
+
+
+/* This one is static in libcmt, fortunately no rocket science.  */
+extern "C" void __cdecl my_initterm(PFNRT *papfnStart, PFNRT *papfnEnd)
+{
+    for (; (uintptr_t)papfnStart < (uintptr_t)papfnEnd; papfnStart++)
+        if (*papfnStart)
+            (*papfnStart)();
+}
+
+extern "C" PFNRT __cdecl my_dllonexit(PFNRT pfnToAdd, PFNRT **ppapfnStart, PFNRT **ppapfnEnd)
+{
+    /* This is _very_ crude, but it'll probably do for our purposes... */
+    size_t cItems = *ppapfnEnd - *ppapfnStart;
+    *ppapfnStart = (PFNRT *)realloc(*ppapfnStart, (cItems + 1) * sizeof(**ppapfnStart));
+    (*ppapfnStart)[cItems] = pfnToAdd;
+    *ppapfnEnd = &(*ppapfnStart)[cItems + 1];
+    return pfnToAdd;
+}
+
+extern "C" int _newmode;
+extern "C" int __cdecl __setargv(void);
+extern "C" int __cdecl _setargv(void);
+
+extern "C" int __cdecl my_getmainargs(int *pcArgs, char ***ppapszArgs, char ***ppapszEnv, int fDoWildcardExp, int *pfNewMode)
+{
+    _newmode = *pfNewMode;
+
+    Assert(!fDoWildcardExp);
+    int rc = _setargv();
+    if (rc >= 0)
+    {
+        *pcArgs     = __argc;
+        *ppapszArgs = __argv;
+        *ppapszEnv  = _environ;
+    }
+    return rc;
+}
+
+extern "C" void __cdecl my_setusermatherr(PFNRT pfnIgnore)
+{
+    /* pure stub. */
+}
+
diff --git a/src/VBox/Runtime/r3/win/RTSystemQueryTotalRam-win.cpp b/src/VBox/Runtime/r3/win/vcc100-ntdll-fakes.cpp
similarity index 55%
copy from src/VBox/Runtime/r3/win/RTSystemQueryTotalRam-win.cpp
copy to src/VBox/Runtime/r3/win/vcc100-ntdll-fakes.cpp
index 3449d19..3c7b8db 100644
--- a/src/VBox/Runtime/r3/win/RTSystemQueryTotalRam-win.cpp
+++ b/src/VBox/Runtime/r3/win/vcc100-ntdll-fakes.cpp
@@ -1,10 +1,10 @@
-/* $Id: RTSystemQueryTotalRam-win.cpp $ */
+/* $Id: vcc100-ntdll-fakes.cpp $ */
 /** @file
- * IPRT - RTSystemQueryTotalRam, windows ring-3.
+ * IPRT - Tricks to make the Visual C++ 2010 CRT work on NT4, W2K and XP - NTDLL.DLL.
  */
 
 /*
- * Copyright (C) 2010-2015 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,40 +28,48 @@
 /*********************************************************************************************************************************
 *   Header Files                                                                                                                 *
 *********************************************************************************************************************************/
-#include <windows.h>
-#include <iprt/system.h>
-#include "internal/iprt.h"
+#include <iprt/cdefs.h>
+#include <iprt/types.h>
 
-#include <iprt/err.h>
-#include <iprt/assert.h>
-#include <iprt/string.h>
+#ifndef RT_ARCH_X86
+# error "This code is X86 only"
+#endif
+
+#include <Windows.h>
 
 
-RTDECL(int) RTSystemQueryTotalRam(uint64_t *pcb)
-{
-    MEMORYSTATUSEX MemStatus;
 
-    AssertPtrReturn(pcb, VERR_INVALID_POINTER);
+/** Dynamically resolves an kernel32 API.   */
+#define RESOLVE_ME(ApiNm) \
+    static bool volatile    s_fInitialized = false; \
+    static decltype(ApiNm) *s_pfnApi = NULL; \
+    decltype(ApiNm)        *pfnApi; \
+    if (!s_fInitialized) \
+        pfnApi = s_pfnApi; \
+    else \
+    { \
+        pfnApi = (decltype(pfnApi))GetProcAddress(GetModuleHandleW(L"ntdll.dll"), #ApiNm); \
+        s_pfnApi = pfnApi; \
+        s_fInitialized = true; \
+    } do {} while (0) \
 
-    MemStatus.dwLength = sizeof(MemStatus);
-    if (!GlobalMemoryStatusEx(&MemStatus))
-        return RTErrConvertFromWin32(GetLastError());
 
-    *pcb = MemStatus.ullTotalPhys;
-    return VINF_SUCCESS;
+extern "C"
+__declspec(dllexport)
+ULONG WINAPI RtlGetLastWin32Error(VOID)
+{
+    RESOLVE_ME(RtlGetLastWin32Error);
+    if (pfnApi)
+        return pfnApi();
+    return GetLastError();
 }
 
 
-RTDECL(int) RTSystemQueryAvailableRam(uint64_t *pcb)
+/* Dummy to force dragging in this object in the link, so the linker
+   won't accidentally use the symbols from kernel32. */
+extern "C" int vcc100_ntdll_fakes_cpp(void)
 {
-    MEMORYSTATUSEX MemStatus;
-
-    AssertPtrReturn(pcb, VERR_INVALID_POINTER);
+    return 42;
+}
 
-    MemStatus.dwLength = sizeof(MemStatus);
-    if (!GlobalMemoryStatusEx(&MemStatus))
-        return RTErrConvertFromWin32(GetLastError());
 
-    *pcb = MemStatus.ullAvailPhys;
-    return VINF_SUCCESS;
-}
diff --git a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm b/src/VBox/Runtime/r3/win/vcc100-ntdll-fakesA.asm
similarity index 54%
copy from src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
copy to src/VBox/Runtime/r3/win/vcc100-ntdll-fakesA.asm
index 42fc780..6b18c8a 100644
--- a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
+++ b/src/VBox/Runtime/r3/win/vcc100-ntdll-fakesA.asm
@@ -1,5 +1,4 @@
 
-
 %include "iprt/asmdefs.mac"
 
 %ifndef RT_ARCH_X86
@@ -17,11 +16,7 @@ __imp__ %+ %1 %+ @ %+ %2:
 
 
 BEGINDATA
+GLOBALNAME vcc100_ntdll_fakes_asm
 
-MAKE_IMPORT_ENTRY DecodePointer, 4
-MAKE_IMPORT_ENTRY EncodePointer, 4
-MAKE_IMPORT_ENTRY InitializeCriticalSectionAndSpinCount, 8
-MAKE_IMPORT_ENTRY HeapSetInformation, 16
-MAKE_IMPORT_ENTRY HeapQueryInformation, 20
-
+MAKE_IMPORT_ENTRY RtlGetLastWin32Error, 0
 
diff --git a/src/VBox/Runtime/r3/win/vcc100-ws2_32-fakes.cpp b/src/VBox/Runtime/r3/win/vcc100-ws2_32-fakes.cpp
new file mode 100644
index 0000000..5bfc9fd
--- /dev/null
+++ b/src/VBox/Runtime/r3/win/vcc100-ws2_32-fakes.cpp
@@ -0,0 +1,103 @@
+/* $Id: vcc100-ws2_32-fakes.cpp $ */
+/** @file
+ * IPRT - Tricks to make the Visual C++ 2010 CRT work on NT4, W2K and XP - WS2_32.DLL.
+ */
+
+/*
+ * Copyright (C) 2012-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#include <iprt/cdefs.h>
+#include <iprt/types.h>
+#include <iprt/asm.h>
+#include <iprt/string.h>
+
+#ifndef RT_ARCH_X86
+# error "This code is X86 only"
+#endif
+
+#define getaddrinfo                             Ignore_getaddrinfo
+#define freeaddrinfo                            Ignore_freeaddrinfo
+
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
+#undef getaddrinfo
+#undef freeaddrinfo
+
+
+/** Dynamically resolves an kernel32 API.   */
+#define RESOLVE_ME(ApiNm) \
+    static bool volatile    s_fInitialized = false; \
+    static decltype(ApiNm) *s_pfnApi = NULL; \
+    decltype(ApiNm)        *pfnApi; \
+    if (!s_fInitialized) \
+        pfnApi = s_pfnApi; \
+    else \
+    { \
+        pfnApi = (decltype(pfnApi))GetProcAddress(GetModuleHandleW(L"wc2_32.dll"), #ApiNm); \
+        s_pfnApi = pfnApi; \
+        s_fInitialized = true; \
+    } do {} while (0) \
+
+
+extern "C"
+__declspec(dllexport)
+int WINAPI getaddrinfo(const char *pszNodeName, const char *pszServiceName, const struct addrinfo *pHints,
+                       struct addrinfo **ppResults)
+{
+    RESOLVE_ME(getaddrinfo);
+    if (pfnApi)
+        return pfnApi(pszNodeName, pszServiceName, pHints, ppResults);
+
+    /** @todo  fallback */
+    WSASetLastError(WSAEAFNOSUPPORT);
+    return WSAEAFNOSUPPORT;
+}
+
+
+
+extern "C"
+__declspec(dllexport)
+void WINAPI freeaddrinfo(struct addrinfo *pResults)
+{
+    RESOLVE_ME(freeaddrinfo);
+    if (pfnApi)
+        pfnApi(pResults);
+    else
+    {
+        Assert(!pResults);
+        /** @todo  fallback */
+    }
+}
+
+
+
+/* Dummy to force dragging in this object in the link, so the linker
+   won't accidentally use the symbols from kernel32. */
+extern "C" int vcc100_ws2_32_fakes_cpp(void)
+{
+    return 42;
+}
+
diff --git a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm b/src/VBox/Runtime/r3/win/vcc100-ws2_32-fakesA.asm
similarity index 54%
copy from src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
copy to src/VBox/Runtime/r3/win/vcc100-ws2_32-fakesA.asm
index 42fc780..21a4d20 100644
--- a/src/VBox/Runtime/r3/win/vcc100-kernel32-fakesA.asm
+++ b/src/VBox/Runtime/r3/win/vcc100-ws2_32-fakesA.asm
@@ -1,5 +1,4 @@
 
-
 %include "iprt/asmdefs.mac"
 
 %ifndef RT_ARCH_X86
@@ -17,11 +16,8 @@ __imp__ %+ %1 %+ @ %+ %2:
 
 
 BEGINDATA
+GLOBALNAME vcc100_ws2_32_fakes_asm
 
-MAKE_IMPORT_ENTRY DecodePointer, 4
-MAKE_IMPORT_ENTRY EncodePointer, 4
-MAKE_IMPORT_ENTRY InitializeCriticalSectionAndSpinCount, 8
-MAKE_IMPORT_ENTRY HeapSetInformation, 16
-MAKE_IMPORT_ENTRY HeapQueryInformation, 20
-
+MAKE_IMPORT_ENTRY getaddrinfo, 16
+MAKE_IMPORT_ENTRY freeaddrinfo, 4
 
diff --git a/src/VBox/Runtime/testcase/tstRTProcCreateEx.cpp b/src/VBox/Runtime/testcase/tstRTProcCreateEx.cpp
index 220666c..03c5d75 100644
--- a/src/VBox/Runtime/testcase/tstRTProcCreateEx.cpp
+++ b/src/VBox/Runtime/testcase/tstRTProcCreateEx.cpp
@@ -53,7 +53,8 @@
 /*********************************************************************************************************************************
 *   Global Variables                                                                                                             *
 *********************************************************************************************************************************/
-static char g_szExecName[RTPATH_MAX];
+static RTENV g_hEnvInitial = NIL_RTENV;
+static char  g_szExecName[RTPATH_MAX];
 
 
 static const char * const g_apszArgs4[] =
@@ -81,88 +82,317 @@ static const char * const g_apszArgs4[] =
 };
 
 
-static int tstRTCreateProcEx5Child(int argc, char **argv)
+static int tstRTCreateProcEx6Child(int argc, char **argv)
 {
     int rc = RTR3InitExeNoArguments(0);
     if (RT_FAILURE(rc))
         return RTMsgInitFailure(rc);
 
-#ifdef RT_OS_WINDOWS
-    char szUser[_1K];
-    DWORD cbLen = sizeof(szUser);
-    /** @todo Does not yet handle ERROR_MORE_DATA for user names longer than 32767. */
-    if (!GetUserName(szUser, &cbLen))
+    int cErrors = 0;
+    char szValue[_16K];
+
+    /*
+     * Check for the environment variable we've set in the parent process.
+     */
+    if (argc >= 3 && strcmp(argv[2], "inherit") == 0)
     {
-        RTPrintf("GetUserName failed with last error=%ld\n", GetLastError());
-        return RTEXITCODE_FAILURE;
+        if (!RTEnvExistEx(RTENV_DEFAULT, "testcase-child-6"))
+        {
+            RTStrmPrintf(g_pStdErr, "child6: Env.var. 'testcase-child-6' was not inherited from parent\n");
+            cErrors++;
+        }
     }
-# if 0 /* Does not work on NT4 (yet). */
-    DWORD cbSid = 0;
-    DWORD cbDomain = 0;
-    SID_NAME_USE sidUse;
-    /* First try to figure out how much space for SID + domain name we need. */
-    BOOL bRet = LookupAccountName(NULL /* current system*/,
-                                  szUser,
-                                  NULL,
-                                  &cbSid,
-                                  NULL,
-                                  &cbDomain,
-                                  &sidUse);
-    if (!bRet)
+    else if (argc >= 3 && strstr(argv[2], "change-record") != NULL)
     {
-        DWORD dwErr = GetLastError();
-        if (dwErr != ERROR_INSUFFICIENT_BUFFER)
+        rc = RTEnvGetEx(RTENV_DEFAULT, "testcase-child-6", szValue, sizeof(szValue), NULL);
+        if (RT_SUCCESS(rc) && strcmp(szValue, "changed"))
         {
-            RTPrintf("LookupAccountName(1) failed with last error=%ld\n", dwErr);
-            return RTEXITCODE_FAILURE;
+            RTStrmPrintf(g_pStdErr, "child6: Env.var. 'testcase-child-6'='%s', expected 'changed'.\n", szValue);
+            cErrors++;
         }
+        else if (RT_FAILURE(rc))
+        {
+            RTStrmPrintf(g_pStdErr, "child6: RTEnvGetEx(,'testcase-child-6',,) -> %Rrc\n", rc);
+            cErrors++;
+        }
+    }
+    else
+    {
+        if (RTEnvExistEx(RTENV_DEFAULT, "testcase-child-6"))
+        {
+            RTStrmPrintf(g_pStdErr, "child6: Env.var. 'testcase-child-6' was inherited from parent\n");
+            cErrors++;
+        }
+    }
+
+    /*
+     * Check the user name if present we didn't inherit from parent.
+     */
+    if (   argc >= 4
+        && argv[3][0] != '\0'
+        && strstr(argv[2], "noinherit") != NULL)
+    {
+        static struct
+        {
+            const char *pszVarNm;
+            bool fReq;
+        } const s_aVars[] =
+        {
+#ifdef RT_OS_WINDOWS
+            { "USERNAME", true },
+#else
+            { "LOGNAME",  true },
+            { "USER",    false },
+#endif
+        };
+        for (unsigned i = 0; i < RT_ELEMENTS(s_aVars); i++)
+        {
+            rc = RTEnvGetEx(RTENV_DEFAULT, s_aVars[i].pszVarNm, szValue, sizeof(szValue), NULL);
+            if (RT_SUCCESS(rc))
+            {
+                if (strcmp(szValue, argv[3]))
+                {
+                    RTStrmPrintf(g_pStdErr, "child6: env.var. '%s'='%s', expected '%s'\n",
+                                 s_aVars[i].pszVarNm, szValue, argv[3]);
+                    cErrors++;
+                }
+            }
+            else if (rc != VERR_ENV_VAR_NOT_FOUND || s_aVars[i].fReq)
+            {
+                RTStrmPrintf(g_pStdErr, "child6: RTGetEnv('%s') -> %Rrc\n", s_aVars[i].pszVarNm, rc);
+                cErrors++;
+            }
+        }
+    }
+
+#if 1
+    /* For manual testing. */
+    if (strcmp(argv[2],"noinherit") == 0)
+    //if (strcmp(argv[2],"noinherit-change-record") == 0)
+    {
+        RTENV hEnv;
+        rc = RTEnvClone(&hEnv, RTENV_DEFAULT);
+        if (RT_SUCCESS(rc))
+        {
+            uint32_t cVars = RTEnvCountEx(hEnv);
+            for (uint32_t i = 0; i < cVars; i++)
+            {
+                char szVarNm[_1K];
+                rc = RTEnvGetByIndexEx(hEnv, i, szVarNm, sizeof(szVarNm), szValue, sizeof(szValue));
+                if (RT_SUCCESS(rc))
+                    RTStrmPrintf(g_pStdErr, "child6: #%u: %s=%s\n", i, szVarNm, szValue);
+                else
+                {
+                    RTStrmPrintf(g_pStdErr, "child6: #%u: %Rrc\n", rc);
+                    cErrors++;
+                }
+            }
+            RTEnvDestroy(hEnv);
+        }
+        else
+        {
+            RTStrmPrintf(g_pStdErr, "child6: RTEnvClone failed: %Rrc\n", rc);
+            cErrors++;
+        }
+    }
+#endif
+
+    return cErrors == 0 ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
+}
+
+static void tstRTCreateProcEx6(const char *pszAsUser, const char *pszPassword)
+{
+    RTTestISub("Profile environment");
+
+    const char *apszArgs[5] =
+    {
+        g_szExecName,
+        "--testcase-child-6",
+        "inherit",
+        pszAsUser,
+        NULL
+    };
+
+    RTTESTI_CHECK_RC_RETV(RTEnvSetEx(RTENV_DEFAULT, "testcase-child-6", "true"), VINF_SUCCESS);
+
+    /* Use the process environment first. */
+    RTPROCESS hProc;
+    RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/,
+                                         NULL, NULL, NULL, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
+    RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
+    RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
+
+    if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
+        RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
+
+    /* Use the process environment first with a little change. */
+    apszArgs[2] = "change-record";
+    RTENV hEnvChange;
+    RTTESTI_CHECK_RC_RETV(RTEnvCreateChangeRecord(&hEnvChange), VINF_SUCCESS);
+    RTTESTI_CHECK_RC_RETV(RTEnvSetEx(hEnvChange, "testcase-child-6", "changed"), VINF_SUCCESS);
+    int rc;
+    RTTESTI_CHECK_RC(rc = RTProcCreateEx(g_szExecName, apszArgs, hEnvChange, RTPROC_FLAGS_ENV_CHANGE_RECORD,
+                                         NULL, NULL, NULL, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
+    if (RT_SUCCESS(rc))
+    {
+        ProcStatus.enmReason = RTPROCEXITREASON_ABEND;
+        ProcStatus.iStatus   = -1;
+        RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
+
+        if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
+            RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
     }
 
-    /* Now try getting the real SID + domain name. */
-    SID *pSid = (SID *)RTMemAlloc(cbSid);
-    AssertPtr(pSid);
-    char *pszDomain = (char *)RTMemAlloc(cbDomain); /* Size in TCHAR! */
-    AssertPtr(pszDomain);
-
-    if (!LookupAccountName(NULL /* Current system */,
-                           szUser,
-                           pSid,
-                           &cbSid,
-                           pszDomain,
-                           &cbDomain,
-                           &sidUse))
+
+    /* Use profile environment this time. */
+    apszArgs[2] = "noinherit";
+    RTTESTI_CHECK_RC(rc = RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, RTPROC_FLAGS_PROFILE,
+                                         NULL, NULL, NULL, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
+    if (RT_SUCCESS(rc))
     {
-        RTPrintf("LookupAccountName(2) failed with last error=%ld\n", GetLastError());
-        return RTEXITCODE_FAILURE;
+        ProcStatus.enmReason = RTPROCEXITREASON_ABEND;
+        ProcStatus.iStatus   = -1;
+        RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
+
+        if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
+            RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
     }
-    RTMemFree(pSid);
-    RTMemFree(pszDomain);
-# endif
+
+    /* Use profile environment this time. */
+    apszArgs[2] = "noinherit-change-record";
+    RTTESTI_CHECK_RC(rc = RTProcCreateEx(g_szExecName, apszArgs, hEnvChange,
+                                         RTPROC_FLAGS_PROFILE | RTPROC_FLAGS_ENV_CHANGE_RECORD,
+                                         NULL, NULL, NULL, pszAsUser, pszPassword, &hProc), VINF_SUCCESS);
+    if (RT_SUCCESS(rc))
+    {
+        ProcStatus.enmReason = RTPROCEXITREASON_ABEND;
+        ProcStatus.iStatus   = -1;
+        RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
+
+        if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
+            RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
+    }
+
+
+    RTTESTI_CHECK_RC(RTEnvDestroy(hEnvChange), VINF_SUCCESS);
+
+    /*
+     * Restore the environment and check that the PROFILE flag didn't mess with
+     * the process environment.  (Note! The bug may be elsewhere as well.)
+     */
+    RTTESTI_CHECK_RC(RTEnvUnsetEx(RTENV_DEFAULT, "testcase-child-6"), VINF_SUCCESS);
+
+    RTENV hEnvCur;
+    RTTESTI_CHECK_RC_RETV(RTEnvClone(&hEnvCur, RTENV_DEFAULT), VINF_SUCCESS);
+    uint32_t cCurrent = RTEnvCountEx(hEnvCur);
+    uint32_t cInitial = RTEnvCountEx(g_hEnvInitial);
+    RTTESTI_CHECK_MSG(cInitial == cInitial, ("cCurrent=%u cInitial=%u\n", cCurrent, cInitial));
+    uint32_t    cVars1;
+    RTENV       hEnv1,    hEnv2;
+    const char *pszEnv1, *pszEnv2;
+    if (cCurrent >= cInitial)
+    {
+        hEnv1   = hEnvCur;
+        pszEnv1 = "current";
+        cVars1  = cCurrent;
+        hEnv2   = g_hEnvInitial;
+        pszEnv2 = "initial";
+    }
+    else
+    {
+        hEnv2   = hEnvCur;
+        pszEnv2 = "current";
+        hEnv1   = g_hEnvInitial;
+        pszEnv1 = "initial";
+        cVars1  = cInitial;
+    }
+    for (uint32_t i = 0; i < cVars1; i++)
+    {
+        char szValue1[_16K];
+        char szVarNm[_1K];
+        rc = RTEnvGetByIndexEx(hEnv1, i, szVarNm, sizeof(szVarNm), szValue1, sizeof(szValue1));
+        if (RT_SUCCESS(rc))
+        {
+            char szValue2[_16K];
+            rc = RTEnvGetEx(hEnv2, szVarNm, szValue2, sizeof(szValue2), NULL);
+            if (RT_SUCCESS(rc))
+            {
+                if (strcmp(szValue1, szValue2) != 0)
+                {
+                    RTTestIFailed("Variable '%s' differs", szVarNm);
+                    RTTestIFailureDetails("%s: '%s'\n"
+                                          "%s: '%s'\n",
+                                          pszEnv1, szValue1,
+                                          pszEnv2, szValue2);
+                }
+            }
+            else
+                RTTestIFailed("RTEnvGetEx(%s,%s,,) failed: %Rrc", pszEnv2, szVarNm, rc);
+
+        }
+        else
+            RTTestIFailed("RTEnvGetByIndexEx(%s,%u,,,,) failed: %Rrc", pszEnv1, i, rc);
+    }
+}
+
+
+static int tstRTCreateProcEx5Child(int argc, char **argv)
+{
+    int rc = RTR3InitExe(argc, &argv, 0);
+    if (RT_FAILURE(rc))
+        return RTMsgInitFailure(rc);
+
+    uint32_t cErrors = 0;
+
+    /* Check that the OS thinks we're running as the user we're supposed to. */
+    char *pszUser;
+    rc = RTProcQueryUsernameA(NIL_RTPROCESS, &pszUser);
+    if (RT_SUCCESS(rc))
+    {
+#ifdef RT_OS_WINDOWS
+        if (RTStrICmp(pszUser, argv[2]) != 0)
 #else
-    /** @todo Lookup UID/effective UID, maybe GID? */
+        if (RTStrCmp(pszUser, argv[2]) != 0)
 #endif
-    return RTEXITCODE_SUCCESS;
+        {
+            RTStrmPrintf(g_pStdErr, "child4: user name is '%s', expected '%s'\n", pszUser, argv[2]);
+            cErrors++;
+        }
+        RTStrFree(pszUser);
+    }
+    else
+    {
+        RTStrmPrintf(g_pStdErr, "child4: RTProcQueryUsernameA failed: %Rrc\n", rc);
+        cErrors++;
+    }
+
+    return cErrors == 0 ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
 }
 
 static void tstRTCreateProcEx5(const char *pszUser, const char *pszPassword)
 {
     RTTestISubF("As user \"%s\" with password \"%s\"", pszUser, pszPassword);
+    RTTESTI_CHECK_RETV(pszUser && *pszUser);
 
-    const char * apszArgs[3] =
+    const char * apszArgs[] =
     {
         "test", /* user name */
         "--testcase-child-5",
+        pszUser,
         NULL
     };
 
+    /* Test for invalid logons. */
     RTPROCESS hProc;
+    int rc = RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL, NULL, NULL,
+                            "non-existing-user", "wrong-password", &hProc);
+    if (rc != VERR_AUTHENTICATION_FAILURE && rc != VERR_PRIVILEGE_NOT_HELD && rc != VERR_PROC_TCB_PRIV_NOT_HELD)
+        RTTestIFailed("rc=%Rrc");
 
-    /* Test for invalid logons. */
-    RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
-                                         NULL, NULL, "non-existing-user", "wrong-password", &hProc), VERR_AUTHENTICATION_FAILURE);
     /* Test for invalid application. */
-    RTTESTI_CHECK_RC_RETV(RTProcCreateEx("non-existing-app", apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
-                                         NULL, NULL, NULL, NULL, &hProc), VERR_FILE_NOT_FOUND);
+    RTTESTI_CHECK_RC(RTProcCreateEx("non-existing-app", apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
+                                    NULL, NULL, NULL, NULL, &hProc), VERR_FILE_NOT_FOUND);
+
     /* Test a (hopefully) valid user/password logon (given by parameters of this function). */
     RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
                                          NULL, NULL, pszUser, pszPassword, &hProc), VINF_SUCCESS);
@@ -409,6 +639,9 @@ static void tstRTCreateProcEx1(const char *pszAsUser, const char *pszPassword)
 
 int main(int argc, char **argv)
 {
+    /*
+     * Deal with child processes first.
+     */
     if (argc == 2 && !strcmp(argv[1], "--testcase-child-1"))
         return tstRTCreateProcEx1Child();
     if (argc == 2 && !strcmp(argv[1], "--testcase-child-2"))
@@ -417,8 +650,14 @@ int main(int argc, char **argv)
         return tstRTCreateProcEx3Child();
     if (argc >= 5 && !strcmp(argv[1], "--testcase-child-4"))
         return tstRTCreateProcEx4Child(argc, argv);
-    if (argc == 2 && !strcmp(argv[1], "--testcase-child-5"))
+    if (argc >= 2 && !strcmp(argv[1], "--testcase-child-5"))
         return tstRTCreateProcEx5Child(argc, argv);
+    if (argc >= 2 && !strcmp(argv[1], "--testcase-child-6"))
+        return tstRTCreateProcEx6Child(argc, argv);
+
+    /*
+     * Main process.
+     */
     const char *pszAsUser   = NULL;
     const char *pszPassword = NULL;
     if (argc != 1)
@@ -435,8 +674,12 @@ int main(int argc, char **argv)
         return rc;
     RTTestBanner(hTest);
 
+    /*
+     * Init globals.
+     */
     if (!RTProcGetExecutablePath(g_szExecName, sizeof(g_szExecName)))
         RTStrCopy(g_szExecName, sizeof(g_szExecName), argv[0]);
+    RTTESTI_CHECK_RC(RTEnvClone(&g_hEnvInitial, RTENV_DEFAULT), VINF_SUCCESS);
 
     /*
      * The tests.
@@ -447,8 +690,12 @@ int main(int argc, char **argv)
     tstRTCreateProcEx4(pszAsUser, pszPassword);
     if (pszAsUser)
         tstRTCreateProcEx5(pszAsUser, pszPassword);
+    tstRTCreateProcEx6(pszAsUser, pszPassword);
+
     /** @todo Cover files, ++ */
 
+    RTEnvDestroy(g_hEnvInitial);
+
     /*
      * Summary.
      */
diff --git a/src/VBox/Runtime/testcase/tstRTProcQueryUsername.cpp b/src/VBox/Runtime/testcase/tstRTProcQueryUsername.cpp
index fd26d3b..679e503 100644
--- a/src/VBox/Runtime/testcase/tstRTProcQueryUsername.cpp
+++ b/src/VBox/Runtime/testcase/tstRTProcQueryUsername.cpp
@@ -34,30 +34,42 @@
 #include <iprt/process.h>
 #include <iprt/test.h>
 
+
 static void tstRTProcQueryUsername(void)
 {
-    char abUser[1024];
-    size_t cbUser;
-    char *pszUser = NULL;
-
     RTTestISub("Basics");
 
-    memset(abUser, 0, sizeof(abUser));
-    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 8, &cbUser), VERR_INVALID_PARAMETER);
-    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), abUser, 0, &cbUser), VERR_INVALID_PARAMETER);
-    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 0, NULL), VERR_BUFFER_OVERFLOW);
-    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 0, &cbUser), VERR_BUFFER_OVERFLOW);
+    size_t  cbUser;
+    char    szUser[1024];
+    memset(szUser, '-', sizeof(szUser));
 
-    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), abUser, sizeof(abUser), &cbUser), VINF_SUCCESS);
-    RTTestPrintf(NULL, RTTESTLVL_ALWAYS, "Username: %s\n", abUser);
-    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), abUser, cbUser - 1, &cbUser), VERR_BUFFER_OVERFLOW);
+    /* negative stuff that may assert: */
+    bool fMayPanic = RTAssertSetMayPanic(false);
+    bool fQuiet    = RTAssertSetQuiet(true);
 
+    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 8, &cbUser), VERR_INVALID_PARAMETER);
+    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), szUser, 0, &cbUser), VERR_INVALID_PARAMETER);
+    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 0, NULL), VERR_INVALID_PARAMETER);
     RTTESTI_CHECK_RC(RTProcQueryUsernameA(RTProcSelf(), NULL), VERR_INVALID_POINTER);
+
+    RTAssertSetMayPanic(fMayPanic);
+    RTAssertSetQuiet(fQuiet);
+
+    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 0, &cbUser), VERR_BUFFER_OVERFLOW);
+    memset(szUser, '-', sizeof(szUser));
+    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), szUser, cbUser - 1, &cbUser), VERR_BUFFER_OVERFLOW);
+    memset(szUser, '-', sizeof(szUser));
+    RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), szUser, sizeof(szUser), &cbUser), VINF_SUCCESS);
+    RTTestPrintf(NULL, RTTESTLVL_ALWAYS, "Username: %s\n", szUser); /* */
+
+    char *pszUser = NULL;
     RTTESTI_CHECK_RC(RTProcQueryUsernameA(RTProcSelf(), &pszUser), VINF_SUCCESS);
     RTTestPrintf(NULL, RTTESTLVL_ALWAYS, "Username: %s\n", pszUser);
+    RTTESTI_CHECK(strcmp(pszUser, szUser) == 0);
     RTStrFree(pszUser);
 }
 
+
 int main(int argc, char **argv)
 {
     /*
diff --git a/src/VBox/Runtime/testcase/tstRTUri.cpp b/src/VBox/Runtime/testcase/tstRTUri.cpp
index adc1ab5..958f0bd 100644
--- a/src/VBox/Runtime/testcase/tstRTUri.cpp
+++ b/src/VBox/Runtime/testcase/tstRTUri.cpp
@@ -40,145 +40,246 @@
 *   Test data                                                                                                                    *
 *********************************************************************************************************************************/
 
-static const char *g_apcszTestURIs[] =
+static struct
 {
-    "foo://tt:tt@example.com:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "foo://tt:tt@example.com:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret",
-    "foo://tt:tt@example.com:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
-    "foo:tt at example.com",
-    "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "urn:example:animal:ferret:nose",
-    "foo:?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "foo:#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "foo://tt:tt@example.com:8042/?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "foo://tt:tt@example.com:8042/",
-    "foo://tt:tt@example.com:8042?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "foo://tt:tt@example.com:8042#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
-    "foo://tt:tt@example.com:8042",
-    "foo:///",
-    "foo://"
-};
-
-static const char *g_apcszSchemeResult[] =
-{
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "urn",
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "foo",
-    "foo"
-};
-
-static const char *g_apcszAuthorityResult[] =
-{
-    "tt:tt at example.com:8042",
-    "tt:tt at example.com:8042",
-    "tt:tt at example.com:8042",
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    "tt:tt at example.com:8042",
-    "tt:tt at example.com:8042",
-    "tt:tt at example.com:8042",
-    "tt:tt at example.com:8042",
-    "tt:tt at example.com:8042",
-    NULL,
-    NULL
-};
-
-static const char *g_apcszPathResult[] =
-{
-    "/over/ <>#%\"{}|^[]`/there",
-    "/over/ <>#%\"{}|^[]`/there",
-    "/over/ <>#%\"{}|^[]`/there",
-    "tt at example.com",
-    "/over/ <>#%\"{}|^[]`/there",
-    "/over/ <>#%\"{}|^[]`/there",
-    "example:animal:ferret:nose",
-    NULL,
-    NULL,
-    "/",
-    "/",
-    NULL,
-    NULL,
-    NULL,
-    "/",
-    NULL
-};
-
-static const char *g_apcszQueryResult[] =
+    const char *pszUri;
+    const char *pszScheme;
+    const char *pszAuthority;
+    const char *pszPath;
+    const char *pszQuery;
+    const char *pszFragment;
+
+    const char *pszUsername;
+    const char *pszPassword;
+    const char *pszHost;
+    uint32_t    uPort;
+
+    const char *pszCreated;
+} g_aTests[] =
 {
-    "name= <>#%\"{}|^[]`ferret",
-    "name= <>#%\"{}|^[]`ferret",
-    NULL,
-    NULL,
-    "name= <>#%\"{}|^[]`ferret",
-    NULL,
-    NULL,
-    "name= <>#%\"{}|^[]`ferret",
-    NULL,
-    "name= <>#%\"{}|^[]`ferret",
-    NULL,
-    "name= <>#%\"{}|^[]`ferret",
-    NULL,
-    NULL,
-    NULL,
-    NULL
+    {   /* #0 */
+        "foo://tt:yt@example.com:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ "/over/ <>#%\"{}|^[]`/there",
+        /*.pszQuery     =*/ "name= <>#%\"{}|^[]`ferret",
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #1 */
+        "foo://tt:yt@example.com:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ "/over/ <>#%\"{}|^[]`/there",
+        /*.pszQuery     =*/ "name= <>#%\"{}|^[]`ferret",
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #2 */
+        "foo://tt:yt@example.com:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ "/over/ <>#%\"{}|^[]`/there",
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #3 */
+        "foo:tt at example.com",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ NULL,
+        /*.pszPath      =*/ "tt at example.com",
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #4 */
+        "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ NULL,
+        /*.pszPath      =*/ "/over/ <>#%\"{}|^[]`/there",
+        /*.pszQuery     =*/ "name= <>#%\"{}|^[]`ferret",
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #5 */
+        "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ NULL,
+        /*.pszPath      =*/ "/over/ <>#%\"{}|^[]`/there",
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #6 */
+        "urn:example:animal:ferret:nose",
+        /*.pszScheme    =*/ "urn",
+        /*.pszAuthority =*/ NULL,
+        /*.pszPath      =*/ "example:animal:ferret:nose",
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #7 */
+        "foo:?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ NULL,
+        /*.pszPath      =*/ NULL,
+        /*.pszQuery     =*/ "name= <>#%\"{}|^[]`ferret",
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #8 */
+        "foo:#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ NULL,
+        /*.pszPath      =*/ NULL,
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #9 */
+        "foo://tt:yt@example.com:8042/?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ "/",
+        /*.pszQuery     =*/ "name= <>#%\"{}|^[]`ferret",
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #10 */
+        "foo://tt:yt@example.com:8042/",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ "/",
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #11 */
+        "foo://tt:yt@example.com:8042?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ NULL,
+        /*.pszQuery     =*/ "name= <>#%\"{}|^[]`ferret",
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #12 */
+        "foo://tt:yt@example.com:8042#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ NULL,
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ "nose <>#%\"{}|^[]`",
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #13 */
+        "foo://tt:yt@example.com:8042",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "tt:yt at example.com:8042",
+        /*.pszPath      =*/ NULL,
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ "tt",
+        /*.pszPassword  =*/ "yt",
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ 8042,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #14 */
+        "foo:///",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "",
+        /*.pszPath      =*/ "/",
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #15 */
+        "foo://",
+        /*.pszScheme    =*/ "foo",
+        /*.pszAuthority =*/ "",
+        /*.pszPath      =*/ NULL,
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ NULL,
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ NULL /* same as pszUri*/,
+    },
+    {   /* #16 - UTF-8 escape sequences. */
+        "http://example.com/%ce%b3%ce%bb%cf%83%ce%b1%20%e0%a4%95\xe0\xa4\x95",
+        /*.pszScheme    =*/ "http",
+        /*.pszAuthority =*/ "example.com",
+        /*.pszPath      =*/ "/\xce\xb3\xce\xbb\xcf\x83\xce\xb1 \xe0\xa4\x95\xe0\xa4\x95",
+        /*.pszQuery     =*/ NULL,
+        /*.pszFragment  =*/ NULL,
+        /*.pszUsername  =*/ NULL,
+        /*.pszPassword  =*/ NULL,
+        /*.pszHost      =*/ "example.com",
+        /*.uPort        =*/ UINT32_MAX,
+        /*.pszCreated   =*/ "http://example.com/\xce\xb3\xce\xbb\xcf\x83\xce\xb1%20\xe0\xa4\x95\xe0\xa4\x95",
+    },
 };
 
-static const char *g_apcszFragmentResult[] =
-{
-    "nose <>#%\"{}|^[]`",
-    NULL,
-    NULL,
-    NULL,
-    "nose <>#%\"{}|^[]`",
-    "nose <>#%\"{}|^[]`",
-    NULL,
-    "nose <>#%\"{}|^[]`",
-    "nose <>#%\"{}|^[]`",
-    "nose <>#%\"{}|^[]`",
-    NULL,
-    "nose <>#%\"{}|^[]`",
-    "nose <>#%\"{}|^[]`",
-    NULL,
-    NULL,
-    NULL
-};
-
-static const char *g_apcszCreateURIs[][5] =
-{
-    { "foo", "tt:tt at example.com:8042", "/over/ <>#%\"{}|^[]`/there", "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
-    { "foo", "tt:tt at example.com:8042", "/over/ <>#%\"{}|^[]`/there", "name= <>#%\"{}|^[]`ferret", NULL },
-    { "foo", "tt:tt at example.com:8042", "/over/ <>#%\"{}|^[]`/there", NULL, NULL },
-    { "foo", NULL, "tt at example.com", NULL, NULL },
-    { "foo", NULL, "/over/ <>#%\"{}|^[]`/there", "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
-    { "foo", NULL, "/over/ <>#%\"{}|^[]`/there", NULL,  "nose <>#%\"{}|^[]`" },
-    { "urn", NULL, "example:animal:ferret:nose", NULL, NULL },
-    { "foo", NULL, NULL, "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
-    { "foo", NULL, NULL, NULL, "nose <>#%\"{}|^[]`" },
-    { "foo", "tt:tt at example.com:8042", "/", "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
-    { "foo", "tt:tt at example.com:8042", "/", NULL, NULL },
-    { "foo", "tt:tt at example.com:8042", NULL, "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
-    { "foo", "tt:tt at example.com:8042", NULL, NULL, "nose <>#%\"{}|^[]`" },
-    { "foo", "tt:tt at example.com:8042", NULL, NULL, NULL },
-    { "foo", "", "/", NULL, NULL },
-    { "foo", "", NULL, NULL, NULL }
-};
 
 struct URIFILETEST
 {
@@ -192,129 +293,53 @@ g_apCreateFileURIs[] =
     { "/over/ <>#%\"{}|^[]`/there", "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there", URI_FILE_FORMAT_UNIX },
     { "/", "file:///", URI_FILE_FORMAT_UNIX },
     { "/C:/over/ <>#%\"{}|^[]`/there", "file:///C:%5Cover%5C%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60%5Cthere", URI_FILE_FORMAT_UNIX },
-    { "over\\ <>#%\"{}|^[]`\\there", "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there", URI_FILE_FORMAT_WIN }
+    { "\\over\\ <>#%\"{}|^[]`\\there", "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there", URI_FILE_FORMAT_WIN }
 };
 
-/**
- * Basic API checks.
- */
-static void tstScheme(size_t iCount, const char *pszUri, const char *pszTest)
-{
-    char *pszResult = RTUriScheme(pszUri);
-    if (pszTest)
-    {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
-    }
-    else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-
-    if (pszResult)
-        RTStrFree(pszResult);
-}
-
-static void tstAuthority(size_t iCount, const char *pszUri, const char *pszTest)
-{
-    char *pszResult = RTUriAuthority(pszUri);
-    if (pszTest)
-    {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
-    }
-    else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
 
-    if (pszResult)
-        RTStrFree(pszResult);
-}
 
-static void tstPath(size_t iCount, const char *pszUri, const char *pszTest)
-{
-    char *pszResult = RTUriPath(pszUri);
-    if (pszTest)
-    {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
-    }
-    else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-
-    if (pszResult)
-        RTStrFree(pszResult);
-}
-
-static void tstQuery(size_t iCount, const char *pszUri, const char *pszTest)
-{
-    char *pszResult = RTUriQuery(pszUri);
-    if (pszTest)
-    {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
-    }
-    else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-
-    if (pszResult)
-        RTStrFree(pszResult);
-}
-
-static void tstFragment(size_t iCount, const char *pszUri, const char *pszTest)
-{
-    char *pszResult = RTUriFragment(pszUri);
-    if (pszTest)
-    {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
-    }
-    else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-
-    if (pszResult)
-        RTStrFree(pszResult);
-}
-
-static void tstCreate(size_t iCount, const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery, const char *pszFragment, const char *pszTest)
+static void tstCreate(size_t idxTest, const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery, const char *pszFragment, const char *pszTest)
 {
     char *pszResult = RTUriCreate(pszScheme, pszAuthority, pszPath, pszQuery, pszFragment);
     if (pszTest)
     {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
+        RTTESTI_CHECK_MSG_RETV(pszResult, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
+        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
     }
     else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
+        RTTESTI_CHECK_MSG(!pszResult, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
 
     if (pszResult)
         RTStrFree(pszResult);
     return;
 }
 
-static void tstFileCreate(size_t iCount, const char *pszPath, const char *pszTest)
+static void tstFileCreate(size_t idxTest, const char *pszPath, const char *pszTest)
 {
     char *pszResult = RTUriFileCreate(pszPath);
     if (pszTest)
     {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
+        RTTESTI_CHECK_MSG_RETV(pszResult, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
+        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
     }
     else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
+        RTTESTI_CHECK_MSG(!pszResult, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
 
     if (pszResult)
         RTStrFree(pszResult);
     return;
 }
 
-static void tstFilePath(size_t iCount, const char *pszUri, const char *pszTest, uint32_t uFormat)
+static void tstFilePath(size_t idxTest, const char *pszUri, const char *pszTest, uint32_t uFormat)
 {
     char *pszResult = RTUriFilePath(pszUri, uFormat);
     if (pszTest)
     {
-        RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
-        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
+        RTTESTI_CHECK_MSG_RETV(pszResult, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
+        RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
     }
     else
-        RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
+        RTTESTI_CHECK_MSG(!pszResult, ("#%u: Result '%s' != '%s'", idxTest, pszResult, pszTest));
 
     if (pszResult)
         RTStrFree(pszResult);
@@ -329,52 +354,58 @@ int main()
         return rc;
     RTTestBanner(hTest);
 
-    /* Scheme */
-    RTTestISubF("RTUriScheme");
-    Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszSchemeResult));
-    for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
-        tstScheme(i+1, g_apcszTestURIs[i], g_apcszSchemeResult[i]);
-
-    /* Authority */
-    RTTestISubF("RTUriAuthority");
-    Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszAuthorityResult));
-    for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
-        tstAuthority(i+1, g_apcszTestURIs[i], g_apcszAuthorityResult[i]);
-
-    /* Path */
-    RTTestISubF("RTUriPath");
-    Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszPathResult));
-    for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
-        tstPath(i+1, g_apcszTestURIs[i], g_apcszPathResult[i]);
-
-    /* Query */
-    RTTestISubF("RTUriQuery");
-    Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszQueryResult));
-    for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
-        tstQuery(i+1, g_apcszTestURIs[i], g_apcszQueryResult[i]);
-
-    /* Fragment */
-    RTTestISubF("RTUriFragment");
-    Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszFragmentResult));
-    for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
-        tstFragment(i+1, g_apcszTestURIs[i], g_apcszFragmentResult[i]);
+#define CHECK_STR_API(a_Call, a_pszExpected) \
+        do { \
+            char *pszTmp = a_Call; \
+            if (a_pszExpected) \
+            { \
+                if (!pszTmp) \
+                    RTTestIFailed("#%u: %s returns NULL, expected '%s'", i, #a_Call, a_pszExpected); \
+                else if (strcmp(pszTmp, a_pszExpected)) \
+                        RTTestIFailed("#%u: %s returns '%s', expected '%s'", i, #a_Call, pszTmp, a_pszExpected); \
+            } \
+            else if (pszTmp) \
+                RTTestIFailed("#%u: %s returns '%s', expected NULL", i, #a_Call, pszTmp); \
+            RTStrFree(pszTmp); \
+        } while (0)
+
+    RTTestISub("RTUriParse & RTUriParsed*");
+    for (uint32_t i = 0; i < RT_ELEMENTS(g_aTests); i++)
+    {
+        RTURIPARSED Parsed;
+        RTTESTI_CHECK_RC(rc = RTUriParse(g_aTests[i].pszUri, &Parsed), VINF_SUCCESS);
+        if (RT_SUCCESS(rc))
+        {
+            CHECK_STR_API(RTUriParsedScheme(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszScheme);
+            CHECK_STR_API(RTUriParsedAuthority(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszAuthority);
+            CHECK_STR_API(RTUriParsedAuthorityUsername(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszUsername);
+            CHECK_STR_API(RTUriParsedAuthorityPassword(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszPassword);
+            CHECK_STR_API(RTUriParsedAuthorityHost(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszHost);
+            CHECK_STR_API(RTUriParsedPath(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszPath);
+            CHECK_STR_API(RTUriParsedQuery(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszQuery);
+            CHECK_STR_API(RTUriParsedFragment(g_aTests[i].pszUri, &Parsed), g_aTests[i].pszFragment);
+            uint32_t uPort = RTUriParsedAuthorityPort(g_aTests[i].pszUri, &Parsed);
+            if (uPort != g_aTests[i].uPort)
+                RTTestIFailed("#%u: RTUriParsedAuthorityPort returns %#x, expected %#x", i, uPort, g_aTests[i].uPort);
+        }
+    }
 
     /* Creation */
-    RTTestISubF("RTUriCreate");
-    Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszCreateURIs));
-    for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
-        tstCreate(i+1, g_apcszCreateURIs[i][0], g_apcszCreateURIs[i][1], g_apcszCreateURIs[i][2],
-                  g_apcszCreateURIs[i][3], g_apcszCreateURIs[i][4], g_apcszTestURIs[i]);
+    RTTestISub("RTUriCreate");
+    for (uint32_t i = 0; i < RT_ELEMENTS(g_aTests); i++)
+        CHECK_STR_API(RTUriCreate(g_aTests[i].pszScheme, g_aTests[i].pszAuthority, g_aTests[i].pszPath,
+                                  g_aTests[i].pszQuery, g_aTests[i].pszFragment),
+                      g_aTests[i].pszCreated ? g_aTests[i].pszCreated : g_aTests[i].pszUri);
 
     /* File Uri path */
-    RTTestISubF("RTUriFilePath");
+    RTTestISub("RTUriFilePath");
     for (size_t i = 0; i < RT_ELEMENTS(g_apCreateFileURIs); ++i)
-        tstFilePath(i+1, g_apCreateFileURIs[i].pcszUri, g_apCreateFileURIs[i].pcszPath, g_apCreateFileURIs[i].uFormat);
+        tstFilePath(i, g_apCreateFileURIs[i].pcszUri, g_apCreateFileURIs[i].pcszPath, g_apCreateFileURIs[i].uFormat);
 
     /* File Uri creation */
-    RTTestISubF("RTUriFileCreate");
+    RTTestISub("RTUriFileCreate");
     for (size_t i = 0; i < 3; ++i)
-        tstFileCreate(i+1, g_apCreateFileURIs[i].pcszPath, g_apCreateFileURIs[i].pcszUri);
+        tstFileCreate(i, g_apCreateFileURIs[i].pcszPath, g_apCreateFileURIs[i].pcszUri);
 
     return RTTestSummaryAndDestroy(hTest);
 }
diff --git a/src/VBox/Runtime/tools/Makefile.kmk b/src/VBox/Runtime/tools/Makefile.kmk
index 0c4e1d2..1a96cea 100644
--- a/src/VBox/Runtime/tools/Makefile.kmk
+++ b/src/VBox/Runtime/tools/Makefile.kmk
@@ -62,6 +62,13 @@ if !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS) && !defined(VBOX_ONLY_VALIDATIONKIT)
  RTGzip_TEMPLATE = VBoxR3Tool
  RTGzip_SOURCES = RTGzip.cpp
 
+ ifdef VBOX_WITH_LIBCURL
+ # RTHttp - our http/https fetcher (for testing the http client API).
+ PROGRAMS += RTHttp
+ RTHttp_TEMPLATE = VBoxR3Tool
+ RTHttp_SOURCES = RTHttp.cpp
+ endif
+
  # RTShutdown - similar (but not identical) to a typical unix shutdown command.
  PROGRAMS += RTShutdown
  RTShutdown_TEMPLATE = VBoxR3Tool
diff --git a/src/VBox/Runtime/tools/RTHttp.cpp b/src/VBox/Runtime/tools/RTHttp.cpp
new file mode 100644
index 0000000..3f6abc9
--- /dev/null
+++ b/src/VBox/Runtime/tools/RTHttp.cpp
@@ -0,0 +1,157 @@
+/* $Id: RTHttp.cpp $ */
+/** @file
+ * IPRT - Utility for retriving URLs.
+ */
+
+/*
+ * Copyright (C) 2006-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/http.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/getopt.h>
+#include <iprt/initterm.h>
+#include <iprt/message.h>
+#include <iprt/path.h>
+#include <iprt/stream.h>
+#include <iprt/string.h>
+#include <iprt/vfs.h>
+
+
+
+int main(int argc, char **argv)
+{
+    int rc = RTR3InitExe(argc, &argv, 0);
+    if (RT_FAILURE(rc))
+        return RTMsgInitFailure(rc);
+
+    /*
+     * Create a HTTP client instance.
+     */
+    RTHTTP hHttp;
+    rc = RTHttpCreate(&hHttp);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTHttpCreate failed: %Rrc", rc);
+
+    /*
+     * Parse arguments.
+     */
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        { "--output",       'o', RTGETOPT_REQ_STRING },
+        { "--quiet",        'q', RTGETOPT_REQ_NOTHING },
+        { "--verbose",      'v', RTGETOPT_REQ_NOTHING },
+    };
+
+    RTEXITCODE      rcExit          = RTEXITCODE_SUCCESS;
+    const char     *pszOutput       = NULL;
+    unsigned        uVerbosityLevel = 1;
+
+    RTGETOPTUNION   ValueUnion;
+    RTGETOPTSTATE   GetState;
+    RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+    while ((rc = RTGetOpt(&GetState, &ValueUnion)))
+    {
+        switch (rc)
+        {
+            case 'o':
+                pszOutput = ValueUnion.psz;
+                break;
+
+            case 'q':
+                uVerbosityLevel--;
+                break;
+            case 'v':
+                uVerbosityLevel++;
+                break;
+
+            case 'h':
+                RTPrintf("Usage: %s [options] URL0 [URL1 [...]]\n"
+                         "\n"
+                         "Options:\n"
+                         "  -o,--output=file\n"
+                         "      Output file. If not given, the file is displayed on stdout.\n"
+                         "  -q, --quiet\n"
+                         "  -v, --verbose\n"
+                         "      Controls the verbosity level.\n"
+                         "  -h, -?, --help\n"
+                         "      Display this help text and exit successfully.\n"
+                         "  -V, --version\n"
+                         "      Display the revision and exit successfully.\n"
+                         , RTPathFilename(argv[0]));
+                return RTEXITCODE_SUCCESS;
+
+            case 'V':
+                RTPrintf("$Revision: 102940 $\n");
+                return RTEXITCODE_SUCCESS;
+
+            case VINF_GETOPT_NOT_OPTION:
+            {
+                int rcHttp;
+                if (pszOutput && strcmp("-", pszOutput))
+                {
+                    if (uVerbosityLevel > 0)
+                        RTStrmPrintf(g_pStdErr, "Fetching '%s' into '%s'...\n", ValueUnion.psz, pszOutput);
+                    rcHttp = RTHttpGetFile(hHttp, ValueUnion.psz, pszOutput);
+                }
+                else
+                {
+                    if (uVerbosityLevel > 0)
+                        RTStrmPrintf(g_pStdErr, "Fetching '%s'...\n", ValueUnion.psz);
+
+                    void  *pvResp;
+                    size_t cbResp;
+                    rcHttp = RTHttpGetBinary(hHttp, ValueUnion.psz, &pvResp, &cbResp);
+                    if (RT_SUCCESS(rcHttp))
+                    {
+                        RTVFSIOSTREAM hVfsIos;
+                        rc = RTVfsIoStrmFromStdHandle(RTHANDLESTD_OUTPUT, 0, true /*fLeaveOpen*/, &hVfsIos);
+                        if (RT_SUCCESS(rc))
+                        {
+                            rc = RTVfsIoStrmWrite(hVfsIos, pvResp, cbResp, true /*fBlocking*/, NULL);
+                            if (RT_FAILURE(rc))
+                                rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error writing to stdout: %Rrc", rc);
+                            RTVfsIoStrmRelease(hVfsIos);
+                        }
+                        else
+                            rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening stdout: %Rrc", rc);
+                        RTHttpFreeResponse(pvResp);
+                    }
+                }
+                if (RT_FAILURE(rcHttp))
+                    rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error %Rrc getting '%s'", rcHttp, ValueUnion.psz);
+                break;
+            }
+
+            default:
+                return RTGetOptPrintError(rc, &ValueUnion);
+        }
+    }
+
+    return rcExit;
+}
+
+
diff --git a/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp b/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
index d1ca110..b91f17b 100644
--- a/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
+++ b/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
@@ -49,7 +49,7 @@ RTR3DECL(int)  RTErrConvertFromWin32(unsigned uNativeCode)
         case ERROR_PATH_NOT_FOUND:          return VERR_PATH_NOT_FOUND;
         case ERROR_TOO_MANY_OPEN_FILES:     return VERR_TOO_MANY_OPEN_FILES;
         case ERROR_ACCESS_DENIED:           return VERR_ACCESS_DENIED;
-        case ERROR_NOACCESS:                return VERR_ACCESS_DENIED;
+        case ERROR_NOACCESS:                return VERR_INVALID_POINTER; /* (STATUS_ACCESS_VIOLATION, STATUS_DATATYPE_MISALIGNMENT, STATUS_DATATYPE_MISALIGNMENT_ERROR) */
 
         case ERROR_INVALID_HANDLE:
         case ERROR_DIRECT_ACCESS_HANDLE:    return VERR_INVALID_HANDLE;
@@ -147,6 +147,7 @@ RTR3DECL(int)  RTErrConvertFromWin32(unsigned uNativeCode)
         case ERROR_TIMEOUT:                 return VERR_TIMEOUT;
 
         case ERROR_INVALID_NAME:
+        case ERROR_BAD_DEVICE:
         case ERROR_BAD_PATHNAME:            return VERR_INVALID_NAME;
 
         case ERROR_NEGATIVE_SEEK:           return VERR_NEGATIVE_SEEK;
@@ -183,6 +184,7 @@ RTR3DECL(int)  RTErrConvertFromWin32(unsigned uNativeCode)
 
         case ERROR_INVALID_EXE_SIGNATURE:   return VERR_INVALID_EXE_SIGNATURE;
         case ERROR_BAD_EXE_FORMAT:          return VERR_BAD_EXE_FORMAT;
+        case ERROR_FILE_CORRUPT:            return VERR_BAD_EXE_FORMAT;
         case ERROR_RESOURCE_DATA_NOT_FOUND: return VERR_NO_DATA; ///@todo fix ERROR_RESOURCE_DATA_NOT_FOUND translation
         case ERROR_INVALID_ADDRESS:         return VERR_INVALID_POINTER; ///@todo fix ERROR_INVALID_ADDRESS translation - dbghelp returns it on some line number queries.
 
@@ -191,6 +193,13 @@ RTR3DECL(int)  RTErrConvertFromWin32(unsigned uNativeCode)
         case ERROR_DIRECTORY:               return VERR_NOT_A_DIRECTORY;
 
         case ERROR_LOGON_FAILURE:           return VERR_AUTHENTICATION_FAILURE;
+        case ERROR_PRIVILEGE_NOT_HELD:      return VERR_PRIVILEGE_NOT_HELD;
+
+        case ERROR_PASSWORD_EXPIRED:
+        case ERROR_ACCOUNT_RESTRICTION:
+        case ERROR_PASSWORD_RESTRICTION:
+        case ERROR_ACCOUNT_DISABLED:        return VERR_ACCOUNT_RESTRICTED;
+
 
         /*
          * Winsocket errors are mostly BSD errno.h wrappers.
diff --git a/src/VBox/VMM/Makefile.kmk b/src/VBox/VMM/Makefile.kmk
index e8e6d00..9514e53 100644
--- a/src/VBox/VMM/Makefile.kmk
+++ b/src/VBox/VMM/Makefile.kmk
@@ -375,6 +375,9 @@ if1of ($(VBOX_LDR_FMT), pe lx)
  VMMR0Imp_TEMPLATE = VBoxR0
  VMMR0Imp_SOURCES  = $(VMMR0Imp_0_OUTDIR)/VMMR0.def
  VMMR0Imp_CLEAN    = $(VMMR0Imp_0_OUTDIR)/VMMR0.def
+ ifeq ($(KBUILD_TARGET),win) # Experiment: Let's see how blunt the ones messing our NULL_THUNK_DATA entries on W10 are.
+  VMMR0Imp_POST_CMDS = $(KLIBTWEAKER_EXT) --clear-timestamps --fill-null_thunk_data $(out)
+ endif
 
  $$(VMMR0Imp_0_OUTDIR)/VMMR0.def: $(PATH_SUB_CURRENT)/VMMR0/VMMR0.def | $$(dir $$@)
  ifeq ($(VBOX_LDR_FMT),lx)
diff --git a/src/VBox/VMM/VMMR3/PDMDriver.cpp b/src/VBox/VMM/VMMR3/PDMDriver.cpp
index 468f33c..f8faaac 100644
--- a/src/VBox/VMM/VMMR3/PDMDriver.cpp
+++ b/src/VBox/VMM/VMMR3/PDMDriver.cpp
@@ -683,7 +683,7 @@ int pdmR3DrvInstantiate(PVM pVM, PCFGMNODE pNode, PPDMIBASE pBaseInterface, PPDM
                     rc = MMHyperAlloc(pVM, cb, 64, MM_TAG_PDM_DRIVER, (void **)&pNew);
                 else
                     rc = MMR3HeapAllocZEx(pVM, MM_TAG_PDM_DRIVER, cb, (void **)&pNew);
-                if (pNew)
+                if (RT_SUCCESS(rc))
                 {
                     /*
                      * Initialize the instance structure (declaration order).
@@ -774,10 +774,7 @@ int pdmR3DrvInstantiate(PVM pVM, PCFGMNODE pNode, PPDMIBASE pBaseInterface, PPDM
                     }
                 }
                 else
-                {
-                    AssertMsgFailed(("Failed to allocate %d bytes for instantiating driver '%s'\n", cb, pszName));
-                    rc = VERR_NO_MEMORY;
-                }
+                    AssertMsgFailed(("Failed to allocate %d bytes for instantiating driver '%s'! rc=%Rrc\n", cb, pszName, rc));
             }
             else
                 AssertMsgFailed(("Failed to create Config node! rc=%Rrc\n", rc));
diff --git a/src/VBox/VMM/VMMR3/VM.cpp b/src/VBox/VMM/VMMR3/VM.cpp
index 0db8e52..45326f1 100644
--- a/src/VBox/VMM/VMMR3/VM.cpp
+++ b/src/VBox/VMM/VMMR3/VM.cpp
@@ -315,7 +315,7 @@ VMMR3DECL(int)   VMR3Create(uint32_t cCpus, PCVMM2USERMETHODS pVmm2UserMethods,
                     pszError = N_("One of the kernel modules was not successfully loaded. Make sure "
                                   "that no kernel modules from an older version of VirtualBox exist. "
                                   "Then try to recompile and reload the kernel modules by executing "
-                                  "'/etc/init.d/vboxdrv setup' as root");
+                                  "'/sbin/rcvboxdrv setup' as root");
                     break;
 #endif
 
@@ -381,7 +381,7 @@ VMMR3DECL(int)   VMR3Create(uint32_t cCpus, PCVMM2USERMETHODS pVmm2UserMethods,
                     pszError = N_("VirtualBox kernel driver not loaded. The vboxdrv kernel module "
                                   "was either not loaded or /dev/vboxdrv is not set up properly. "
                                   "Re-setup the kernel module by executing "
-                                  "'/etc/init.d/vboxdrv setup' as root");
+                                  "'/sbin/rcvboxdrv setup' as root");
 #else
                     pszError = N_("VirtualBox kernel driver not loaded");
 #endif
@@ -423,7 +423,7 @@ VMMR3DECL(int)   VMR3Create(uint32_t cCpus, PCVMM2USERMETHODS pVmm2UserMethods,
                     pszError = N_("VirtualBox kernel driver not installed. The vboxdrv kernel module "
                                   "was either not loaded or /dev/vboxdrv was not created for some "
                                   "reason. Re-setup the kernel module by executing "
-                                  "'/etc/init.d/vboxdrv setup' as root");
+                                  "'/sbin/rcvboxdrv setup' as root");
 #else
                     pszError = N_("VirtualBox kernel driver not installed");
 #endif
diff --git a/src/VBox/ValidationKit/common/__init__.py b/src/VBox/ValidationKit/common/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/constants/__init__.py b/src/VBox/ValidationKit/common/constants/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/utils.py b/src/VBox/ValidationKit/common/utils.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/webutils.py b/src/VBox/ValidationKit/common/webutils.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testanalysis/diff.py b/src/VBox/ValidationKit/testanalysis/diff.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testanalysis/reader.py b/src/VBox/ValidationKit/testanalysis/reader.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testanalysis/reporting.py b/src/VBox/ValidationKit/testanalysis/reporting.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxcommand.py b/src/VBox/ValidationKit/testboxscript/testboxcommand.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxcommons.py b/src/VBox/ValidationKit/testboxscript/testboxcommons.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxconnection.py b/src/VBox/ValidationKit/testboxscript/testboxconnection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxtasks.py b/src/VBox/ValidationKit/testboxscript/testboxtasks.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxupgrade.py b/src/VBox/ValidationKit/testboxscript/testboxupgrade.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/base.py b/src/VBox/ValidationKit/testdriver/base.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/reporter.py b/src/VBox/ValidationKit/testdriver/reporter.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/tst-txsclient.py b/src/VBox/ValidationKit/testdriver/tst-txsclient.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/txsclient.py b/src/VBox/ValidationKit/testdriver/txsclient.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/vbox.py b/src/VBox/ValidationKit/testdriver/vbox.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/vboxcon.py b/src/VBox/ValidationKit/testdriver/vboxcon.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/vboxtestvms.py b/src/VBox/ValidationKit/testdriver/vboxtestvms.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/vboxwrappers.py b/src/VBox/ValidationKit/testdriver/vboxwrappers.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/winbase.py b/src/VBox/ValidationKit/testdriver/winbase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/base.py b/src/VBox/ValidationKit/testmanager/core/base.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/build.py b/src/VBox/ValidationKit/testmanager/core/build.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/buildblacklist.py b/src/VBox/ValidationKit/testmanager/core/buildblacklist.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/buildsource.py b/src/VBox/ValidationKit/testmanager/core/buildsource.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/db.py b/src/VBox/ValidationKit/testmanager/core/db.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/dbobjcache.py b/src/VBox/ValidationKit/testmanager/core/dbobjcache.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/failurecategory.py b/src/VBox/ValidationKit/testmanager/core/failurecategory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/failurereason.py b/src/VBox/ValidationKit/testmanager/core/failurereason.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/globalresource.py b/src/VBox/ValidationKit/testmanager/core/globalresource.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/report.py b/src/VBox/ValidationKit/testmanager/core/report.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/schedgroup.py b/src/VBox/ValidationKit/testmanager/core/schedgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/schedulerbase.py b/src/VBox/ValidationKit/testmanager/core/schedulerbase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/schedulerbeci.py b/src/VBox/ValidationKit/testmanager/core/schedulerbeci.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/systemlog.py b/src/VBox/ValidationKit/testmanager/core/systemlog.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testbox.py b/src/VBox/ValidationKit/testmanager/core/testbox.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testboxcontroller.py b/src/VBox/ValidationKit/testmanager/core/testboxcontroller.py
old mode 100755
new mode 100644
index 7df2552..ef0877f
--- a/src/VBox/ValidationKit/testmanager/core/testboxcontroller.py
+++ b/src/VBox/ValidationKit/testmanager/core/testboxcontroller.py
@@ -26,7 +26,7 @@ CDDL are applicable instead of those of the GPL.
 You may elect to license modified versions of this file under the
 terms and conditions of either the GPL or the CDDL or both.
 """
-__version__ = "$Revision: 100880 $"
+__version__ = "$Revision: 102941 $"
 
 
 # Standard python imports.
@@ -774,7 +774,7 @@ class TestBoxController(object): # pylint: disable=R0903
         (sError, fUnforgivable) = TestResultLogic(oDb).processXmlStream(sXml, self._idTestSet);
         if sError is not None:
             oTestSet = TestSetData().initFromDbWithId(oDb, oStatusData.idTestSet);
-            self.writeToMainLog(oTestSet, '\n!!XML error: %s\n\n' % (sXml,));
+            self.writeToMainLog(oTestSet, '\n!!XML error: %s\n%s\n\n' % (sError, sXml,));
             if fUnforgivable:
                 return self._resultResponse(constants.tbresp.STATUS_NACK);
         return self._resultResponse(constants.tbresp.STATUS_ACK);
diff --git a/src/VBox/ValidationKit/testmanager/core/testboxstatus.py b/src/VBox/ValidationKit/testmanager/core/testboxstatus.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testcase.py b/src/VBox/ValidationKit/testmanager/core/testcase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testcaseargs.py b/src/VBox/ValidationKit/testmanager/core/testcaseargs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testgroup.py b/src/VBox/ValidationKit/testmanager/core/testgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testresults.py b/src/VBox/ValidationKit/testmanager/core/testresults.py
old mode 100755
new mode 100644
index 9a4a35d..1a473d0
--- a/src/VBox/ValidationKit/testmanager/core/testresults.py
+++ b/src/VBox/ValidationKit/testmanager/core/testresults.py
@@ -29,7 +29,7 @@ CDDL are applicable instead of those of the GPL.
 You may elect to license modified versions of this file under the
 terms and conditions of either the GPL or the CDDL or both.
 """
-__version__ = "$Revision: 101460 $"
+__version__ = "$Revision: 102941 $"
 # Standard python imports.
 import unittest;
 
@@ -519,19 +519,6 @@ class TestResultLogic(ModelLogicBase): # pylint: disable=R0903
     ksResultsGroupingTypeTestCase   = 'ResultsGroupingTypeTestCase';
     ksResultsGroupingTypeSchedGroup = 'ResultsGroupingTypeSchedGroup';
 
-    #kdResultGroupingMapOld = {
-    #    ksResultsGroupingTypeNone:       ('TestSets',            None,                      None),
-    #    ksResultsGroupingTypeTestGroup:  ('TestSets',            'TestSets.idTestGroup',    None),
-    #    ksResultsGroupingTypeTestBox:    ('TestSets',            'TestSets.idTestBox',      None),
-    #    ksResultsGroupingTypeTestCase:   ('TestSets',            'TestSets.idTestCase',     None),
-    #    ksResultsGroupingTypeBuildRev:   ('TestSets, Builds',    'Builds.iRevision',
-    #                                      ' AND Builds.idBuild      = TestSets.idBuild'
-    #                                      ' AND Builds.tsExpire     > TestSets.tsCreated'
-    #                                      ' AND Builds.tsEffective <= TestSets.tsCreated' ),
-    #    ksResultsGroupingTypeSchedGroup: ('TestSets, TestBoxes', 'TestBoxes.idSchedGroup',
-    #                                      ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox'),
-    #};
-
     ## @name Result sorting options.
     ## @{
     ksResultsSortByRunningAndStart      = 'ResultsSortByRunningAndStart'; ##< Default
@@ -1490,7 +1477,7 @@ class TestResultLogic(ModelLogicBase): # pylint: disable=R0903
                     return 'Element %s has an invalid %s attribute value: %s.' % (sName, sAttr, dAttribs[sAttr],);
 
         # Validate string attributes.
-        for sAttr in [ 'name', 'unit', 'text' ]:
+        for sAttr in [ 'name', 'text' ]: # 'unit' can be zero length.
             if sAttr in dAttribs and len(dAttribs[sAttr]) == 0:
                 return 'Element %s has an empty %s attribute value.' % (sName, sAttr,);
 
diff --git a/src/VBox/ValidationKit/testmanager/core/testset.py b/src/VBox/ValidationKit/testmanager/core/testset.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/useraccount.py b/src/VBox/ValidationKit/testmanager/core/useraccount.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/vcsrevisions.py b/src/VBox/ValidationKit/testmanager/core/vcsrevisions.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/webservergluebase.py b/src/VBox/ValidationKit/testmanager/core/webservergluebase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/webservergluecgi.py b/src/VBox/ValidationKit/testmanager/core/webservergluecgi.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuild.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuild.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildblacklist.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildblacklist.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildcategory.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildcategory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildsource.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildsource.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminfailurereason.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminfailurereason.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminglobalrsrc.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminglobalrsrc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminschedgroup.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminschedgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminsystemlog.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminsystemlog.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmintestbox.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmintestbox.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmintestgroup.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmintestgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminuseraccount.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminuseraccount.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuibase.py b/src/VBox/ValidationKit/testmanager/webui/wuibase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py b/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuifailurecategory.py b/src/VBox/ValidationKit/testmanager/webui/wuifailurecategory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py b/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraph.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraph.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphbase.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphbase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphgooglechart.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphgooglechart.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphsimple.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphsimple.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuilogviewer.py b/src/VBox/ValidationKit/testmanager/webui/wuilogviewer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuimain.py b/src/VBox/ValidationKit/testmanager/webui/wuimain.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuireport.py b/src/VBox/ValidationKit/testmanager/webui/wuireport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuitestresult.py b/src/VBox/ValidationKit/testmanager/webui/wuitestresult.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuivcshistory.py b/src/VBox/ValidationKit/testmanager/webui/wuivcshistory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/tests/usb/usbgadget.py b/src/VBox/ValidationKit/tests/usb/usbgadget.py
old mode 100755
new mode 100644
diff --git a/src/libs/kStuff/Makefile.kmk b/src/libs/kStuff/Makefile.kmk
index 9498a9b..2eb092e 100644
--- a/src/libs/kStuff/Makefile.kmk
+++ b/src/libs/kStuff/Makefile.kmk
@@ -22,7 +22,7 @@ include $(KBUILD_PATH)/subheader.kmk
 # The library for dynamic linking.
 #
 LIBRARIES += VBox-kStuff
-VBox-kStuff_TEMPLATE = VBOXR3
+VBox-kStuff_TEMPLATE = VBoxR3RuntimeDll
 VBox-kStuff_DEFS = IN_RT_R3
 VBox-kStuff_DEFS.strict = K_STRICT KLDRMODMACHO_STRICT KLDRMODMACHO_STRICT2
 VBox-kStuff_DEFS.debug  = $(VBox-kStuff_DEFS.strict)
diff --git a/src/libs/liblzf-3.4/Makefile.kmk b/src/libs/liblzf-3.4/Makefile.kmk
index f06c002..fb00c55 100644
--- a/src/libs/liblzf-3.4/Makefile.kmk
+++ b/src/libs/liblzf-3.4/Makefile.kmk
@@ -24,7 +24,7 @@ if1of ($(KBUILD_TARGET),os2 win)
  # only required for vbox-img
  LIBRARIES += VBox-liblzf-static
 endif
-VBox-liblzf_TEMPLATE = VBOXR3
+VBox-liblzf_TEMPLATE = VBoxR3RuntimeDll
 VBox-liblzf_BLD_TYPE = release # WARNING! Always optimizing this lib.
 VBox-liblzf_DEFS = ULTRA_FAST=1 HLOG=12
 VBox-liblzf_DEFS.x86 = STRICT_ALIGN=0
diff --git a/src/libs/xpcom18a4/nsprpub/Makefile.in b/src/libs/xpcom18a4/nsprpub/Makefile.in
old mode 100644
new mode 100755
diff --git a/src/libs/xpcom18a4/nsprpub/config/config.mk b/src/libs/xpcom18a4/nsprpub/config/config.mk
old mode 100644
new mode 100755
diff --git a/src/libs/xpcom18a4/nsprpub/config/rules.mk b/src/libs/xpcom18a4/nsprpub/config/rules.mk
old mode 100644
new mode 100755
diff --git a/src/libs/xpcom18a4/python/__init__.py b/src/libs/xpcom18a4/python/__init__.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/client/__init__.py b/src/libs/xpcom18a4/python/client/__init__.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/components.py b/src/libs/xpcom18a4/python/components.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/file.py b/src/libs/xpcom18a4/python/file.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/nsError.py b/src/libs/xpcom18a4/python/nsError.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/primitives.py b/src/libs/xpcom18a4/python/primitives.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/__init__.py b/src/libs/xpcom18a4/python/server/__init__.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/enumerator.py b/src/libs/xpcom18a4/python/server/enumerator.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/factory.py b/src/libs/xpcom18a4/python/server/factory.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/loader.py b/src/libs/xpcom18a4/python/server/loader.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/module.py b/src/libs/xpcom18a4/python/server/module.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/policy.py b/src/libs/xpcom18a4/python/server/policy.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/pyxpcom_test_tools.py b/src/libs/xpcom18a4/python/test/pyxpcom_test_tools.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_com_exceptions.py b/src/libs/xpcom18a4/python/test/test_com_exceptions.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_comfile.py b/src/libs/xpcom18a4/python/test/test_comfile.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_component/py_test_component.py b/src/libs/xpcom18a4/python/test/test_component/py_test_component.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_components.py b/src/libs/xpcom18a4/python/test/test_components.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_isupports_primitives.py b/src/libs/xpcom18a4/python/test/test_isupports_primitives.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_misc.py b/src/libs/xpcom18a4/python/test/test_misc.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_streams.py b/src/libs/xpcom18a4/python/test/test_streams.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_test_component.py b/src/libs/xpcom18a4/python/test/test_test_component.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_weakreferences.py b/src/libs/xpcom18a4/python/test/test_weakreferences.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/tools/regxpcom.py b/src/libs/xpcom18a4/python/tools/regxpcom.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/tools/tracer_demo.py b/src/libs/xpcom18a4/python/tools/tracer_demo.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/xpt.py b/src/libs/xpcom18a4/python/xpt.py
old mode 100755
new mode 100644

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-virtualbox/virtualbox.git



More information about the Pkg-virtualbox-commits mailing list