[Pkg-virtualbox-commits] [virtualbox] 01/01: New upstream version 5.2.4-dfsg

Gianfranco Costamagna locutusofborg at moszumanska.debian.org
Tue Dec 19 22:28:32 UTC 2017


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

locutusofborg pushed a commit to branch upstream
in repository virtualbox.

commit 5abd747f4cbe1199f83b14a7375c82ba4e9a305e
Author: Gianfranco Costamagna <costamagnagianfranco at yahoo.it>
Date:   Tue Dec 19 23:26:51 2017 +0100

    New upstream version 5.2.4-dfsg
---
 Config.kmk                                         |   29 +-
 Makefile.kmk                                       |   14 +-
 Version.kmk                                        |    2 +-
 doc/manual/user_ChangeLogImpl.xml                  |   37 +
 include/VBox/vmm/pdmaudioifs.h                     |   59 +-
 src/VBox/Additions/common/VBoxGuest/Makefile.kmk   |    2 +-
 .../Additions/common/VBoxGuest/VBoxGuest-netbsd.c  |  963 ++-
 .../Additions/common/VBoxService/VBoxService.cpp   |   56 +-
 .../common/VBoxService/VBoxServiceInternal.h       |    2 +
 .../common/VBoxService/VBoxServiceTimeSync.cpp     |  195 +-
 .../common/VBoxService/VBoxServiceUtils.cpp        |   34 +-
 .../common/VBoxService/VBoxServiceUtils.h          |    1 +
 src/VBox/Additions/common/crOpenGL/Makefile.kmk    |    8 +-
 src/VBox/Additions/common/crOpenGL/entrypoints.pyc |  Bin 5904 -> 5904 bytes
 src/VBox/Additions/x11/Makefile.kmk                |    2 +-
 src/VBox/Devices/Audio/DevHDA.cpp                  |  879 +--
 src/VBox/Devices/Audio/DevHDA.h                    |   51 +-
 src/VBox/Devices/Audio/DevHDACommon.cpp            |  314 +-
 src/VBox/Devices/Audio/DevHDACommon.h              |   43 +-
 src/VBox/Devices/Audio/DevSB16.cpp                 |   75 +-
 src/VBox/Devices/Audio/DrvAudio.cpp                |  211 +-
 src/VBox/Devices/Audio/DrvAudio.h                  |   31 +-
 src/VBox/Devices/Audio/DrvAudioCommon.cpp          |  399 +-
 src/VBox/Devices/Audio/DrvHostALSAAudio.cpp        |   33 +-
 src/VBox/Devices/Audio/DrvHostDebugAudio.cpp       |   45 +-
 src/VBox/Devices/Audio/DrvHostValidationKit.cpp    |   12 +-
 src/VBox/Devices/Audio/HDAStream.cpp               |  746 ++-
 src/VBox/Devices/Audio/HDAStream.h                 |   74 +-
 src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd      |  Bin 2097152 -> 2097152 bytes
 src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd      |  Bin 2097152 -> 2097152 bytes
 .../Graphics/BIOS/VBoxVgaBiosAlternative286.asm    |   10 +-
 .../Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum |    2 +-
 .../Graphics/BIOS/VBoxVgaBiosAlternative386.asm    |   10 +-
 .../Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum |    2 +-
 .../Graphics/BIOS/VBoxVgaBiosAlternative8086.asm   |   10 +-
 .../BIOS/VBoxVgaBiosAlternative8086.md5sum         |    2 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative286.asm     |    4 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative286.md5sum  |    2 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative386.asm     |    4 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative386.md5sum  |    2 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative8086.asm    |    4 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum |    2 +-
 src/VBox/Devices/Serial/DrvHostSerial.cpp          |    3 +-
 src/VBox/Devices/USB/DevOHCI.cpp                   |  135 +-
 .../Devices/testcase/tstDeviceStructSizeRC.cpp     |    8 +-
 src/VBox/Frontends/VirtualBox/Makefile.kmk         |    1 -
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts |   56 +-
 .../Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts   |  132 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts |   54 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts |    2 +-
 src/VBox/Frontends/VirtualBox/nls/qt_pt_BR.ts      | 6533 ++++----------------
 .../VirtualBox/src/UITakeSnapshotDialog.cpp        |   10 +-
 .../VirtualBox/src/extensions/QIArrowSplitter.cpp  |    3 +-
 .../VirtualBox/src/extensions/QIManagerDialog.cpp  |    9 +-
 .../VirtualBox/src/extensions/QIManagerDialog.h    |    3 +
 .../VirtualBox/src/extensions/QIMessageBox.cpp     |    1 -
 .../VirtualBox/src/globals/UIIconPool.cpp          |    8 +-
 .../src/hostnetwork/UIHostNetworkManager.cpp       |    3 +-
 src/VBox/Frontends/VirtualBox/src/main.cpp         |    6 +-
 .../VirtualBox/src/medium/UIMediumManager.cpp      |    3 +-
 .../src/platform/darwin/VBoxUtils-darwin-cocoa.mm  |    2 -
 .../VirtualBox/src/runtime/UIFrameBuffer.cpp       |    8 +-
 .../VirtualBox/src/runtime/UIIndicatorsPool.cpp    |    3 +-
 .../VirtualBox/src/runtime/UIMachineView.cpp       |    6 -
 .../Frontends/VirtualBox/src/runtime/UISession.cpp |    2 -
 .../src/runtime/UIStatusBarEditorWindow.cpp        |    3 +-
 .../VirtualBox/src/runtime/UIVMCloseDialog.cpp     |   25 +-
 .../src/runtime/normal/UIMachineLogicNormal.cpp    |    3 +-
 .../VirtualBox/src/selector/UISelectorWindow.cpp   |    6 -
 .../VirtualBox/src/selector/UISnapshotPane.cpp     |    3 +-
 .../VirtualBox/src/settings/UISettingsDialog.cpp   |    1 -
 .../settings/machine/UIMachineSettingsStorage.cpp  |    3 +
 .../settings/machine/UIMachineSettingsSystem.cpp   |    3 +
 .../VirtualBox/src/widgets/UIFilmContainer.cpp     |    4 +-
 .../VirtualBox/src/widgets/UIHostComboEditor.cpp   |    3 +-
 .../VirtualBox/src/widgets/UIHotKeyEditor.cpp      |    4 +-
 .../src/widgets/UIPortForwardingTable.cpp          |    5 +-
 .../VirtualBox/src/widgets/UIWarningPane.cpp       |    2 -
 src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.pyc |  Bin 23671 -> 23671 bytes
 .../GuestHost/OpenGL/packer/pack_currenttypes.pyc  |  Bin 2110 -> 2110 bytes
 .../GuestHost/OpenGL/state_tracker/convert.pyc     |  Bin 2087 -> 2087 bytes
 .../OpenGL/state_tracker/get_components.pyc        |  Bin 5791 -> 5791 bytes
 src/VBox/GuestHost/OpenGL/util/vboxhgcm.c          |   20 +-
 .../SharedOpenGL/crserverlib/get_sizes.pyc         |  Bin 17777 -> 17777 bytes
 src/VBox/Installer/win/Makefile.kmk                |    8 +-
 src/VBox/Installer/win/NLS/zh_CN.wxl               |  600 ++
 src/VBox/Installer/win/NLS/zh_TW.wxl               |    2 +-
 src/VBox/Main/include/DisplayImpl.h                |    4 +-
 src/VBox/Main/src-all/win/VBoxProxyStub.c          |  289 +-
 src/VBox/Main/src-client/ConsoleImpl.cpp           |   10 +-
 src/VBox/Main/src-client/ConsoleImpl2.cpp          |   58 +-
 src/VBox/Main/src-client/DisplayImpl.cpp           |   38 +-
 src/VBox/Main/src-client/DrvAudioVideoRec.cpp      |    2 +-
 src/VBox/Main/src-client/VideoRec.h                |    2 +
 src/VBox/Runtime/Makefile.kmk                      |    4 -
 src/VBox/Runtime/common/fs/isomaker.cpp            |   11 +
 src/VBox/VMM/VMMR3/TM.cpp                          |   51 +-
 src/VBox/VMM/include/TMInternal.h                  |    6 +
 src/libs/Makefile.kmk                              |    6 +-
 src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c         |   11 +-
 100 files changed, 5072 insertions(+), 7477 deletions(-)

diff --git a/Config.kmk b/Config.kmk
index 436e01a..aa8f2cc 100644
--- a/Config.kmk
+++ b/Config.kmk
@@ -19,7 +19,7 @@
 #
 
 # Marker.
-VBOX_ROOT_CONFIG_KMK_INCLUDED  = 1
+VBOX_ROOT_CONFIG_KMK_INCLUDED = 1
 
 
 #
@@ -617,8 +617,6 @@ VBOX_WITH_QTGUI = 1
 ifeq ($(KBUILD_TARGET),darwin)
  VBOX_WITH_COCOA_QT = 1
 endif
-# HiDPI support for OS X
-VBOX_GUI_WITH_HIDPI = 1
 # The SDL based GUI.
 VBOX_WITH_VBOXSDL = 1
 # Build VBoxSDL with secure label support.
@@ -672,14 +670,12 @@ if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.x86 darwin.amd64 linux.x86
  VBOX_WITH_VIDEOREC = 1
  # Enable VPX (VP8 / VP9 codec), used for video capturing.
  VBOX_WITH_LIBVPX = 1
- if1of ($(KBUILD_TYPE), debug dbgopt) # Not enabled for release builds yet.
-  # Enables audio support for VM video capturing.
-  VBOX_WITH_AUDIO_VIDEOREC = 1
-  # Enables libopus (Opus), used for encoding audio into VM video capturing files.
-  VBOX_WITH_LIBOPUS = 1
-  # Enable SEE (+ AVX) optimizations for Opus.
-  VBOX_WITH_OPUS_SSE = 1
- endif
+ # Enables audio support for VM video capturing.
+ VBOX_WITH_AUDIO_VIDEOREC = 1
+ # Enables libopus (Opus), used for encoding audio into VM video capturing files.
+ VBOX_WITH_LIBOPUS = 1
+ # Enable SEE (+ AVX) optimizations for Opus.
+ VBOX_WITH_OPUS_SSE = 1
 endif
 # Enable shared folders
 VBOX_WITH_SHARED_FOLDERS = 1
@@ -1181,15 +1177,14 @@ ifdef VBOX_OSE
  ifn1of ($(KBUILD_TARGET), darwin linux solaris win)
   VBOX_WITH_INSTALLER=
  endif
- if1of ($(KBUILD_TARGET), win)
+ # if1of ($(KBUILD_TARGET), win)
   # Undefine codec libraries which are not needed.
   VBOX_WITH_LIBVPX=
   VBOX_WITH_LIBOPUS=
   # Disable video recording (with audio support).
   VBOX_WITH_VIDEOREC=
   VBOX_WITH_AUDIO_VIDEOREC=
- endif
- VBOX_GUI_WITH_HIDPI=
+ # endif
  # branding
  VBOX_BRAND_LICENSE_HTML             := $(PATH_ROOT)/doc/License-gpl-2.0.html
  VBOX_BRAND_LICENSE_RTF              := $(PATH_ROOT)/doc/License-gpl-2.0.rtf
@@ -3807,12 +3802,12 @@ endif
 
 ifdef VBOX_WITH_LIBCURL
 SDK_VBOX_LIBCURL       = .
-SDK_VBOX_LIBCURL_INCS ?= $(PATH_ROOT)/src/libs/curl-7.50.3/include
+SDK_VBOX_LIBCURL_INCS ?= $(PATH_ROOT)/src/libs/curl-7.57.0/include
 SDK_VBOX_LIBCURL_LIBS ?= $(PATH_STAGE_LIB)/VBox-libcurl$(VBOX_SUFF_LIB)
 SDK_VBOX_LIBCURL_DEFS ?= BUILDING_LIBCURL
 
 SDK_VBOX_LIBCURL-x86           = .
-SDK_VBOX_LIBCURL-x86_INCS     ?= $(PATH_ROOT)/src/libs/curl-7.50.3/include
+SDK_VBOX_LIBCURL-x86_INCS     ?= $(PATH_ROOT)/src/libs/curl-7.57.0/include
 SDK_VBOX_LIBCURL-x86_LIBS.x86 ?= $(PATH_STAGE_LIB)/VBox-libcurl-x86$(VBOX_SUFF_LIB)
 SDK_VBOX_LIBCURL-x86_DEFS     ?= BUILDING_LIBCURL
 endif
@@ -7097,7 +7092,7 @@ endif
 SVN                    ?= svn$(HOSTSUFF_EXE)
 VBOX_SVN_REV_KMK        = $(PATH_OUT)/revision.kmk
 ifndef VBOX_SVN_REV
- VBOX_SVN_REV_FALLBACK := $(patsubst %:,,  $Rev: 119230 $  )
+ VBOX_SVN_REV_FALLBACK := $(patsubst %:,,  $Rev: 119758 $  )
  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/Makefile.kmk b/Makefile.kmk
index 5344689..a3cbe4d 100644
--- a/Makefile.kmk
+++ b/Makefile.kmk
@@ -1083,10 +1083,10 @@ additions-build-solaris.rsync-into-vm:
 
 additions-build-solaris.build-it: additions-build-solaris.rsync-into-vm
 	$(call VBOX_BLD_VM_MSG_BEGIN,Solaris/amd64 additions build+pack)
-	$(VBOX_KMK_TIME) ssh vbox@$(VBOX_BLD_VM_SOLARIS_IP) " echo $@/amd64 && cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.amd64) all packing"
+	$(VBOX_KMK_TIME) ssh -v vbox@$(VBOX_BLD_VM_SOLARIS_IP) " echo $@/amd64 && cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.amd64) all packing"
 	$(call VBOX_BLD_VM_MSG_END__,Solaris/amd64 additions build+pack)
 	$(call VBOX_BLD_VM_MSG_BEGIN,Solaris/x86 additions build+pack)
-	$(VBOX_KMK_TIME) ssh vbox@$(VBOX_BLD_VM_SOLARIS_IP) " echo $@/x86   && cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) all packing VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE=1"
+	$(VBOX_KMK_TIME) ssh -v vbox@$(VBOX_BLD_VM_SOLARIS_IP) " echo $@/x86   && cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) all packing VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE=1"
 	$(call VBOX_BLD_VM_MSG_END__,Solaris/x86 additions build+pack)
 
 additions-build-solaris.rsync-out-of-vm: additions-build-solaris.build-it
@@ -1158,22 +1158,22 @@ additions-build-linux.rsync-into-vm:
 additions-build-linux.build-it: additions-build-linux.rsync-into-vm
  ifdef VBOX_WITH_LIGHTDM_GREETER_PACKING
 	$(call VBOX_BLD_VM_MSG_BEGIN,Linux/amd64 additions/greeter)
-	$(VBOX_KMK_TIME) ssh 'vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && dchroot -c ubuntu-11.10-amd64 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.amd64) PATH_OUT=/mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME)/out/linux.amd64/$(KBUILD_TYPE)/greeter VBOX_WITH_LIGHTDM_GREETER=1 vbox-greeter\""'
+	$(VBOX_KMK_TIME) ssh '-v vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && dchroot -c ubuntu-11.10-amd64 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.amd64) PATH_OUT=/mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME)/out/linux.amd64/$(KBUILD_TYPE)/greeter VBOX_WITH_LIGHTDM_GREETER=1 vbox-greeter\""'
 	$(call VBOX_BLD_VM_MSG_END__,Linux/amd64 additions/greeter)
  endif
 	$(call VBOX_BLD_VM_MSG_BEGIN,Linux/amd64 additions build+pack)
-	$(VBOX_KMK_TIME) ssh 'vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && dchroot -c debian-4.0-amd64 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.amd64) all packing VBOX_WITHOUT_LINUX_GUEST_PACKAGE=1 VBOX_WITH_LIGHTDM_GREETER_PACKING=$(VBOX_WITH_LIGHTDM_GREETER_PACKING)\""'
+	$(VBOX_KMK_TIME) ssh '-v vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && dchroot -c debian-4.0-amd64 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.amd64) all packing VBOX_WITHOUT_LINUX_GUEST_PACKAGE=1 VBOX_WITH_LIGHTDM_GREETER_PACKING=$(VBOX_WITH_LIGHTDM_GREETER_PACKING)\""'
 	$(call VBOX_BLD_VM_MSG_END__,Linux/amd64 additions build+pack)
  ifdef VBOX_WITH_LIGHTDM_GREETER_PACKING
 	$(call VBOX_BLD_VM_MSG_BEGIN,Linux/x86 additions/greeter)
-	$(VBOX_KMK_TIME) ssh 'vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && linux32 dchroot -c ubuntu-11.10-i386 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && BUILD_PLATFORM_ARCH=x86 tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) PATH_OUT=/mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME)/out/linux.x86/$(KBUILD_TYPE)/greeter VBOX_WITH_LIGHTDM_GREETER=1 vbox-greeter\""'
+	$(VBOX_KMK_TIME) ssh '-v vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && linux32 dchroot -c ubuntu-11.10-i386 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && BUILD_PLATFORM_ARCH=x86 tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) PATH_OUT=/mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME)/out/linux.x86/$(KBUILD_TYPE)/greeter VBOX_WITH_LIGHTDM_GREETER=1 vbox-greeter\""'
 	$(call VBOX_BLD_VM_MSG_END__,Linux/x86 additions/greeter)
  endif
 	$(call VBOX_BLD_VM_MSG_BEGIN,Linux/x86 additions build+pack)
-	$(VBOX_KMK_TIME) ssh 'vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && linux32 dchroot -c rhel3-i386 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) all packing VBOX_WITHOUT_LINUX_GUEST_PACKAGE=1 VBOX_WITH_LIGHTDM_GREETER_PACKING=$(VBOX_WITH_LIGHTDM_GREETER_PACKING)\""'
+	$(VBOX_KMK_TIME) ssh '-v vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && linux32 dchroot -c rhel3-i386 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) all packing VBOX_WITHOUT_LINUX_GUEST_PACKAGE=1 VBOX_WITH_LIGHTDM_GREETER_PACKING=$(VBOX_WITH_LIGHTDM_GREETER_PACKING)\""'
 	$(call VBOX_BLD_VM_MSG_END__,Linux/x86 additions build+pack)
 	$(call VBOX_BLD_VM_MSG_BEGIN,Linux/x86 additions combine)
-	$(VBOX_KMK_TIME) ssh 'vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && linux32 dchroot -c rhel3-i386 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) all packing VBOX_WITH_COMBINED_LINUX_GUEST_PACKAGE=1\""'
+	$(VBOX_KMK_TIME) ssh '-v vbox@$(VBOX_BLD_VM_LNX_IP) "echo $@ && linux32 dchroot -c rhel3-i386 \"cd /mnt/tinderbox/$(VBOX_ADDITIONS_BUILD_SUBDIRNAME) && tools/env.sh --no-wine kmk $(VBOX_ADDITIONS_BUILD.x86) all packing VBOX_WITH_COMBINED_LINUX_GUEST_PACKAGE=1\""'
 	$(call VBOX_BLD_VM_MSG_END__,Linux/x86 additions combine)
 
 additions-build-linux.rsync-out-of-vm: additions-build-linux.build-it
diff --git a/Version.kmk b/Version.kmk
index 5aadfda..0c07562 100644
--- a/Version.kmk
+++ b/Version.kmk
@@ -25,7 +25,7 @@ VBOX_VERSION_MINOR  = 2
 # 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  = 2
+VBOX_VERSION_BUILD  = 4
 # This can be overridden in LocalConfig.kmk or elsewhere.
 # For the convention, see checks near the end of Config.kmk.
 VBOX_BUILD_PUBLISHER =
diff --git a/doc/manual/user_ChangeLogImpl.xml b/doc/manual/user_ChangeLogImpl.xml
index 3c42092..ebf6ef4 100644
--- a/doc/manual/user_ChangeLogImpl.xml
+++ b/doc/manual/user_ChangeLogImpl.xml
@@ -4,6 +4,43 @@
                            So, we use chapter and xpointer="xpointer(/chapter/)" with xi:include. -->
 
   <sect1>
+    <title>Version 5.2.4 (2017-12-19)</title>
+
+    <para>This is a maintenance release. The following items were fixed and/or
+      added:</para>
+
+    <itemizedlist>
+
+      <listitem>
+        <para>User interface: various high resolution display adjustments</para>
+      </listitem>
+
+      <listitem>
+        <para>Audio: fixed SB16 volume handling (5.2 regression)</para>
+      </listitem>
+
+      <listitem>
+        <para>Audio: various fixes</para>
+      </listitem>
+
+      <listitem>
+        <para>USB/OHCI: fixed a problem where OHCI emulation might sporadically drop data transfers</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux hosts: fixed screen corruption when the host screen changes
+          and a virtual machine window is maximized</para>
+      </listitem>
+
+      <listitem>
+        <para>X11 Guest Additions: fixed a hang at the GNOME Shell login screen
+          with 3D enabled (5.2 regression, bugs #17189 and #17190)</para>
+      </listitem>
+
+    </itemizedlist>
+  </sect1>
+
+  <sect1>
     <title>Version 5.2.2 (2017-11-22)</title>
 
     <para>This is a maintenance release. The following items were fixed and/or
diff --git a/include/VBox/vmm/pdmaudioifs.h b/include/VBox/vmm/pdmaudioifs.h
index 84d5b5c..953dd47 100644
--- a/include/VBox/vmm/pdmaudioifs.h
+++ b/include/VBox/vmm/pdmaudioifs.h
@@ -136,6 +136,7 @@
 
 #include <iprt/circbuf.h>
 #include <iprt/list.h>
+#include <iprt/path.h>
 
 #include <VBox/types.h>
 #ifdef VBOX_WITH_STATISTICS
@@ -147,6 +148,14 @@
  * @{
  */
 
+#ifndef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH
+# ifdef RT_OS_WINDOWS
+#  define VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "c:\\temp\\"
+# else
+#  define VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "/tmp/"
+# endif
+#endif
+
 /** PDM audio driver instance flags. */
 typedef uint32_t PDMAUDIODRVFLAGS;
 
@@ -732,7 +741,7 @@ typedef struct PDMAUDIOMIXBUF
     /** Number of children mix buffers kept in lstChildren. */
     uint32_t                  cChildren;
     /** Intermediate structure for buffer conversion tasks. */
-    PPDMAUDIOSTREAMRATE         pRate;
+    PPDMAUDIOSTREAMRATE       pRate;
     /** Internal representation of current volume used for mixing. */
     PDMAUDMIXBUFVOL           Volume;
     /** This buffer's audio format. */
@@ -758,8 +767,15 @@ typedef struct PDMAUDIOMIXBUF
 
 typedef uint32_t PDMAUDIOFILEFLAGS;
 
-/* No flags defined. */
-#define PDMAUDIOFILEFLAG_NONE            0
+/** No flags defined. */
+#define PDMAUDIOFILE_FLAG_NONE          0
+/** Keep the audio file even if it contains no audio data. */
+#define PDMAUDIOFILE_FLAG_KEEP_IF_EMPTY RT_BIT(0)
+/** Audio file flag validation mask. */
+#define PDMAUDIOFILE_FLAG_VALID_MASK    0x1
+
+/** Audio file default open flags. */
+#define PDMAUDIOFILE_DEFAULT_OPEN_FLAGS (RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE)
 
 /**
  * Audio file types.
@@ -768,28 +784,39 @@ typedef enum PDMAUDIOFILETYPE
 {
     /** Unknown type, do not use. */
     PDMAUDIOFILETYPE_UNKNOWN = 0,
+    /** Raw (PCM) file. */
+    PDMAUDIOFILETYPE_RAW,
     /** Wave (.WAV) file. */
     PDMAUDIOFILETYPE_WAV,
     /** Hack to blow the type up to 32-bit. */
     PDMAUDIOFILETYPE_32BIT_HACK = 0x7fffffff
 } PDMAUDIOFILETYPE;
 
+typedef uint32_t PDMAUDIOFILENAMEFLAGS;
+
+/** No flags defined. */
+#define PDMAUDIOFILENAME_FLAG_NONE          0
+/** Adds an ISO timestamp to the file name. */
+#define PDMAUDIOFILENAME_FLAG_TS            RT_BIT(0)
+
 /**
  * Structure for an audio file handle.
  */
 typedef struct PDMAUDIOFILE
 {
     /** Type of the audio file. */
-    PDMAUDIOFILETYPE enmType;
-    /** File name. */
-    char             szName[255];
+    PDMAUDIOFILETYPE    enmType;
+    /** Audio file flags. */
+    PDMAUDIOFILEFLAGS   fFlags;
+    /** File name and path. */
+    char                szName[RTPATH_MAX + 1];
     /** Actual file handle. */
-    RTFILE           hFile;
+    RTFILE              hFile;
     /** Data needed for the specific audio file type implemented.
      *  Optional, can be NULL. */
-    void            *pvData;
+    void               *pvData;
     /** Data size (in bytes). */
-    size_t           cbData;
+    size_t              cbData;
 } PDMAUDIOFILE, *PPDMAUDIOFILE;
 
 /** Stream status flag. To be used with PDMAUDIOSTRMSTS_FLAG_ flags. */
@@ -866,6 +893,13 @@ typedef struct PDMAUDIOSTREAMIN
     STAMCOUNTER StatBytesTotalRead;
     STAMCOUNTER StatFramesCaptured;
 #endif
+    struct
+    {
+        /** File for writing stream reads. */
+        PPDMAUDIOFILE           pFileStreamRead;
+        /** File for writing non-interleaved captures. */
+        PPDMAUDIOFILE           pFileCaptureNonInterleaved;
+    } Dbg;
 } PDMAUDIOSTREAMIN, *PPDMAUDIOSTREAMIN;
 
 /**
@@ -881,6 +915,13 @@ typedef struct PDMAUDIOSTREAMOUT
     STAMCOUNTER StatBytesTotalWritten;
     STAMCOUNTER StatFramesPlayed;
 #endif
+    struct
+    {
+        /** File for writing stream writes. */
+        PPDMAUDIOFILE           pFileStreamWrite;
+        /** File for writing stream playback. */
+        PPDMAUDIOFILE           pFilePlayNonInterleaved;
+    } Dbg;
 } PDMAUDIOSTREAMOUT, *PPDMAUDIOSTREAMOUT;
 
 typedef struct PDMAUDIOSTREAM *PPDMAUDIOSTREAM;
diff --git a/src/VBox/Additions/common/VBoxGuest/Makefile.kmk b/src/VBox/Additions/common/VBoxGuest/Makefile.kmk
index ccda485..507a1e3 100644
--- a/src/VBox/Additions/common/VBoxGuest/Makefile.kmk
+++ b/src/VBox/Additions/common/VBoxGuest/Makefile.kmk
@@ -69,7 +69,7 @@ if1of ($(KBUILD_TARGET), darwin freebsd haiku netbsd os2 solaris win)
  VBoxGuest_DEFS          = VBGL_VBOXGUEST VBOX_WITH_HGCM
  VBoxGuest_INCS          = .
  VBoxGuest_INCS.freebsd  = $(VBoxGuest_0_OUTDIR) $(PATH_STAGE)/gen-sys-hdrs
- VBoxGuest_INCS.netbsd   = $(VBoxGuest_0_OUTDIR)
+ VBoxGuest_INCS.netbsd   = $(VBoxGuest_0_OUTDIR) netbsd
  ifeq ($(KBUILD_HOST),solaris)
   VBoxGuest_LDFLAGS.solaris         += -N misc/ctf
  else
diff --git a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-netbsd.c b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-netbsd.c
index 3d8c243..de46c8a 100644
--- a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-netbsd.c
+++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-netbsd.c
@@ -24,11 +24,6 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-/** @todo r=bird: This must merge with SUPDrv-netbsd.c before long. The two
- * source files should only differ on prefixes and the extra bits wrt to the
- * pci device. I.e. it should be diffable so that fixes to one can easily be
- * applied to the other. */
-
 
 /*********************************************************************************************************************************
 *   Header Files                                                                                                                 *
@@ -59,6 +54,10 @@
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcidevs.h>
 
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsmousevar.h>
+#include <dev/wscons/tpcalibvar.h>
+
 #ifdef PVM
 #  undef PVM
 #endif
@@ -84,18 +83,18 @@
 typedef struct VBoxGuestDeviceState
 {
     device_t sc_dev;
-    pci_chipset_tag_t pc;
-    bus_space_tag_t io_tag;
-    bus_space_handle_t io_handle;
-    bus_addr_t uIOPortBase;
-    bus_size_t io_regsize;
-    bus_space_tag_t iVMMDevMemResId;
-    bus_space_handle_t VMMDevMemHandle;
+    pci_chipset_tag_t sc_pc;
+
+    bus_space_tag_t sc_iot;
+    bus_space_handle_t sc_ioh;
+    bus_addr_t sc_iobase;
+    bus_size_t sc_iosize;
+
+    bus_space_tag_t sc_memt;
+    bus_space_handle_t sc_memh;
 
     /** Size of the memory area. */
-    bus_size_t         VMMDevMemSize;
-    /** Mapping of the register space */
-    bus_addr_t         pMMIOBase;
+    bus_size_t         sc_memsize;
 
     /** IRQ resource handle. */
     pci_intr_handle_t  ih;
@@ -104,10 +103,15 @@ typedef struct VBoxGuestDeviceState
 
     /** Controller features, limits and status. */
     u_int              vboxguest_state;
+
+    device_t sc_wsmousedev;
+    VMMDevReqMouseStatus *sc_vmmmousereq;
+    PVBOXGUESTSESSION sc_session;
+    struct tpcalib_softc sc_tpcalib;
 } vboxguest_softc;
 
 
-struct vboxguest_session
+struct vboxguest_fdata
 {
     vboxguest_softc *sc;
     PVBOXGUESTSESSION session;
@@ -120,26 +124,45 @@ struct vboxguest_session
 *   Internal Functions                                                                                                           *
 *********************************************************************************************************************************/
 /*
+ * Driver(9) autoconf machinery.
+ */
+static int VBoxGuestNetBSDMatch(device_t parent, cfdata_t match, void *aux);
+static void VBoxGuestNetBSDAttach(device_t parent, device_t self, void *aux);
+static void VBoxGuestNetBSDWsmAttach(vboxguest_softc *sc);
+static int VBoxGuestNetBSDDetach(device_t self, int flags);
+
+/*
+ * IRQ related functions.
+ */
+static int  VBoxGuestNetBSDAddIRQ(vboxguest_softc *sc, struct pci_attach_args *pa);
+static void VBoxGuestNetBSDRemoveIRQ(vboxguest_softc *sc);
+static int  VBoxGuestNetBSDISR(void *pvState);
+
+/*
  * Character device file handlers.
  */
 static int VBoxGuestNetBSDOpen(dev_t device, int flags, int fmt, struct lwp *process);
 static int VBoxGuestNetBSDClose(struct file *fp);
 static int VBoxGuestNetBSDIOCtl(struct file *fp, u_long cmd, void *addr);
+static int VBoxGuestNetBSDIOCtlSlow(struct vboxguest_fdata *fdata, u_long command, void *data);
 static int VBoxGuestNetBSDPoll(struct file *fp, int events);
-static void VBoxGuestNetBSDAttach(device_t, device_t, void*);
-static int VBoxGuestNetBSDDetach(device_t pDevice, int flags);
 
 /*
- * IRQ related functions.
+ * wsmouse(4) accessops
  */
-static void VBoxGuestNetBSDRemoveIRQ(vboxguest_softc *sc);
-static int  VBoxGuestNetBSDAddIRQ(vboxguest_softc *pvState, struct pci_attach_args *pa);
-static int  VBoxGuestNetBSDISR(void *pvState);
+static int VBoxGuestNetBSDWsmEnable(void *cookie);
+static void VBoxGuestNetBSDWsmDisable(void *cookie);
+static int VBoxGuestNetBSDWsmIOCtl(void *cookie, u_long cmd, void *data, int flag, struct lwp *l);
+
+static int VBoxGuestNetBSDSetMouseStatus(vboxguest_softc *sc, uint32_t fStatus);
 
 
 /*********************************************************************************************************************************
 *   Global Variables                                                                                                             *
 *********************************************************************************************************************************/
+extern struct cfdriver vboxguest_cd; /* CFDRIVER_DECL */
+extern struct cfattach vboxguest_ca; /* CFATTACH_DECL */
+
 /*
  * The /dev/vboxguest character device entry points.
  */
@@ -169,248 +192,287 @@ static const struct fileops vboxguest_fileops = {
     .fo_restart = fnullop_restart
 };
 
+
+const struct wsmouse_accessops vboxguest_wsm_accessops = {
+    VBoxGuestNetBSDWsmEnable,
+    VBoxGuestNetBSDWsmIOCtl,
+    VBoxGuestNetBSDWsmDisable,
+};
+
+
+static struct wsmouse_calibcoords vboxguest_wsm_default_calib = {
+    .minx = VMMDEV_MOUSE_RANGE_MIN,
+    .miny = VMMDEV_MOUSE_RANGE_MIN,
+    .maxx = VMMDEV_MOUSE_RANGE_MAX,
+    .maxy = VMMDEV_MOUSE_RANGE_MAX,
+    .samplelen = WSMOUSE_CALIBCOORDS_RESET,
+};
+
 /** Device extention & session data association structure. */
 static VBOXGUESTDEVEXT      g_DevExt;
+
+static vboxguest_softc     *g_SC;
+
 /** Reference counter */
 static volatile uint32_t    cUsers;
 /** selinfo structure used for polling. */
 static struct selinfo       g_SelInfo;
 
-CFDRIVER_DECL(vboxguest, DV_DULL, NULL);
-extern struct cfdriver vboxguest_cd;
 
-/**
- * File open handler
- *
- */
-static int VBoxGuestNetBSDOpen(dev_t device, int flags, int fmt, struct lwp *process)
+CFATTACH_DECL_NEW(vboxguest, sizeof(vboxguest_softc),
+    VBoxGuestNetBSDMatch, VBoxGuestNetBSDAttach, VBoxGuestNetBSDDetach, NULL);
+
+
+static int VBoxGuestNetBSDMatch(device_t parent, cfdata_t match, void *aux)
 {
-    int rc;
-    vboxguest_softc *vboxguest;
-    struct vboxguest_session *session;
-    file_t *fp;
-    int fd, error;
+    const struct pci_attach_args *pa = aux;
 
-    LogFlow((DEVICE_NAME ": %s\n", __func__));
+    if (RT_UNLIKELY(g_SC != NULL)) /* should not happen */
+        return 0;
 
-    if ((vboxguest = device_lookup_private(&vboxguest_cd, minor(device))) == NULL)
+    if (   PCI_VENDOR(pa->pa_id) == VMMDEV_VENDORID
+        && PCI_PRODUCT(pa->pa_id) == VMMDEV_DEVICEID)
     {
-        printf("device_lookup_private failed\n");
-        return (ENXIO);
+        return 1;
     }
 
-    if ((vboxguest->vboxguest_state & VBOXGUEST_STATE_INITOK) == 0)
-    {
-        aprint_error_dev(vboxguest->sc_dev, "device not configured\n");
-        return (ENXIO);
-    }
+    return 0;
+}
 
-    session = kmem_alloc(sizeof(*session), KM_SLEEP);
-    if (session == NULL)
-    {
-        return (ENOMEM);
-    }
 
-    session->sc = vboxguest;
+static void VBoxGuestNetBSDAttach(device_t parent, device_t self, void *aux)
+{
+    int rc = VINF_SUCCESS;
+    int iResId = 0;
+    vboxguest_softc *sc;
+    struct pci_attach_args *pa = aux;
+    bus_space_tag_t iot, memt;
+    bus_space_handle_t ioh, memh;
+    bus_dma_segment_t seg;
+    int ioh_valid, memh_valid;
 
-    if ((error = fd_allocfile(&fp, &fd)) != 0)
-    {
-        kmem_free(session, sizeof(*session));
-        return error;
-    }
+    KASSERT(g_SC == NULL);
+
+    cUsers = 0;
+
+    aprint_normal(": VirtualBox Guest\n");
+
+    sc = device_private(self);
+    sc->sc_dev = self;
 
     /*
-     * Create a new session.
+     * Initialize IPRT R0 driver, which internally calls OS-specific r0 init.
      */
-    rc = VGDrvCommonCreateUserSession(&g_DevExt, &session->session);
-    if (! RT_SUCCESS(rc))
+    rc = RTR0Init(0);
+    if (RT_FAILURE(rc))
     {
-        aprint_error_dev(vboxguest->sc_dev, "VBox session creation failed\n");
-        closef(fp); /* ??? */
-        kmem_free(session, sizeof(*session));
-        return RTErrConvertToErrno(rc);
+        LogFunc(("RTR0Init failed.\n"));
+        aprint_error_dev(sc->sc_dev, "RTR0Init failed\n");
+        return;
     }
-    ASMAtomicIncU32(&cUsers);
-    return fd_clone(fp, fd, flags, &vboxguest_fileops, session);
 
-}
+    sc->sc_pc = pa->pa_pc;
 
-/**
- * File close handler
- *
- */
-static int VBoxGuestNetBSDClose(struct file *fp)
-{
-    struct vboxguest_session *session = fp->f_data;
-    vboxguest_softc *vboxguest = session->sc;
+    /*
+     * Allocate I/O port resource.
+     */
+    ioh_valid = (pci_mapreg_map(pa, PCI_BAR0,
+                                PCI_MAPREG_TYPE_IO, 0,
+                                &sc->sc_iot, &sc->sc_ioh,
+                                &sc->sc_iobase, &sc->sc_iosize) == 0);
 
-    LogFlow((DEVICE_NAME ": %s\n", __func__));
+    if (ioh_valid)
+    {
 
-    VGDrvCommonCloseSession(&g_DevExt, session->session);
-    ASMAtomicDecU32(&cUsers);
+        /*
+         * Map the MMIO region.
+         */
+        memh_valid = (pci_mapreg_map(pa, PCI_BAR1,
+                                     PCI_MAPREG_TYPE_MEM, BUS_SPACE_MAP_LINEAR,
+                                     &sc->sc_memt, &sc->sc_memh,
+                                     NULL, &sc->sc_memsize) == 0);
+        if (memh_valid)
+        {
+            /*
+             * Call the common device extension initializer.
+             */
+            rc = VGDrvCommonInitDevExt(&g_DevExt, sc->sc_iobase,
+                                       bus_space_vaddr(sc->sc_memt, sc->sc_memh),
+                                       sc->sc_memsize,
+#if ARCH_BITS == 64
+                                       VBOXOSTYPE_NetBSD_x64,
+#else
+                                       VBOXOSTYPE_NetBSD,
+#endif
+                                       VMMDEV_EVENT_MOUSE_POSITION_CHANGED);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Add IRQ of VMMDev.
+                 */
+                rc = VBoxGuestNetBSDAddIRQ(sc, pa);
+                if (RT_SUCCESS(rc))
+                {
+                    sc->vboxguest_state |= VBOXGUEST_STATE_INITOK;
+                    VBoxGuestNetBSDWsmAttach(sc);
 
-    kmem_free(session, sizeof(*session));
+                    g_SC = sc;
+                    return;
+                }
+                VGDrvCommonDeleteDevExt(&g_DevExt);
+            }
+            else
+            {
+                aprint_error_dev(sc->sc_dev, "init failed\n");
+            }
+            bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_memsize);
+        }
+        else
+        {
+            aprint_error_dev(sc->sc_dev, "MMIO mapping failed\n");
+        }
+        bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize);
+    }
+    else
+    {
+        aprint_error_dev(sc->sc_dev, "IO mapping failed\n");
+    }
 
-    return 0;
+    RTR0Term();
+    return;
 }
 
+
 /**
- * IOCTL handler
+ * Sets IRQ for VMMDev.
  *
+ * @returns NetBSD error code.
+ * @param   sc  Pointer to the state info structure.
+ * @param   pa  Pointer to the PCI attach arguments.
  */
-static int VBoxGuestNetBSDIOCtl(struct file *fp, u_long command, void *data)
+static int VBoxGuestNetBSDAddIRQ(vboxguest_softc *sc, struct pci_attach_args *pa)
 {
-    struct vboxguest_session *session = fp->f_data;
-    vboxguest_softc *vboxguest = session->sc;
-
+    int iResId = 0;
     int rc = 0;
+    const char *intrstr;
+#if __NetBSD_Prereq__(6, 99, 39)
+    char intstrbuf[100];
+#endif
 
-    LogFlow((DEVICE_NAME ": %s: command=%#lx data=%p\n",
-             __func__, command, data));
-
-    /*
-     * Validate the request wrapper.
-     */
-    if (IOCPARM_LEN(command) != sizeof(VBGLBIGREQ))
-    {
-        Log((DEVICE_NAME ": %s: bad request %#lx size=%lu expected=%zu\n",
-             __func__, command, IOCPARM_LEN(command), sizeof(VBGLBIGREQ)));
-        return ENOTTY;
-    }
+    LogFlow((DEVICE_NAME ": %s\n", __func__));
 
-    PVBGLBIGREQ ReqWrap = (PVBGLBIGREQ)data;
-    if (ReqWrap->u32Magic != VBGLBIGREQ_MAGIC)
-    {
-        Log((DEVICE_NAME ": %s: bad magic %#" PRIx32 "; pArg=%p Cmd=%#lx\n",
-             __func__, ReqWrap->u32Magic, data, command));
-        return EINVAL;
-    }
-    if (RT_UNLIKELY(   ReqWrap->cbData == 0
-                    || ReqWrap->cbData > _1M*16))
+    if (pci_intr_map(pa, &sc->ih))
     {
-        Log((DEVICE_NAME ": %s: bad size %" PRIu32 "; pArg=%p Cmd=%#lx\n",
-             __func__, ReqWrap->cbData, data, command));
-        return EINVAL;
+        aprint_error_dev(sc->sc_dev, "couldn't map interrupt.\n");
+        return VERR_DEV_IO_ERROR;
     }
 
-    /*
-     * Read the request.
-     */
-    void *pvBuf = RTMemTmpAlloc(ReqWrap->cbData);
-    if (RT_UNLIKELY(!pvBuf))
-    {
-        Log((DEVICE_NAME ": %s: RTMemTmpAlloc failed to alloc %" PRIu32 " bytes.\n",
-             __func__, ReqWrap->cbData));
-        return ENOMEM;
-    }
+    intrstr = pci_intr_string(sc->sc_pc, sc->ih
+#if __NetBSD_Prereq__(6, 99, 39)
+                              , intstrbuf, sizeof(intstrbuf)
+#endif
+                              );
+    aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
 
-    rc = copyin((void *)(uintptr_t)ReqWrap->pvDataR3, pvBuf, ReqWrap->cbData);
-    if (RT_UNLIKELY(rc))
+    sc->pfnIrqHandler = pci_intr_establish(sc->sc_pc, sc->ih, IPL_BIO, VBoxGuestNetBSDISR, sc);
+    if (sc->pfnIrqHandler == NULL)
     {
-        RTMemTmpFree(pvBuf);
-        Log((DEVICE_NAME ": %s: copyin failed; pvBuf=%p pArg=%p Cmd=%#lx. rc=%d\n",
-             __func__, pvBuf, data, command, rc));
-        aprint_error_dev(vboxguest->sc_dev, "copyin failed\n");
-        return EFAULT;
-    }
-    if (RT_UNLIKELY(   ReqWrap->cbData != 0
-                    && !VALID_PTR(pvBuf)))
-    {
-        RTMemTmpFree(pvBuf);
-        Log((DEVICE_NAME ": %s: invalid pvBuf=%p\n",
-             __func__, pvBuf));
-        return EINVAL;
+        aprint_error_dev(sc->sc_dev, "couldn't establish interrupt\n");
+        return VERR_DEV_IO_ERROR;
     }
 
-    /*
-     * Process the IOCtl.
-     */
-    size_t cbDataReturned;
-    rc = VGDrvCommonIoCtl(command, &g_DevExt, session->session, pvBuf, ReqWrap->cbData, &cbDataReturned);
-    if (RT_SUCCESS(rc))
-    {
-        rc = 0;
-        if (RT_UNLIKELY(cbDataReturned > ReqWrap->cbData))
-        {
-            Log((DEVICE_NAME ": %s: too much output data %zu expected %" PRIu32 "\n",
-                 __func__, cbDataReturned, ReqWrap->cbData));
-            cbDataReturned = ReqWrap->cbData;
-        }
-        if (cbDataReturned > 0)
-        {
-            rc = copyout(pvBuf, (void *)(uintptr_t)ReqWrap->pvDataR3, cbDataReturned);
-            if (RT_UNLIKELY(rc))
-            {
-                Log((DEVICE_NAME ": %s: copyout failed; pvBuf=%p pArg=%p. rc=%d\n",
-                     __func__, pvBuf, data, rc));
-            }
-        }
-    } else {
-        Log((DEVICE_NAME ": %s: VGDrvCommonIoCtl failed. rc=%d\n",
-             __func__, rc));
-        rc = -rc;
-    }
-    RTMemTmpFree(pvBuf);
-    return rc;
+    return VINF_SUCCESS;
 }
 
-static int VBoxGuestNetBSDPoll(struct file *fp, int events)
+
+/*
+ * Optionally attach wsmouse(4) device as a child.
+ */
+static void VBoxGuestNetBSDWsmAttach(vboxguest_softc *sc)
 {
-    struct vboxguest_session *session = fp->f_data;
-    vboxguest_softc *vboxguest = session->sc;
+    struct wsmousedev_attach_args am = { &vboxguest_wsm_accessops, sc };
 
-    int rc = 0;
-    int events_processed;
+    PVBOXGUESTSESSION session = NULL;
+    VMMDevReqMouseStatus *req = NULL;
+    int rc;
 
-    uint32_t u32CurSeq;
+    rc = VGDrvCommonCreateKernelSession(&g_DevExt, &session);
+    if (RT_FAILURE(rc))
+        goto fail;
 
-    LogFlow((DEVICE_NAME ": %s\n", __func__));
+    rc = VbglR0GRAlloc((VMMDevRequestHeader **)&req, sizeof(*req),
+                       VMMDevReq_GetMouseStatus);
+    if (RT_FAILURE(rc))
+        goto fail;
 
-    u32CurSeq = ASMAtomicUoReadU32(&g_DevExt.u32MousePosChangedSeq);
-    if (session->session->u32MousePosChangedSeq != u32CurSeq)
-    {
-        events_processed = events & (POLLIN | POLLRDNORM);
-        session->session->u32MousePosChangedSeq = u32CurSeq;
-    }
-    else
-    {
-        events_processed = 0;
+    sc->sc_wsmousedev = config_found_ia(sc->sc_dev, "wsmousedev", &am, wsmousedevprint);
+    if (sc->sc_wsmousedev == NULL)
+        goto fail;
 
-        selrecord(curlwp, &g_SelInfo);
-    }
+    sc->sc_session = session;
+    sc->sc_vmmmousereq = req;
 
-    return events_processed;
+    tpcalib_init(&sc->sc_tpcalib);
+    tpcalib_ioctl(&sc->sc_tpcalib, WSMOUSEIO_SCALIBCOORDS,
+                  &vboxguest_wsm_default_calib, 0, 0);
+    return;
+
+  fail:
+    if (session != NULL)
+        VGDrvCommonCloseSession(&g_DevExt, session);
+    if (req != NULL)
+        VbglR0GRFree((VMMDevRequestHeader *)req);
 }
 
+
 static int VBoxGuestNetBSDDetach(device_t self, int flags)
 {
-    vboxguest_softc *vboxguest;
-    vboxguest = device_private(self);
+    vboxguest_softc *sc;
+    sc = device_private(self);
 
     LogFlow((DEVICE_NAME ": %s\n", __func__));
 
     if (cUsers > 0)
         return EBUSY;
 
-    if ((vboxguest->vboxguest_state & VBOXGUEST_STATE_INITOK) == 0)
+    if ((sc->vboxguest_state & VBOXGUEST_STATE_INITOK) == 0)
         return 0;
 
     /*
      * Reverse what we did in VBoxGuestNetBSDAttach.
      */
+    if (sc->sc_vmmmousereq != NULL)
+        VbglR0GRFree((VMMDevRequestHeader *)sc->sc_vmmmousereq);
 
-    VBoxGuestNetBSDRemoveIRQ(vboxguest);
+    VBoxGuestNetBSDRemoveIRQ(sc);
 
     VGDrvCommonDeleteDevExt(&g_DevExt);
 
-    bus_space_unmap(vboxguest->iVMMDevMemResId, vboxguest->VMMDevMemHandle, vboxguest->VMMDevMemSize);
-    bus_space_unmap(vboxguest->io_tag, vboxguest->io_handle, vboxguest->io_regsize);
+    bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_memsize);
+    bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_iosize);
 
     RTR0Term();
 
-    return 0;
+    return config_detach_children(self, flags);
 }
 
+
+/**
+ * Removes IRQ for VMMDev.
+ *
+ * @param   sc      Opaque pointer to the state info structure.
+ */
+static void VBoxGuestNetBSDRemoveIRQ(vboxguest_softc *sc)
+{
+    LogFlow((DEVICE_NAME ": %s\n", __func__));
+
+    if (sc->pfnIrqHandler)
+    {
+        pci_intr_disestablish(sc->sc_pc, sc->pfnIrqHandler);
+    }
+}
+
+
 /**
  * Interrupt service routine.
  *
@@ -423,265 +485,498 @@ static int VBoxGuestNetBSDISR(void *pvState)
 
     bool fOurIRQ = VGDrvCommonISR(&g_DevExt);
 
-    return fOurIRQ ? 0 : 1;
+    return fOurIRQ ? 1 : 0;
 }
 
+
+/*
+ * Called by VGDrvCommonISR() if mouse position changed
+ */
 void VGDrvNativeISRMousePollEvent(PVBOXGUESTDEVEXT pDevExt)
 {
+    vboxguest_softc *sc = g_SC;
+
     LogFlow((DEVICE_NAME ": %s\n", __func__));
 
     /*
      * Wake up poll waiters.
      */
     selnotify(&g_SelInfo, 0, 0);
+
+    if (sc->sc_vmmmousereq != NULL) {
+        int x, y;
+        int rc;
+
+        sc->sc_vmmmousereq->mouseFeatures = 0;
+        sc->sc_vmmmousereq->pointerXPos = 0;
+        sc->sc_vmmmousereq->pointerYPos = 0;
+
+        rc = VbglR0GRPerform(&sc->sc_vmmmousereq->header);
+        if (RT_FAILURE(rc))
+            return;
+
+        tpcalib_trans(&sc->sc_tpcalib,
+                      sc->sc_vmmmousereq->pointerXPos,
+                      sc->sc_vmmmousereq->pointerYPos,
+                      &x, &y);
+
+        wsmouse_input(sc->sc_wsmousedev,
+                      0,    /* buttons */
+                      x, y,
+                      0, 0, /* z, w */
+                      WSMOUSE_INPUT_ABSOLUTE_X | WSMOUSE_INPUT_ABSOLUTE_Y);
+    }
+}
+
+
+static int VBoxGuestNetBSDSetMouseStatus(vboxguest_softc *sc, uint32_t fStatus)
+{
+    VBGLIOCSETMOUSESTATUS Req;
+    int rc;
+
+    VBGLREQHDR_INIT(&Req.Hdr, SET_MOUSE_STATUS);
+    Req.u.In.fStatus = fStatus;
+    rc = VGDrvCommonIoCtl(VBGL_IOCTL_SET_MOUSE_STATUS,
+                          &g_DevExt,
+                          sc->sc_session,
+                          &Req.Hdr, sizeof(Req));
+    if (RT_SUCCESS(rc))
+        rc = Req.Hdr.rc;
+
+    return rc;
+}
+
+
+static int
+VBoxGuestNetBSDWsmEnable(void *cookie)
+{
+    vboxguest_softc *sc = cookie;
+    int rc;
+
+    rc = VBoxGuestNetBSDSetMouseStatus(sc, VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE
+                                         | VMMDEV_MOUSE_NEW_PROTOCOL);
+    if (RT_FAILURE(rc))
+        return RTErrConvertToErrno(rc);
+
+    return 0;
+}
+
+
+static void
+VBoxGuestNetBSDWsmDisable(void *cookie)
+{
+    vboxguest_softc *sc = cookie;
+    VBoxGuestNetBSDSetMouseStatus(sc, 0);
 }
 
+
+static int
+VBoxGuestNetBSDWsmIOCtl(void *cookie, u_long cmd, void *data, int flag, struct lwp *l)
+{
+    vboxguest_softc *sc = cookie;
+
+    switch (cmd) {
+    case WSMOUSEIO_GTYPE:
+        *(u_int *)data = WSMOUSE_TYPE_TPANEL;
+        break;
+
+    case WSMOUSEIO_SCALIBCOORDS:
+    case WSMOUSEIO_GCALIBCOORDS:
+        return tpcalib_ioctl(&sc->sc_tpcalib, cmd, data, flag, l);
+
+    default:
+        return EPASSTHROUGH;
+    }
+    return 0;
+}
+
+
 /**
- * Sets IRQ for VMMDev.
+ * File open handler
  *
- * @returns NetBSD error code.
- * @param   vboxguest  Pointer to the state info structure.
- * @param   pa  Pointer to the PCI attach arguments.
  */
-static int VBoxGuestNetBSDAddIRQ(vboxguest_softc *vboxguest, struct pci_attach_args *pa)
+static int VBoxGuestNetBSDOpen(dev_t device, int flags, int fmt, struct lwp *process)
 {
-    int iResId = 0;
-    int rc = 0;
-    const char *intrstr;
-#if __NetBSD_Prereq__(6, 99, 39)
-    char intstrbuf[100];
-#endif
+    int rc;
+    vboxguest_softc *sc;
+    struct vboxguest_fdata *fdata;
+    file_t *fp;
+    int fd, error;
 
     LogFlow((DEVICE_NAME ": %s\n", __func__));
 
-    if (pci_intr_map(pa, &vboxguest->ih))
+    if ((sc = device_lookup_private(&vboxguest_cd, minor(device))) == NULL)
     {
-        aprint_error_dev(vboxguest->sc_dev, "couldn't map interrupt.\n");
-        return VERR_DEV_IO_ERROR;
+        printf("device_lookup_private failed\n");
+        return (ENXIO);
     }
 
-    intrstr = pci_intr_string(vboxguest->pc, vboxguest->ih
-#if __NetBSD_Prereq__(6, 99, 39)
-                              , intstrbuf, sizeof(intstrbuf)
-#endif
-                              );
-    aprint_normal_dev(vboxguest->sc_dev, "interrupting at %s\n", intrstr);
+    if ((sc->vboxguest_state & VBOXGUEST_STATE_INITOK) == 0)
+    {
+        aprint_error_dev(sc->sc_dev, "device not configured\n");
+        return (ENXIO);
+    }
 
-    vboxguest->pfnIrqHandler = pci_intr_establish(vboxguest->pc, vboxguest->ih, IPL_BIO, VBoxGuestNetBSDISR, vboxguest);
-    if (vboxguest->pfnIrqHandler == NULL)
+    fdata = kmem_alloc(sizeof(*fdata), KM_SLEEP);
+    if (fdata == NULL)
     {
-        aprint_error_dev(vboxguest->sc_dev, "couldn't establish interrupt\n");
-        return VERR_DEV_IO_ERROR;
+        return (ENOMEM);
     }
 
-    return VINF_SUCCESS;
+    fdata->sc = sc;
+
+    if ((error = fd_allocfile(&fp, &fd)) != 0)
+    {
+        kmem_free(fdata, sizeof(*fdata));
+        return error;
+    }
+
+    /*
+     * Create a new session.
+     */
+    rc = VGDrvCommonCreateUserSession(&g_DevExt, &fdata->session);
+    if (! RT_SUCCESS(rc))
+    {
+        aprint_error_dev(sc->sc_dev, "VBox session creation failed\n");
+        closef(fp); /* ??? */
+        kmem_free(fdata, sizeof(*fdata));
+        return RTErrConvertToErrno(rc);
+    }
+    ASMAtomicIncU32(&cUsers);
+    return fd_clone(fp, fd, flags, &vboxguest_fileops, fdata);
+
 }
 
 /**
- * Removes IRQ for VMMDev.
+ * File close handler
  *
- * @param   vboxguest  Opaque pointer to the state info structure.
  */
-static void VBoxGuestNetBSDRemoveIRQ(vboxguest_softc *vboxguest)
+static int VBoxGuestNetBSDClose(struct file *fp)
 {
+    struct vboxguest_fdata *fdata = fp->f_data;
+    vboxguest_softc *sc = fdata->sc;
+
     LogFlow((DEVICE_NAME ": %s\n", __func__));
 
-    if (vboxguest->pfnIrqHandler)
-    {
-        pci_intr_disestablish(vboxguest->pc, vboxguest->pfnIrqHandler);
-    }
+    VGDrvCommonCloseSession(&g_DevExt, fdata->session);
+    ASMAtomicDecU32(&cUsers);
+
+    kmem_free(fdata, sizeof(*fdata));
+
+    return 0;
 }
 
-static void VBoxGuestNetBSDAttach(device_t parent, device_t self, void *aux)
+/**
+ * IOCTL handler
+ *
+ */
+static int VBoxGuestNetBSDIOCtl(struct file *fp, u_long command, void *data)
 {
-    int rc = VINF_SUCCESS;
-    int iResId = 0;
-    vboxguest_softc *vboxguest;
-    struct pci_attach_args *pa = aux;
-    bus_space_tag_t iot, memt;
-    bus_space_handle_t ioh, memh;
-    bus_dma_segment_t seg;
-    int ioh_valid, memh_valid;
+    struct vboxguest_fdata *fdata = fp->f_data;
 
-    cUsers = 0;
+    if (VBGL_IOCTL_IS_FAST(command))
+        return VGDrvCommonIoCtlFast(command, &g_DevExt, fdata->session);
 
-    aprint_normal(": VirtualBox Guest\n");
+    return VBoxGuestNetBSDIOCtlSlow(fdata, command, data);
+}
+
+static int VBoxGuestNetBSDIOCtlSlow(struct vboxguest_fdata *fdata, u_long command, void *data)
+{
+    vboxguest_softc *sc = fdata->sc;
+    size_t cbReq = IOCPARM_LEN(command);
+    PVBGLREQHDR pHdr = NULL;
+    void *pvUser = NULL;
+    int err, rc;
 
-    vboxguest = device_private(self);
-    vboxguest->sc_dev = self;
+    LogFlow(("%s: command=%#lx data=%p\n", __func__, command, data));
 
     /*
-     * Initialize IPRT R0 driver, which internally calls OS-specific r0 init.
+     * Buffered request?
      */
-    rc = RTR0Init(0);
-    if (RT_FAILURE(rc))
+    if ((command & IOC_DIRMASK) == IOC_INOUT)
     {
-        LogFunc(("RTR0Init failed.\n"));
-        aprint_error_dev(vboxguest->sc_dev, "RTR0Init failed\n");
-        return;
+        /* will be validated by VGDrvCommonIoCtl() */
+        pHdr = (PVBGLREQHDR)data;
     }
 
-    vboxguest->pc = pa->pa_pc;
-
     /*
-     * Allocate I/O port resource.
+     * Big unbuffered request?  "data" is the userland pointer.
      */
-    ioh_valid = (pci_mapreg_map(pa, PCI_MAPREG_START, PCI_MAPREG_TYPE_IO, 0, &vboxguest->io_tag, &vboxguest->io_handle, &vboxguest->uIOPortBase, &vboxguest->io_regsize) == 0);
+    else if ((command & IOC_DIRMASK) == IOC_VOID && cbReq != 0)
+    {
+        /*
+         * Read the header, validate it and figure out how much that
+         * needs to be buffered.
+         */
+        VBGLREQHDR Hdr;
 
-    if (ioh_valid)
+        if (RT_UNLIKELY(cbReq < sizeof(Hdr)))
+            return ENOTTY;
+
+        pvUser = data;
+        err = copyin(pvUser, &Hdr, sizeof(Hdr));
+        if (RT_UNLIKELY(err != 0))
+            return err;
+
+        if (RT_UNLIKELY(Hdr.uVersion != VBGLREQHDR_VERSION))
+            return ENOTTY;
+
+        if (cbReq > 16 * _1M)
+            return EINVAL;
+
+        if (Hdr.cbOut == 0)
+            Hdr.cbOut = Hdr.cbIn;
+
+        if (RT_UNLIKELY(   Hdr.cbIn  < sizeof(Hdr) || Hdr.cbIn  > cbReq
+                        || Hdr.cbOut < sizeof(Hdr) || Hdr.cbOut > cbReq))
+            return EINVAL;
+
+        /*
+         * Allocate buffer and copy in the data.
+         */
+        cbReq = RT_MAX(Hdr.cbIn, Hdr.cbOut);
+
+        pHdr = (PVBGLREQHDR)RTMemTmpAlloc(cbReq);
+        if (RT_UNLIKELY(pHdr == NULL))
+        {
+            LogRel(("%s: command=%#lx data=%p: unable to allocate %zu bytes\n",
+                    __func__, command, data, cbReq));
+            return ENOMEM;
+        }
+
+        err = copyin(pvUser, pHdr, Hdr.cbIn);
+        if (err != 0)
+        {
+            RTMemTmpFree(pHdr);
+            return err;
+        }
+
+        if (Hdr.cbIn < cbReq)
+            memset((uint8_t *)pHdr + Hdr.cbIn, '\0', cbReq - Hdr.cbIn);
+    }
+
+    /*
+     * Process the IOCtl.
+     */
+    rc = VGDrvCommonIoCtl(command, &g_DevExt, fdata->session, pHdr, cbReq);
+    if (RT_SUCCESS(rc))
     {
+        err = 0;
 
         /*
-         * Map the MMIO region.
+         * If unbuffered, copy back the result before returning.
          */
-        memh_valid = (pci_mapreg_map(pa, PCI_MAPREG_START+4, PCI_MAPREG_TYPE_MEM, BUS_SPACE_MAP_LINEAR, &vboxguest->iVMMDevMemResId, &vboxguest->VMMDevMemHandle, &vboxguest->pMMIOBase, &vboxguest->VMMDevMemSize) == 0);
-        if (memh_valid)
+        if (pvUser != NULL)
         {
-            /*
-             * Call the common device extension initializer.
-             */
-            rc = VGDrvCommonInitDevExt(&g_DevExt, vboxguest->uIOPortBase,
-                    bus_space_vaddr(vboxguest->iVMMDevMemResId,
-                            vboxguest->VMMDevMemHandle),
-                                       vboxguest->VMMDevMemSize,
-#if ARCH_BITS == 64
-                                       VBOXOSTYPE_NetBSD_x64,
-#else
-                                       VBOXOSTYPE_NetBSD,
-#endif
-                                       VMMDEV_EVENT_MOUSE_POSITION_CHANGED);
-            if (RT_SUCCESS(rc))
+            size_t cbOut = pHdr->cbOut;
+            if (cbOut > cbReq)
             {
-                /*
-                 * Add IRQ of VMMDev.
-                 */
-                rc = VBoxGuestNetBSDAddIRQ(vboxguest, pa);
-                if (RT_SUCCESS(rc))
-                {
-                    vboxguest->vboxguest_state |= VBOXGUEST_STATE_INITOK;
-                    return;
-                }
-                VGDrvCommonDeleteDevExt(&g_DevExt);
+                LogRel(("%s: command=%#lx data=%p: too much output: %zu > %zu\n",
+                        __func__, command, data, cbOut, cbReq));
+                cbOut = cbReq;
             }
-            else
-            {
-                aprint_error_dev(vboxguest->sc_dev, "init failed\n");
-            }
-            bus_space_unmap(vboxguest->iVMMDevMemResId, vboxguest->VMMDevMemHandle, vboxguest->VMMDevMemSize);
-        }
-        else
-        {
-            aprint_error_dev(vboxguest->sc_dev, "MMIO mapping failed\n");
+
+            err = copyout(pHdr, pvUser, cbOut);
+            RTMemTmpFree(pHdr);
         }
-        bus_space_unmap(vboxguest->io_tag, vboxguest->io_handle, vboxguest->io_regsize);
     }
     else
     {
-        aprint_error_dev(vboxguest->sc_dev, "IO mapping failed\n");
+        LogRel(("%s: command=%#lx data=%p: error %Rrc\n",
+                __func__, command, data, rc));
+
+        if (pvUser != NULL)
+            RTMemTmpFree(pHdr);
+
+        err = RTErrConvertToErrno(rc);
     }
 
-    RTR0Term();
-    return;
+    return err;
 }
 
-static int
-VBoxGuestNetBSDMatch(device_t parent, cfdata_t match, void *aux)
+static int VBoxGuestNetBSDPoll(struct file *fp, int events)
 {
-    const struct pci_attach_args *pa = aux;
+    struct vboxguest_fdata *fdata = fp->f_data;
+    vboxguest_softc *sc = fdata->sc;
 
-    if (   PCI_VENDOR(pa->pa_id) == VMMDEV_VENDORID
-        && PCI_PRODUCT(pa->pa_id) == VMMDEV_DEVICEID)
+    int rc = 0;
+    int events_processed;
+
+    uint32_t u32CurSeq;
+
+    LogFlow((DEVICE_NAME ": %s\n", __func__));
+
+    u32CurSeq = ASMAtomicUoReadU32(&g_DevExt.u32MousePosChangedSeq);
+    if (fdata->session->u32MousePosChangedSeq != u32CurSeq)
     {
-        return 1;
+        events_processed = events & (POLLIN | POLLRDNORM);
+        fdata->session->u32MousePosChangedSeq = u32CurSeq;
     }
+    else
+    {
+        events_processed = 0;
 
-    return 0;
+        selrecord(curlwp, &g_SelInfo);
+    }
+
+    return events_processed;
 }
 
-/* Common code that depend on g_DevExt. */
-#include "VBoxGuestIDC-unix.c.h"
 
-CFATTACH_DECL_NEW(vboxguest, sizeof(vboxguest_softc),
-    VBoxGuestNetBSDMatch, VBoxGuestNetBSDAttach, VBoxGuestNetBSDDetach, NULL);
+/**
+ * @note This code is duplicated on other platforms with variations, so please
+ *       keep them all up to date when making changes!
+ */
+int VBOXCALL VBoxGuestIDC(void *pvSession, uintptr_t uReq, PVBGLREQHDR pReqHdr, size_t cbReq)
+{
+    /*
+     * Simple request validation (common code does the rest).
+     */
+    int rc;
+    if (   RT_VALID_PTR(pReqHdr)
+        && cbReq >= sizeof(*pReqHdr))
+    {
+        /*
+         * All requests except the connect one requires a valid session.
+         */
+        PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)pvSession;
+        if (pSession)
+        {
+            if (   RT_VALID_PTR(pSession)
+                && pSession->pDevExt == &g_DevExt)
+                rc = VGDrvCommonIoCtl(uReq, &g_DevExt, pSession, pReqHdr, cbReq);
+            else
+                rc = VERR_INVALID_HANDLE;
+        }
+        else if (uReq == VBGL_IOCTL_IDC_CONNECT)
+        {
+            rc = VGDrvCommonCreateKernelSession(&g_DevExt, &pSession);
+            if (RT_SUCCESS(rc))
+            {
+                rc = VGDrvCommonIoCtl(uReq, &g_DevExt, pSession, pReqHdr, cbReq);
+                if (RT_FAILURE(rc))
+                    VGDrvCommonCloseSession(&g_DevExt, pSession);
+            }
+        }
+        else
+            rc = VERR_INVALID_HANDLE;
+    }
+    else
+        rc = VERR_INVALID_POINTER;
+    return rc;
+}
+
 
 MODULE(MODULE_CLASS_DRIVER, vboxguest, "pci");
 
-static int loc[2] = {-1, -1};
+/*
+ * XXX: See netbsd/vboxguest.ioconf for the details.
+*/
+#if 0
+#include "ioconf.c"
+#else
 
-static const struct cfparent pspec = {
+static const struct cfiattrdata wsmousedevcf_iattrdata = {
+    "wsmousedev", 1, {
+        { "mux", "0", 0 },
+    }
+};
+
+/* device vboxguest: wsmousedev */
+static const struct cfiattrdata * const vboxguest_attrs[] = { &wsmousedevcf_iattrdata, NULL };
+CFDRIVER_DECL(vboxguest, DV_DULL, vboxguest_attrs);
+
+static struct cfdriver * const cfdriver_ioconf_vboxguest[] = {
+    &vboxguest_cd, NULL
+};
+
+
+static const struct cfparent vboxguest_pspec = {
     "pci", "pci", DVUNIT_ANY
 };
+static int vboxguest_loc[] = { -1, -1 };
+
 
-static struct cfdata vboxguest_cfdata[] = {
+static const struct cfparent wsmousedev_pspec = {
+    "wsmousedev", "vboxguest", DVUNIT_ANY
+};
+static int wsmousedev_loc[] = { 0 };
+
+
+static struct cfdata cfdata_ioconf_vboxguest[] = {
+    /*  vboxguest0 at pci? dev ? function ? */
     {
         .cf_name = "vboxguest",
         .cf_atname = "vboxguest",
         .cf_unit = 0,           /* Only unit 0 is ever used  */
-        .cf_fstate = FSTATE_STAR,
-        .cf_loc = loc,
+        .cf_fstate = FSTATE_NOTFOUND,
+        .cf_loc = vboxguest_loc,
         .cf_flags = 0,
-        .cf_pspec = &pspec,
+        .cf_pspec = &vboxguest_pspec,
     },
+
+    /* wsmouse* at vboxguest? */
+    { "wsmouse", "wsmouse", 0, FSTATE_STAR, wsmousedev_loc, 0, &wsmousedev_pspec },
+
     { NULL, NULL, 0, 0, NULL, 0, NULL }
 };
 
+static struct cfattach * const vboxguest_cfattachinit[] = {
+    &vboxguest_ca, NULL
+};
+
+static const struct cfattachinit cfattach_ioconf_vboxguest[] = {
+    { "vboxguest", vboxguest_cfattachinit },
+    { NULL, NULL }
+};
+#endif
+
+
 static int
 vboxguest_modcmd(modcmd_t cmd, void *opaque)
 {
     devmajor_t bmajor, cmajor;
-    int error;
     register_t retval;
+    int error;
 
     LogFlow((DEVICE_NAME ": %s\n", __func__));
 
-    bmajor = cmajor = NODEVMAJOR;
     switch (cmd)
     {
         case MODULE_CMD_INIT:
-            error = config_cfdriver_attach(&vboxguest_cd);
-            if (error)
-            {
-                printf("config_cfdriver_attach failed: %d", error);
-                break;
-            }
-            error = config_cfattach_attach(vboxguest_cd.cd_name, &vboxguest_ca);
+            error = config_init_component(cfdriver_ioconf_vboxguest,
+                                          cfattach_ioconf_vboxguest,
+                                          cfdata_ioconf_vboxguest);
             if (error)
-            {
-                config_cfdriver_detach(&vboxguest_cd);
-                printf("%s: unable to register cfattach\n", vboxguest_cd.cd_name);
                 break;
-            }
-            error = config_cfdata_attach(vboxguest_cfdata, 1);
+
+            bmajor = cmajor = NODEVMAJOR;
+            error = devsw_attach("vboxguest",
+                                 NULL, &bmajor,
+                                 &g_VBoxGuestNetBSDChrDevSW, &cmajor);
             if (error)
             {
-                printf("%s: unable to attach cfdata\n", vboxguest_cd.cd_name);
-                config_cfattach_detach(vboxguest_cd.cd_name, &vboxguest_ca);
-                config_cfdriver_detach(&vboxguest_cd);
-                break;
+                if (error == EEXIST)
+                    error = 0; /* maybe built-in ... improve eventually */
+                else
+                    break;
             }
 
-            error = devsw_attach("vboxguest", NULL, &bmajor, &g_VBoxGuestNetBSDChrDevSW, &cmajor);
-
-            if (error == EEXIST)
-                error = 0; /* maybe built-in ... improve eventually */
-
-            if (error)
-                break;
-
-            error = do_sys_mknod(curlwp, "/dev/vboxguest", 0666|S_IFCHR, makedev(cmajor, 0), &retval, UIO_SYSSPACE);
+            error = do_sys_mknod(curlwp, "/dev/vboxguest",
+                                 0666|S_IFCHR, makedev(cmajor, 0),
+                                 &retval, UIO_SYSSPACE);
             if (error == EEXIST)
                 error = 0;
             break;
 
         case MODULE_CMD_FINI:
-            error = config_cfdata_detach(vboxguest_cfdata);
+            error = config_fini_component(cfdriver_ioconf_vboxguest,
+                                          cfattach_ioconf_vboxguest,
+                                          cfdata_ioconf_vboxguest);
             if (error)
                 break;
-            error = config_cfattach_detach(vboxguest_cd.cd_name, &vboxguest_ca);
-            if (error)
-                break;
-            config_cfdriver_detach(&vboxguest_cd);
-            error = devsw_detach(NULL, &g_VBoxGuestNetBSDChrDevSW);
+
+            devsw_detach(NULL, &g_VBoxGuestNetBSDChrDevSW);
             break;
 
         default:
diff --git a/src/VBox/Additions/common/VBoxService/VBoxService.cpp b/src/VBox/Additions/common/VBoxService/VBoxService.cpp
index 7b7523d..642c858 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxService.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxService.cpp
@@ -333,6 +333,36 @@ int VGSvcLogCreate(const char *pszLogFile)
 }
 
 
+/**
+ * Logs a verbose message.
+ *
+ * @param   pszFormat   The message text.
+ * @param   va          Format arguments.
+ */
+void VGSvcLogV(const char *pszFormat, va_list va)
+{
+#ifdef DEBUG
+    int rc = RTCritSectEnter(&g_csLog);
+    if (RT_SUCCESS(rc))
+    {
+#endif
+        char *psz = NULL;
+        RTStrAPrintfV(&psz, pszFormat, va);
+
+        AssertPtr(psz);
+        LogRel(("%s", psz));
+
+        RTStrFree(psz);
+#ifdef DEBUG
+        RTCritSectLeave(&g_csLog);
+    }
+#endif
+}
+
+
+/**
+ * Destroys the currently active logging instance.
+ */
 void VGSvcLogDestroy(void)
 {
     RTLogDestroy(RTLogRelSetDefaultInstance(NULL));
@@ -414,7 +444,8 @@ RTEXITCODE VGSvcError(const char *pszFormat, ...)
 
 
 /**
- * Displays a verbose message.
+ * Displays a verbose message based on the currently
+ * set global verbosity level.
  *
  * @param   iLevel      Minimum log level required to display this message.
  * @param   pszFormat   The message text.
@@ -424,25 +455,10 @@ void VGSvcVerbose(unsigned iLevel, const char *pszFormat, ...)
 {
     if (iLevel <= g_cVerbosity)
     {
-#ifdef DEBUG
-        int rc = RTCritSectEnter(&g_csLog);
-        if (RT_SUCCESS(rc))
-        {
-#endif
-            va_list args;
-            va_start(args, pszFormat);
-            char *psz = NULL;
-            RTStrAPrintfV(&psz, pszFormat, args);
-            va_end(args);
-
-            AssertPtr(psz);
-            LogRel(("%s", psz));
-
-            RTStrFree(psz);
-#ifdef DEBUG
-            RTCritSectLeave(&g_csLog);
-        }
-#endif
+        va_list va;
+        va_start(va, pszFormat);
+        VGSvcLogV(pszFormat, va);
+        va_end(va);
     }
 }
 
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h b/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h
index b95c67d..2e343a2 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h
@@ -27,6 +27,7 @@
 #include <iprt/list.h>
 #include <iprt/critsect.h>
 #include <iprt/path.h> /* RTPATH_MAX */
+#include <iprt/stdarg.h>
 
 #include <VBox/VBoxGuestLib.h>
 #include <VBox/HostServices/GuestControlSvc.h>
@@ -184,6 +185,7 @@ extern RTEXITCODE               VGSvcSyntax(const char *pszFormat, ...);
 extern RTEXITCODE               VGSvcError(const char *pszFormat, ...);
 extern void                     VGSvcVerbose(unsigned iLevel, const char *pszFormat, ...);
 extern int                      VGSvcLogCreate(const char *pszLogFile);
+extern void                     VGSvcLogV(const char *pszFormat, va_list va);
 extern void                     VGSvcLogDestroy(void);
 extern int                      VGSvcArgUInt32(int argc, char **argv, const char *psz, int *pi, uint32_t *pu32,
                                                uint32_t u32Min, uint32_t u32Max);
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceTimeSync.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceTimeSync.cpp
index 3196240..3806941 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceTimeSync.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceTimeSync.cpp
@@ -130,6 +130,9 @@ static uint32_t         g_TimeSyncSetThreshold = 20*60*1000;
 static bool volatile    g_fTimeSyncSetNext = false;
 /** Whether to set the time when the VM was restored. */
 static bool             g_fTimeSyncSetOnRestore = true;
+/** The logging verbosity level.
+ *  This uses the global verbosity level by default. */
+static uint32_t         g_cTimeSyncVerbosity = 0;
 
 /** Current error count. Used to knowing when to bitch and when not to. */
 static uint32_t         g_cTimeSyncErrors = 0;
@@ -157,6 +160,9 @@ static BOOL             g_bWinTimeAdjustmentDisabled;
  */
 static DECLCALLBACK(int) vgsvcTimeSyncPreInit(void)
 {
+    /* Use global verbosity as default. */
+    g_cTimeSyncVerbosity = g_cVerbosity;
+
 #ifdef VBOX_WITH_GUEST_PROPS
     /** @todo Merge this function with vgsvcTimeSyncOption() to generalize
      *        the "command line args override guest property values" behavior. */
@@ -200,25 +206,33 @@ static DECLCALLBACK(int) vgsvcTimeSyncPreInit(void)
         if (   RT_SUCCESS(rc)
             || rc == VERR_NOT_FOUND)
         {
-            char *pszValue;
-            rc = VGSvcReadProp(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-start",
-                               &pszValue, NULL /* ppszFlags */, NULL /* puTimestamp */);
+            rc = VGSvcCheckPropExist(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-start");
             if (RT_SUCCESS(rc))
-            {
                 g_fTimeSyncSetNext = true;
-                RTStrFree(pszValue);
-            }
         }
         if (   RT_SUCCESS(rc)
             || rc == VERR_NOT_FOUND)
         {
-            uint32_t value;
-            rc = VGSvcReadPropUInt32(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-on-restore",
-                                     &value, 1, 1);
+            rc = VGSvcCheckPropExist(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-on-restore");
             if (RT_SUCCESS(rc))
-                g_fTimeSyncSetOnRestore = !!value;
+                g_fTimeSyncSetOnRestore = true;
+        }
+        if (   RT_SUCCESS(rc)
+            || rc == VERR_NOT_FOUND)
+        {
+            rc = VGSvcCheckPropExist(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/VBoxService/--timesync-no-set-on-restore");
+            if (RT_SUCCESS(rc))
+                g_fTimeSyncSetOnRestore = false;
+        }
+        if (   RT_SUCCESS(rc)
+            || rc == VERR_NOT_FOUND)
+        {
+            uint32_t uValue;
+            rc = VGSvcReadPropUInt32(uGuestPropSvcClientID, "/VirtualBox/GuestAdd/VBoxService/--timesync-verbosity",
+                                     &uValue, 0 /*uMin*/, 255 /*uMax*/);
+            if (RT_SUCCESS(rc))
+                g_cTimeSyncVerbosity = uValue;
         }
-
         VbglR3GuestPropDisconnect(uGuestPropSvcClientID);
     }
 
@@ -233,14 +247,33 @@ static DECLCALLBACK(int) vgsvcTimeSyncPreInit(void)
 
 
 /**
+ * Displays a verbose message based on the currently
+ * set timesync verbosity level.
+ *
+ * @param   iLevel      Minimum log level required to display this message.
+ * @param   pszFormat   The message text.
+ * @param   ...         Format arguments.
+ */
+static void vgsvcTimeSyncLog(unsigned iLevel, const char *pszFormat, ...)
+{
+    if (iLevel <= g_cTimeSyncVerbosity)
+    {
+        va_list va;
+        va_start(va, pszFormat);
+        VGSvcLogV(pszFormat, va);
+        va_end(va);
+    }
+}
+
+
+/**
  * @interface_method_impl{VBOXSERVICE,pfnOption}
  */
 static DECLCALLBACK(int) vgsvcTimeSyncOption(const char **ppszShort, int argc, char **argv, int *pi)
 {
-    int rc = -1;
-    uint32_t value;
+    int rc = VINF_SUCCESS;
     if (ppszShort)
-        /* no short options */;
+        rc = -1 ;/* no short options */
     else if (!strcmp(argv[*pi], "--timesync-interval"))
         rc = VGSvcArgUInt32(argc, argv, "", pi, &g_TimeSyncInterval, 50, UINT32_MAX - 1);
     else if (!strcmp(argv[*pi], "--timesync-min-adjust"))
@@ -252,16 +285,15 @@ static DECLCALLBACK(int) vgsvcTimeSyncOption(const char **ppszShort, int argc, c
     else if (!strcmp(argv[*pi], "--timesync-set-threshold"))
         rc = VGSvcArgUInt32(argc, argv, "", pi, &g_TimeSyncSetThreshold, 0, 7*24*60*60*1000); /* a week */
     else if (!strcmp(argv[*pi], "--timesync-set-start"))
-    {
         g_fTimeSyncSetNext = true;
-        rc = VINF_SUCCESS;
-    }
     else if (!strcmp(argv[*pi], "--timesync-set-on-restore"))
-    {
-        rc = VGSvcArgUInt32(argc, argv, "", pi, &value, 1, 1);
-        if (RT_SUCCESS(rc))
-            g_fTimeSyncSetOnRestore = !!value;
-    }
+        g_fTimeSyncSetOnRestore = true;
+    else if (!strcmp(argv[*pi], "--timesync-no-set-on-restore"))
+        g_fTimeSyncSetOnRestore = false;
+    else if (!strcmp(argv[*pi], "--timesync-verbosity"))
+        rc = VGSvcArgUInt32(argc, argv, "", pi, &g_cTimeSyncVerbosity, 0 /*uMin*/, 255 /*uMax*/);
+    else
+        rc = -1;
 
     return rc;
 }
@@ -335,8 +367,8 @@ static DECLCALLBACK(int) vgsvcTimeSyncInit(void)
     }
 
     if (GetSystemTimeAdjustment(&g_dwWinTimeAdjustment, &g_dwWinTimeIncrement, &g_bWinTimeAdjustmentDisabled))
-        VGSvcVerbose(3, "vgsvcTimeSyncInit: Initially %ld (100ns) units per %ld (100 ns) units interval, disabled=%d\n",
-                     g_dwWinTimeAdjustment, g_dwWinTimeIncrement, g_bWinTimeAdjustmentDisabled ? 1 : 0);
+        vgsvcTimeSyncLog(3, "vgsvcTimeSyncInit: Initially %ld (100ns) units per %ld (100 ns) units interval, disabled=%d\n",
+                         g_dwWinTimeAdjustment, g_dwWinTimeIncrement, g_bWinTimeAdjustmentDisabled ? 1 : 0);
     else
     {
         DWORD dwErr = GetLastError();
@@ -393,9 +425,9 @@ static bool vgsvcTimeSyncAdjust(PCRTTIMESPEC pDrift)
             }
         }
 
-        VGSvcVerbose(3, "vgsvcTimeSyncAdjust: Drift=%lldms\n", RTTimeSpecGetMilli(pDrift));
-        VGSvcVerbose(3, "vgsvcTimeSyncAdjust: OrgTA=%ld, CurTA=%ld, NewTA=%ld, DiffNew=%ld, DiffMax=%ld\n",
-                     g_dwWinTimeAdjustment, dwWinTimeAdjustment, dwWinNewTimeAdjustment, dwDiffNew, dwDiffMax);
+        vgsvcTimeSyncLog(3, "vgsvcTimeSyncAdjust: Drift=%lldms\n", RTTimeSpecGetMilli(pDrift));
+        vgsvcTimeSyncLog(3, "vgsvcTimeSyncAdjust: OrgTA=%ld, CurTA=%ld, NewTA=%ld, DiffNew=%ld, DiffMax=%ld\n",
+                         g_dwWinTimeAdjustment, dwWinTimeAdjustment, dwWinNewTimeAdjustment, dwDiffNew, dwDiffMax);
         if (SetSystemTimeAdjustment(dwWinNewTimeAdjustment, FALSE /* Periodic adjustments enabled. */))
         {
             g_cTimeSyncErrors = 0;
@@ -420,7 +452,7 @@ static bool vgsvcTimeSyncAdjust(PCRTTIMESPEC pDrift)
     if (adjtime(&tv, NULL) == 0)
     {
         if (g_cVerbosity >= 1)
-            VGSvcVerbose(1, "vgsvcTimeSyncAdjust: adjtime by %RDtimespec\n", pDrift);
+            vgsvcTimeSyncLog(1, "vgsvcTimeSyncAdjust: adjtime by %RDtimespec\n", pDrift);
         g_cTimeSyncErrors = 0;
         return true;
     }
@@ -444,7 +476,7 @@ static void vgsvcTimeSyncCancelAdjust(void)
     if (g_hTokenProcess == NULL) /* No process token (anymore)? */
         return;
     if (SetSystemTimeAdjustment(0, TRUE /* Periodic adjustments disabled. */))
-        VGSvcVerbose(3, "vgsvcTimeSyncCancelAdjust: Windows Time Adjustment is now disabled.\n");
+        vgsvcTimeSyncLog(3, "vgsvcTimeSyncCancelAdjust: Windows Time Adjustment is now disabled.\n");
     else if (g_cTimeSyncErrors++ < 10)
         VGSvcError("vgsvcTimeSyncCancelAdjust: SetSystemTimeAdjustment(,disable) failed, error=%u\n", GetLastError());
 #endif /* !RT_OS_WINDOWS */
@@ -474,11 +506,11 @@ static void vgsvcTimeSyncSet(PCRTTIMESPEC pDrift)
         {
             char        sz[64];
             RTTIME      Time;
-            VGSvcVerbose(1, "time set to %s\n", RTTimeToString(RTTimeExplode(&Time, &NewGuestTime), sz, sizeof(sz)));
+            vgsvcTimeSyncLog(1, "time set to %s\n", RTTimeToString(RTTimeExplode(&Time, &NewGuestTime), sz, sizeof(sz)));
 #ifdef DEBUG
             RTTIMESPEC  Tmp;
             if (g_cVerbosity >= 3)
-                VGSvcVerbose(3, "        now %s\n", RTTimeToString(RTTimeExplode(&Time, RTTimeNow(&Tmp)), sz, sizeof(sz)));
+                vgsvcTimeSyncLog(3, "        now %s\n", RTTimeToString(RTTimeExplode(&Time, RTTimeNow(&Tmp)), sz, sizeof(sz)));
 #endif
         }
     }
@@ -502,6 +534,17 @@ DECLCALLBACK(int) vgsvcTimeSyncWorker(bool volatile *pfShutdown)
     RTThreadUserSignal(RTThreadSelf());
 
     /*
+     * Initialize the last host and guest times to prevent log message.
+     * We also tracks whether we set the time in the previous loop.
+     */
+    RTTIMESPEC HostLast;
+    if (RT_FAILURE(VbglR3GetHostTime(&HostLast)))
+        RTTimeSpecSetNano(&HostLast, 0);
+    RTTIMESPEC GuestLast;
+    RTTimeNow(&GuestLast);
+    bool fSetTimeLastLoop = false;
+
+    /*
      * The Work Loop.
      */
     for (;;)
@@ -512,9 +555,17 @@ DECLCALLBACK(int) vgsvcTimeSyncWorker(bool volatile *pfShutdown)
         int cTries = 3;
         do
         {
-            /* query it. */
-            RTTIMESPEC GuestNow0, GuestNow, HostNow;
+            /*
+             * Query the session id (first to keep lantency low) and the time.
+             */
+            uint64_t idNewSession = g_idTimeSyncSession;
+            if (g_fTimeSyncSetOnRestore)
+                VbglR3GetSessionId(&idNewSession);
+
+            RTTIMESPEC GuestNow0;
             RTTimeNow(&GuestNow0);
+
+            RTTIMESPEC HostNow;
             int rc2 = VbglR3GetHostTime(&HostNow);
             if (RT_FAILURE(rc2))
             {
@@ -522,28 +573,27 @@ DECLCALLBACK(int) vgsvcTimeSyncWorker(bool volatile *pfShutdown)
                     VGSvcError("vgsvcTimeSyncWorker: VbglR3GetHostTime failed; rc2=%Rrc\n", rc2);
                 break;
             }
+
+            RTTIMESPEC GuestNow;
             RTTimeNow(&GuestNow);
 
-            /* calc latency and check if it's ok. */
+            /*
+             * Calc latency and check if it's ok.
+             */
             RTTIMESPEC GuestElapsed = GuestNow;
             RTTimeSpecSub(&GuestElapsed, &GuestNow0);
             if ((uint32_t)RTTimeSpecGetMilli(&GuestElapsed) < g_cMsTimeSyncMaxLatency)
             {
                 /*
-                 * Set the time once after we were restored.
-                 * (Of course only if the drift is bigger than MinAdjust)
+                 * If we were just restored, set the adjustment threshold to zero to force a resync.
                  */
                 uint32_t TimeSyncSetThreshold = g_TimeSyncSetThreshold;
-                if (g_fTimeSyncSetOnRestore)
+                if (   g_fTimeSyncSetOnRestore
+                    && idNewSession != g_idTimeSyncSession)
                 {
-                    uint64_t idNewSession = g_idTimeSyncSession;
-                    VbglR3GetSessionId(&idNewSession);
-                    if (idNewSession != g_idTimeSyncSession)
-                    {
-                        VGSvcVerbose(3, "vgsvcTimeSyncWorker: The VM session ID changed, forcing resync.\n");
-                        TimeSyncSetThreshold = 0;
-                        g_idTimeSyncSession  = idNewSession;
-                    }
+                    vgsvcTimeSyncLog(3, "vgsvcTimeSyncWorker: The VM session ID changed, forcing resync.\n");
+                    g_idTimeSyncSession  = idNewSession;
+                    TimeSyncSetThreshold = 0;
                 }
 
                 /*
@@ -562,13 +612,14 @@ DECLCALLBACK(int) vgsvcTimeSyncWorker(bool volatile *pfShutdown)
                 RTTimeSpecAbsolute(&AbsDrift);
                 if (g_cVerbosity >= 3)
                 {
-                    VGSvcVerbose(3, "vgsvcTimeSyncWorker: Host:    %s    (MinAdjust: %RU32 ms)\n",
-                                 RTTimeToString(RTTimeExplode(&Time, &HostNow), sz, sizeof(sz)), MinAdjust);
-                    VGSvcVerbose(3, "vgsvcTimeSyncWorker: Guest: - %s => %RDtimespec drift\n",
-                                 RTTimeToString(RTTimeExplode(&Time, &GuestNow), sz, sizeof(sz)), &Drift);
+                    vgsvcTimeSyncLog(3, "vgsvcTimeSyncWorker: Host:    %s    (MinAdjust: %RU32 ms)\n",
+                                     RTTimeToString(RTTimeExplode(&Time, &HostNow), sz, sizeof(sz)), MinAdjust);
+                    vgsvcTimeSyncLog(3, "vgsvcTimeSyncWorker: Guest: - %s => %RDtimespec drift\n",
+                                     RTTimeToString(RTTimeExplode(&Time, &GuestNow), sz, sizeof(sz)), &Drift);
                 }
 
-                uint32_t AbsDriftMilli = RTTimeSpecGetMilli(&AbsDrift);
+                bool fSetTimeInThisLoop = false;
+                uint64_t AbsDriftMilli = RTTimeSpecGetMilli(&AbsDrift);
                 if (AbsDriftMilli > MinAdjust)
                 {
                     /*
@@ -577,21 +628,42 @@ DECLCALLBACK(int) vgsvcTimeSyncWorker(bool volatile *pfShutdown)
                      * Try a gradual adjustment first, if that fails or the drift is
                      * too big, fall back on just setting the time.
                      */
-
-                    if (    AbsDriftMilli > TimeSyncSetThreshold
-                        ||  g_fTimeSyncSetNext
-                        ||  !vgsvcTimeSyncAdjust(&Drift))
+                    if (   AbsDriftMilli > TimeSyncSetThreshold
+                        || g_fTimeSyncSetNext
+                        || !vgsvcTimeSyncAdjust(&Drift))
                     {
                         vgsvcTimeSyncCancelAdjust();
                         vgsvcTimeSyncSet(&Drift);
+                        fSetTimeInThisLoop = true;
                     }
+
+                    /*
+                     * Log radical host time changes.
+                     */
+                    int64_t cNsHostDelta = RTTimeSpecGetNano(&HostNow) - RTTimeSpecGetNano(&HostLast);
+                    if ((uint64_t)RT_ABS(cNsHostDelta) > RT_NS_1HOUR / 2)
+                        vgsvcTimeSyncLog(0, "vgsvcTimeSyncWorker: Radical host time change: %'RI64ns (HostNow=%RDtimespec HostLast=%RDtimespec)\n",
+                                         cNsHostDelta, &HostNow, &HostLast);
                 }
                 else
                     vgsvcTimeSyncCancelAdjust();
+                HostLast = HostNow;
+
+                /*
+                 * Log radical guest time changes (we could be the cause of these, mind).
+                 * Note! Right now we don't care about an extra log line after we called
+                 *       vgsvcTimeSyncSet.  fSetTimeLastLoop helps show it though.
+                 */
+                int64_t cNsGuestDelta = RTTimeSpecGetNano(&GuestNow) - RTTimeSpecGetNano(&GuestLast);
+                if ((uint64_t)RT_ABS(cNsGuestDelta) > RT_NS_1HOUR / 2)
+                    vgsvcTimeSyncLog(0, "vgsvcTimeSyncWorker: Radical guest time change: %'RI64ns (GuestNow=%RDtimespec GuestLast=%RDtimespec fSetTimeLastLoop=%RTbool)\n",
+                                     cNsGuestDelta, &GuestNow, &GuestLast, fSetTimeLastLoop);
+                GuestLast = GuestNow;
+                fSetTimeLastLoop = fSetTimeInThisLoop;
                 break;
             }
-            VGSvcVerbose(3, "vgsvcTimeSyncWorker: %RDtimespec: latency too high (%RDtimespec, max %ums) sleeping 1s\n",
-                         &GuestNow, &GuestElapsed, g_cMsTimeSyncMaxLatency);
+            vgsvcTimeSyncLog(3, "vgsvcTimeSyncWorker: %RDtimespec: latency too high (%RDtimespec, max %ums) sleeping 1s\n",
+                             &GuestNow, &GuestElapsed, g_cMsTimeSyncMaxLatency);
             RTThreadSleep(1000);
         } while (--cTries > 0);
 
@@ -674,7 +746,8 @@ VBOXSERVICE g_TimeSync =
     "              [--timesync-interval <ms>] [--timesync-min-adjust <ms>]\n"
     "              [--timesync-latency-factor <x>] [--timesync-max-latency <ms>]\n"
     "              [--timesync-set-threshold <ms>] [--timesync-set-start]\n"
-    "              [--timesync-set-on-restore 0|1]"
+    "              [--timesync-set-on-restore|--timesync-no-set-on-restore]\n"
+    "              [--timesync-verbosity <level>]"
     ,
     /* pszOptions. */
     "    --timesync-interval     Specifies the interval at which to synchronize the\n"
@@ -693,9 +766,11 @@ VBOXSERVICE g_TimeSync =
     "                            where to start setting the time instead of trying to\n"
     "                            adjust it. The default is 20 min.\n"
     "    --timesync-set-start    Set the time when starting the time sync service.\n"
-    "    --timesync-set-on-restore 0|1\n"
-    "                            Immediately set the time when the VM was restored.\n"
-    "                            1 = set (default), 0 = don't set.\n"
+    "    --timesync-set-on-restore, --timesync-no-set-on-restore\n"
+    "                            Whether to immediately set the time when the VM is\n"
+    "                            restored or not.  Default: --timesync-set-on-restore\n"
+    "    --timesync-verbosity    Sets the verbosity level.  Defaults to service wide\n"
+    "                            verbosity level.\n"
     ,
     /* methods */
     vgsvcTimeSyncPreInit,
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.cpp
index 8251e6a..2340e18 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.cpp
@@ -42,7 +42,7 @@
  * @param   u32ClientId         The HGCM client ID for the guest property session.
  * @param   pszPropName         The property name.
  * @param   ppszValue           Where to return the value.  This is always set
- *                              to NULL.  Free it using RTStrFree().
+ *                              to NULL.  Free it using RTStrFree().  Optional.
  * @param   ppszFlags           Where to return the value flags. Free it
  *                              using RTStrFree().  Optional.
  * @param   puTimestamp         Where to return the timestamp.  This is only set
@@ -51,13 +51,13 @@
 int VGSvcReadProp(uint32_t u32ClientId, const char *pszPropName, char **ppszValue, char **ppszFlags, uint64_t *puTimestamp)
 {
     AssertPtrReturn(pszPropName, VERR_INVALID_POINTER);
-    AssertPtrReturn(ppszValue, VERR_INVALID_POINTER);
 
     uint32_t    cbBuf = _1K;
     void       *pvBuf = NULL;
     int         rc    = VINF_SUCCESS;  /* MSC can't figure out the loop */
 
-    *ppszValue = NULL;
+    if (ppszValue)
+        *ppszValue = NULL;
 
     for (unsigned cTries = 0; cTries < 10; cTries++)
     {
@@ -92,12 +92,15 @@ int VGSvcReadProp(uint32_t u32ClientId, const char *pszPropName, char **ppszValu
         }
 
         VGSvcVerbose(2, "Guest Property: Read '%s' = '%s', timestamp %RU64n\n", pszPropName, pszValue, uTimestamp);
-        *ppszValue = RTStrDup(pszValue);
-        if (!*ppszValue)
+        if (ppszValue)
         {
-            VGSvcError("Guest Property: RTStrDup failed for '%s'\n", pszValue);
-            rc = VERR_NO_MEMORY;
-            break;
+            *ppszValue = RTStrDup(pszValue);
+            if (!*ppszValue)
+            {
+                VGSvcError("Guest Property: RTStrDup failed for '%s'\n", pszValue);
+                rc = VERR_NO_MEMORY;
+                break;
+            }
         }
 
         if (puTimestamp)
@@ -140,6 +143,21 @@ int VGSvcReadPropUInt32(uint32_t u32ClientId, const char *pszPropName, uint32_t
     return rc;
 }
 
+/**
+ * Checks if @a pszPropName exists.
+ *
+ * @returns VBox status code.
+ * @retval  VINF_SUCCESS if it exists.
+ * @retval  VERR_NOT_FOUND if not found.
+ *
+ * @param   u32ClientId         The HGCM client ID for the guest property session.
+ * @param   pszPropName         The property name.
+ */
+int VGSvcCheckPropExist(uint32_t u32ClientId, const char *pszPropName)
+{
+    return VGSvcReadProp(u32ClientId, pszPropName, NULL /*ppszValue*/, NULL /* ppszFlags */, NULL /* puTimestamp */);
+}
+
 
 /**
  * Reads a guest property from the host side.
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.h b/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.h
index e26e3f9..ab8e008 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.h
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceUtils.h
@@ -23,6 +23,7 @@
 #ifdef VBOX_WITH_GUEST_PROPS
 int VGSvcReadProp(uint32_t u32ClientId, const char *pszPropName, char **ppszValue, char **ppszFlags, uint64_t *puTimestamp);
 int VGSvcReadPropUInt32(uint32_t u32ClientId, const char *pszPropName, uint32_t *pu32, uint32_t u32Min, uint32_t u32Max);
+int VGSvcCheckPropExist(uint32_t u32ClientId, const char *pszPropName);
 int VGSvcReadHostProp(uint32_t u32ClientId, const char *pszPropName, bool fReadOnly, char **ppszValue, char **ppszFlags,
                       uint64_t *puTimestamp);
 int VGSvcWritePropF(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, ...);
diff --git a/src/VBox/Additions/common/crOpenGL/Makefile.kmk b/src/VBox/Additions/common/crOpenGL/Makefile.kmk
index 57f35a0..7c7d5ab 100644
--- a/src/VBox/Additions/common/crOpenGL/Makefile.kmk
+++ b/src/VBox/Additions/common/crOpenGL/Makefile.kmk
@@ -203,9 +203,11 @@ if1of ($(KBUILD_TARGET), linux solaris)
  	$(VBOX_PATH_CROGL_GENFILES)/solaris_glxapi_exports.asm
  endif
 endif
+# VBoxOGL_LIBS = \  # VBOX_LIB_OGL_CRUTIL includes these and caused an interesting conflict.
+#	$(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
+#	$(VBOX_LIB_VBGL_R3_SHARED) \
+
 VBoxOGL_LIBS = \
-	$(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
-	$(VBOX_LIB_VBGL_R3_SHARED) \
 	$(VBOX_LIB_OGL_CRUTIL) \
 	$(PATH_STAGE_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB)
 
@@ -725,7 +727,7 @@ VBoxEGL_SOURCES        = egl.c
 ifndef VBOX_USE_SYSTEM_GL_HEADERS
  VBoxEGL_INCS           = $(VBOX_PATH_X11_ROOT)/mesa-11.0.7
 endif
-VBoxEGL_LIBS           = $(VBOX_LIB_OGL) $(VBOX_LIB_IPRT_GUEST_R3_SHARED)
+VBoxEGL_LIBS           = $(VBOX_LIB_OGL) # $(VBOX_LIB_IPRT_GUEST_R3_SHARED)
 VBoxEGL_SONAME.linux   = libEGL.so.1
 
 include $(FILE_KBUILD_SUB_FOOTER)
diff --git a/src/VBox/Additions/common/crOpenGL/entrypoints.pyc b/src/VBox/Additions/common/crOpenGL/entrypoints.pyc
index 8f1074b..bc9a489 100644
Binary files a/src/VBox/Additions/common/crOpenGL/entrypoints.pyc and b/src/VBox/Additions/common/crOpenGL/entrypoints.pyc differ
diff --git a/src/VBox/Additions/x11/Makefile.kmk b/src/VBox/Additions/x11/Makefile.kmk
index ba5fdfd..8945de3 100644
--- a/src/VBox/Additions/x11/Makefile.kmk
+++ b/src/VBox/Additions/x11/Makefile.kmk
@@ -23,7 +23,7 @@ if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd solaris)
  include $(PATH_SUB_CURRENT)/VBoxClient/Makefile.kmk
  ifndef VBOX_NO_LEGACY_XORG_X11
   include $(PATH_SUB_CURRENT)/vboxvideo/Makefile.kmk
-  ifneq ($(KBUILD_TARGET), solaris)
+  ifn1of ($(KBUILD_TARGET), netbsd solaris)
    include $(PATH_SUB_CURRENT)/vboxmouse/Makefile.kmk
   endif
   # This should logically only be controlled by VBOX_NO_LEGACY_XORG_X11,
diff --git a/src/VBox/Devices/Audio/DevHDA.cpp b/src/VBox/Devices/Audio/DevHDA.cpp
index 6d0b02d..70c6e2e 100644
--- a/src/VBox/Devices/Audio/DevHDA.cpp
+++ b/src/VBox/Devices/Audio/DevHDA.cpp
@@ -228,7 +228,9 @@ static int hdaRegReadWALCLK(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
 static int hdaRegWriteCORBWP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
 static int hdaRegWriteCORBRP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
 static int hdaRegWriteCORBCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
+static int hdaRegWriteCORBSIZE(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
 static int hdaRegWriteCORBSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
+static int hdaRegWriteRINTCNT(PHDASTATE pThis, uint32_t iReg, uint32_t pu32Value);
 static int hdaRegWriteRIRBWP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
 static int hdaRegWriteRIRBSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
 static int hdaRegWriteSTATESTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
@@ -280,10 +282,8 @@ static void                       hdaDoTransfers(PHDASTATE pThis);
 /** @name Timer functions.
  * @{
  */
-#if !defined(VBOX_WITH_AUDIO_HDA_CALLBACKS) && defined(IN_RING3)
-static int           hdaTimerMaybeStart(PHDASTATE pThis);
-static int           hdaTimerMaybeStop(PHDASTATE pThis);
-static void          hdaTimerMain(PHDASTATE pThis);
+#ifdef IN_RING3
+static void hdaTimerMain(PHDASTATE pThis);
 #endif
 /** @} */
 
@@ -350,14 +350,14 @@ const HDAREGDESC g_aHdaRegMap[HDA_NUM_REGS] =
     { 0x00040, 0x00004, 0xFFFFFF80, 0xFFFFFF80, HDA_RD_FLAG_NONE, hdaRegReadU32   , hdaRegWriteBase    , HDA_REG_IDX(CORBLBASE)    }, /* CORB Lower Base Address */
     { 0x00044, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, HDA_RD_FLAG_NONE, hdaRegReadU32   , hdaRegWriteBase    , HDA_REG_IDX(CORBUBASE)    }, /* CORB Upper Base Address */
     { 0x00048, 0x00002, 0x000000FF, 0x000000FF, HDA_RD_FLAG_NONE, hdaRegReadU16   , hdaRegWriteCORBWP  , HDA_REG_IDX(CORBWP)       }, /* CORB Write Pointer */
-    { 0x0004A, 0x00002, 0x000080FF, 0x000080FF, HDA_RD_FLAG_NONE, hdaRegReadU16   , hdaRegWriteCORBRP  , HDA_REG_IDX(CORBRP)       }, /* CORB Read Pointer */
+    { 0x0004A, 0x00002, 0x000080FF, 0x00008000, HDA_RD_FLAG_NONE, hdaRegReadU16   , hdaRegWriteCORBRP  , HDA_REG_IDX(CORBRP)       }, /* CORB Read Pointer */
     { 0x0004C, 0x00001, 0x00000003, 0x00000003, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteCORBCTL , HDA_REG_IDX(CORBCTL)      }, /* CORB Control */
     { 0x0004D, 0x00001, 0x00000001, 0x00000001, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteCORBSTS , HDA_REG_IDX(CORBSTS)      }, /* CORB Status */
-    { 0x0004E, 0x00001, 0x000000F3, 0x00000000, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteUnimpl  , HDA_REG_IDX(CORBSIZE)     }, /* CORB Size */
+    { 0x0004E, 0x00001, 0x000000F3, 0x00000003, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteCORBSIZE, HDA_REG_IDX(CORBSIZE)     }, /* CORB Size */
     { 0x00050, 0x00004, 0xFFFFFF80, 0xFFFFFF80, HDA_RD_FLAG_NONE, hdaRegReadU32   , hdaRegWriteBase    , HDA_REG_IDX(RIRBLBASE)    }, /* RIRB Lower Base Address */
     { 0x00054, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, HDA_RD_FLAG_NONE, hdaRegReadU32   , hdaRegWriteBase    , HDA_REG_IDX(RIRBUBASE)    }, /* RIRB Upper Base Address */
     { 0x00058, 0x00002, 0x000000FF, 0x00008000, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteRIRBWP  , HDA_REG_IDX(RIRBWP)       }, /* RIRB Write Pointer */
-    { 0x0005A, 0x00002, 0x000000FF, 0x000000FF, HDA_RD_FLAG_NONE, hdaRegReadU16   , hdaRegWriteU16     , HDA_REG_IDX(RINTCNT)      }, /* Response Interrupt Count */
+    { 0x0005A, 0x00002, 0x000000FF, 0x000000FF, HDA_RD_FLAG_NONE, hdaRegReadU16   , hdaRegWriteRINTCNT , HDA_REG_IDX(RINTCNT)      }, /* Response Interrupt Count */
     { 0x0005C, 0x00001, 0x00000007, 0x00000007, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteU8      , HDA_REG_IDX(RIRBCTL)      }, /* RIRB Control */
     { 0x0005D, 0x00001, 0x00000005, 0x00000005, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteRIRBSTS , HDA_REG_IDX(RIRBSTS)      }, /* RIRB Status */
     { 0x0005E, 0x00001, 0x000000F3, 0x00000000, HDA_RD_FLAG_NONE, hdaRegReadU8    , hdaRegWriteUnimpl  , HDA_REG_IDX(RIRBSIZE)     }, /* RIRB Size */
@@ -435,7 +435,7 @@ static SSMFIELD const g_aSSMStreamStateFields7[] =
 {
     SSMFIELD_ENTRY(HDASTREAMSTATE, uCurBDLE),
     SSMFIELD_ENTRY(HDASTREAMSTATE, fInReset),
-    SSMFIELD_ENTRY(HDASTREAMSTATE, uTimerTS),
+    SSMFIELD_ENTRY(HDASTREAMSTATE, tsTransferNext),
     SSMFIELD_ENTRY_TERM()
 };
 
@@ -722,21 +722,27 @@ static int hdaCmdSync(PHDASTATE pThis, bool fLocal)
     int rc = VINF_SUCCESS;
     if (fLocal)
     {
-        Assert((HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA));
-        Assert(pThis->u64CORBBase);
-        AssertPtr(pThis->pu32CorbBuf);
-        Assert(pThis->cbCorbBuf);
+        if (pThis->u64CORBBase)
+        {
+            AssertPtr(pThis->pu32CorbBuf);
+            Assert(pThis->cbCorbBuf);
 
-        rc = PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), pThis->u64CORBBase, pThis->pu32CorbBuf, pThis->cbCorbBuf);
-        if (RT_FAILURE(rc))
-            AssertRCReturn(rc, rc);
+            rc = PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), pThis->u64CORBBase, pThis->pu32CorbBuf, pThis->cbCorbBuf);
+            if (RT_FAILURE(rc))
+                AssertRCReturn(rc, rc);
+        }
     }
     else
     {
-        Assert((HDA_REG(pThis, RIRBCTL) & HDA_RIRBCTL_RDMAEN));
-        rc = PDMDevHlpPCIPhysWrite(pThis->CTX_SUFF(pDevIns), pThis->u64RIRBBase, pThis->pu64RirbBuf, pThis->cbRirbBuf);
-        if (RT_FAILURE(rc))
-            AssertRCReturn(rc, rc);
+        if (pThis->u64RIRBBase)
+        {
+            AssertPtr(pThis->pu64RirbBuf);
+            Assert(pThis->cbRirbBuf);
+
+            rc = PDMDevHlpPCIPhysWrite(pThis->CTX_SUFF(pDevIns), pThis->u64RIRBBase, pThis->pu64RirbBuf, pThis->cbRirbBuf);
+            if (RT_FAILURE(rc))
+                AssertRCReturn(rc, rc);
+        }
     }
 
 #ifdef DEBUG_CMD_BUFFER
@@ -790,27 +796,43 @@ static int hdaCmdSync(PHDASTATE pThis, bool fLocal)
  */
 static int hdaCORBCmdProcess(PHDASTATE pThis)
 {
-    int rc = hdaCmdSync(pThis, true /* Sync from guest */);
-    AssertRCReturn(rc, rc);
-
     uint8_t corbRp = HDA_REG(pThis, CORBRP);
     uint8_t corbWp = HDA_REG(pThis, CORBWP);
     uint8_t rirbWp = HDA_REG(pThis, RIRBWP);
 
     Log3Func(("CORB(RP:%x, WP:%x) RIRBWP:%x\n", corbRp, corbWp, rirbWp));
 
+    if (!(HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA))
+    {
+        LogFunc(("CORB DMA not active, skipping\n"));
+        return VINF_SUCCESS;
+    }
+
+    Assert(pThis->cbCorbBuf);
+
+    int rc = hdaCmdSync(pThis, true /* Sync from guest */);
+    AssertRCReturn(rc, rc);
+
+    uint16_t cIntCnt = HDA_REG(pThis, RINTCNT) & 0xff;
+
+    if (!cIntCnt) /* 0 means 256 interrupts. */
+        cIntCnt = HDA_MAX_RINTCNT;
+
+    Log3Func(("START CORB(RP:%x, WP:%x) RIRBWP:%x, RINTCNT:%RU8/%RU8\n",
+              corbRp, corbWp, rirbWp, pThis->u16RespIntCnt, cIntCnt));
+
     while (corbRp != corbWp)
     {
-        corbRp = (corbRp + 1) % HDA_CORB_SIZE; /* Advance +1 as the first command(s) are at CORBWP + 1. */
+        corbRp = (corbRp + 1) % (pThis->cbCorbBuf / HDA_CORB_ELEMENT_SIZE); /* Advance +1 as the first command(s) are at CORBWP + 1. */
 
+        uint32_t uCmd  = pThis->pu32CorbBuf[corbRp];
         uint64_t uResp = 0;
-        uint32_t uCmd = pThis->pu32CorbBuf[corbRp];
 
         rc = pThis->pCodec->pfnLookup(pThis->pCodec, HDA_CODEC_CMD(uCmd, 0 /* Codec index */), &uResp);
         if (RT_FAILURE(rc))
             LogFunc(("Codec lookup failed with rc=%Rrc\n", rc));
 
-        LogFunc(("verb:%08x -> %016lx\n", uCmd, uResp));
+        Log3Func(("Codec verb %08x -> response %016lx\n", uCmd, uResp));
 
         if (   (uResp & CODEC_RESPONSE_UNSOLICITED)
             && !(HDA_REG(pThis, GCTL) & HDA_GCTL_UNSOL))
@@ -827,40 +849,47 @@ static int hdaCORBCmdProcess(PHDASTATE pThis)
         pThis->pu64RirbBuf[rirbWp] = uResp;
 
         pThis->u16RespIntCnt++;
-        if (pThis->u16RespIntCnt > HDA_MAX_RINTCNT) /* Make sure that the guest can't hang the host. */
-        {
-            LogRel(("HDA: Maximum response interrupt count (%d) reached, bailing out\n", HDA_MAX_RINTCNT));
-            pThis->u16RespIntCnt = HDA_MAX_RINTCNT;
-            break;
-        }
-    }
 
-    HDA_REG(pThis, CORBRP) = corbRp;
-    HDA_REG(pThis, RIRBWP) = rirbWp;
+        bool fSendInterrupt = false;
 
-    rc = hdaCmdSync(pThis, false /* Sync to guest */);
-    AssertRCReturn(rc, rc);
+        if (pThis->u16RespIntCnt == cIntCnt) /* Response interrupt count reached? */
+        {
+            pThis->u16RespIntCnt = 0; /* Reset internal interrupt response counter. */
 
-    Log3Func(("CORB(RP:%x, WP:%x) RIRBWP:%x, uRespIntCnt=%RU16\n", corbRp, corbWp, rirbWp, pThis->u16RespIntCnt));
+            Log3Func(("Response interrupt count reached (%RU16)\n", pThis->u16RespIntCnt));
+            fSendInterrupt = true;
 
-    if (pThis->u16RespIntCnt)
-    {
-        if (HDA_REG(pThis, RIRBCTL) & HDA_RIRBCTL_RINTCTL) /* Response Interrupt Control (RINTCTL) enabled? */
+        }
+        else if (corbRp == corbWp) /* Did we reach the end of the current command buffer? */
+        {
+            Log3Func(("Command buffer empty\n"));
+            fSendInterrupt = true;
+        }
+
+        if (fSendInterrupt)
         {
-            HDA_REG(pThis, RIRBSTS) |= HDA_RIRBSTS_RINTFL;
-            HDA_REG(pThis, RINTCNT)  = RT_LO_U8(pThis->u16RespIntCnt);
+            if (HDA_REG(pThis, RIRBCTL) & HDA_RIRBCTL_RINTCTL) /* Response Interrupt Control (RINTCTL) enabled? */
+            {
+                HDA_REG(pThis, RIRBSTS) |= HDA_RIRBSTS_RINTFL;
 
 #ifndef DEBUG
-            rc = hdaProcessInterrupt(pThis);
+                rc = hdaProcessInterrupt(pThis);
 #else
-            rc = hdaProcessInterrupt(pThis, __FUNCTION__);
+                rc = hdaProcessInterrupt(pThis, __FUNCTION__);
 #endif
-            pThis->u16RespIntCnt--;
+            }
         }
-        else /* Not enabled -- just reset our internal counter. */
-            pThis->u16RespIntCnt = 0;
     }
 
+    Log3Func(("END CORB(RP:%x, WP:%x) RIRBWP:%x, RINTCNT:%RU8/%RU8\n",
+              corbRp, corbWp, rirbWp, pThis->u16RespIntCnt, cIntCnt));
+
+    HDA_REG(pThis, CORBRP) = corbRp;
+    HDA_REG(pThis, RIRBWP) = rirbWp;
+
+    rc = hdaCmdSync(pThis, false /* Sync to guest */);
+    AssertRCReturn(rc, rc);
+
     if (RT_FAILURE(rc))
         AssertRCReturn(rc, rc);
 
@@ -1088,12 +1117,23 @@ static int hdaRegReadWALCLK(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
 
 static int hdaRegWriteCORBRP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 {
-    RT_NOREF_PV(iReg);
+    RT_NOREF(iReg);
 
     DEVHDA_LOCK_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
 
     if (u32Value & HDA_CORBRP_RST)
+    {
+        /* Do a CORB reset. */
+        if (pThis->cbCorbBuf)
+        {
+            Assert(pThis->pu32CorbBuf);
+            RT_BZERO((void *)pThis->pu32CorbBuf, pThis->cbCorbBuf);
+        }
+
+        LogRel2(("HDA: CORB reset\n"));
+
         HDA_REG(pThis, CORBRP) = HDA_CORBRP_RST;    /* Clears the pointer. */
+    }
     else
         HDA_REG(pThis, CORBRP) &= ~HDA_CORBRP_RST;  /* Only CORBRP_RST bit is writable. */
 
@@ -1104,22 +1144,93 @@ static int hdaRegWriteCORBRP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 static int hdaRegWriteCORBCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 {
 #ifdef IN_RING3
+    DEVHDA_LOCK_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
+
     int rc = hdaRegWriteU8(pThis, iReg, u32Value);
     AssertRC(rc);
 
-    DEVHDA_LOCK(pThis);
-
-    if (   (uint8_t)HDA_REG(pThis, CORBWP) != (uint8_t)HDA_REG(pThis, CORBRP)
-        && (HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA))
+    if (HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA) /* Start DMA engine. */
     {
         rc = hdaCORBCmdProcess(pThis);
     }
+    else
+        LogFunc(("CORB DMA not running, skipping\n"));
 
     DEVHDA_UNLOCK(pThis);
-
     return rc;
 #else
-    RT_NOREF_PV(pThis); RT_NOREF_PV(iReg); RT_NOREF_PV(u32Value);
+    RT_NOREF(pThis, iReg, u32Value);
+    return VINF_IOM_R3_MMIO_WRITE;
+#endif
+}
+
+static int hdaRegWriteCORBSIZE(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
+{
+#ifdef IN_RING3
+    RT_NOREF(iReg);
+
+    DEVHDA_LOCK_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
+
+    if (HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA) /* Ignore request if CORB DMA engine is (still) running. */
+    {
+        LogFunc(("CORB DMA is (still) running, skipping\n"));
+
+        DEVHDA_UNLOCK(pThis);
+        return VINF_SUCCESS;
+    }
+
+    u32Value = (u32Value & HDA_CORBSIZE_SZ);
+
+    uint16_t cEntries = HDA_CORB_SIZE; /* Set default. */
+
+    switch (u32Value)
+    {
+        case 0: /* 8 byte; 2 entries. */
+            cEntries = 2;
+            break;
+
+        case 1: /* 64 byte; 16 entries. */
+            cEntries = 16;
+            break;
+
+        case 2: /* 1 KB; 256 entries. */
+            /* Use default size. */
+            break;
+
+        default:
+            LogRel(("HDA: Guest tried to set an invalid CORB size (0x%x), keeping default\n", u32Value));
+            u32Value = 2;
+            /* Use default size. */
+            break;
+    }
+
+    uint32_t cbCorbBuf = cEntries * sizeof(uint32_t);
+
+    if (cbCorbBuf != pThis->cbCorbBuf)
+    {
+        if (pThis->pu32CorbBuf)
+        {
+            RTMemFree(pThis->pu32CorbBuf);
+            pThis->pu32CorbBuf = NULL;
+        }
+
+        if (cbCorbBuf)
+        {
+            Assert(cbCorbBuf % sizeof(uint32_t) == 0);
+
+            pThis->pu32CorbBuf = (uint32_t *)RTMemAllocZ(cbCorbBuf);
+            pThis->cbCorbBuf   = cbCorbBuf;
+        }
+    }
+
+    LogFunc(("CORB buffer size is now %RU32 bytes (%u entries)\n", pThis->cbCorbBuf, pThis->cbCorbBuf / HDA_CORB_ELEMENT_SIZE));
+
+    HDA_REG(pThis, CORBSIZE) = u32Value;
+
+    DEVHDA_UNLOCK(pThis);
+    return VINF_SUCCESS;
+#else
+    RT_NOREF(pThis, iReg, u32Value);
     return VINF_IOM_R3_MMIO_WRITE;
 #endif
 }
@@ -1134,39 +1245,26 @@ static int hdaRegWriteCORBSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
     HDA_REG(pThis, CORBSTS) &= ~(v & u32Value);
 
     DEVHDA_UNLOCK(pThis);
-
     return VINF_SUCCESS;
 }
 
 static int hdaRegWriteCORBWP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 {
 #ifdef IN_RING3
-    int rc = hdaRegWriteU16(pThis, iReg, u32Value);
-    AssertRCReturn(rc, rc);
-
-    DEVHDA_LOCK(pThis);
-
-    if ((uint8_t)HDA_REG(pThis, CORBWP) == (uint8_t)HDA_REG(pThis, CORBRP))
-    {
-        DEVHDA_UNLOCK(pThis);
-        return VINF_SUCCESS;
-    }
+    DEVHDA_LOCK_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
 
-    if (!(HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA))
-    {
-        DEVHDA_UNLOCK(pThis);
-        return VINF_SUCCESS;
-    }
+    int rc = hdaRegWriteU16(pThis, iReg, u32Value);
+    if (RT_FAILURE(rc))
+        AssertRCReturn(rc, rc);
 
     rc = hdaCORBCmdProcess(pThis);
 
     DEVHDA_UNLOCK(pThis);
-
     return rc;
-#else  /* !IN_RING3 */
-    RT_NOREF_PV(pThis); RT_NOREF_PV(iReg); RT_NOREF_PV(u32Value);
+#else
+    RT_NOREF(pThis, iReg, u32Value);
     return VINF_IOM_R3_MMIO_WRITE;
-#endif /* IN_RING3 */
+#endif
 }
 
 static int hdaRegWriteSDCBL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
@@ -1305,10 +1403,14 @@ static int hdaRegWriteSDCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
             AssertRC(rc2);
 
             /* Enable/disable the stream. */
-            hdaStreamEnable(pStream, fRun /* fEnable */);
+            rc2 = hdaStreamEnable(pStream, fRun /* fEnable */);
+            AssertRC(rc2);
 
             if (fRun)
             {
+                /* Keep track of running streams. */
+                pThis->cStreamsActive++;
+
                 /* (Re-)init the stream's period. */
                 hdaStreamPeriodInit(&pStream->State.Period,
                                     pStream->u8SD, pStream->u16LVI, pStream->u32CBL, &pStream->State.Cfg);
@@ -1316,9 +1418,17 @@ static int hdaRegWriteSDCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
                 /* Begin a new period for this stream. */
                 rc2 = hdaStreamPeriodBegin(&pStream->State.Period, hdaWalClkGetCurrent(pThis)/* Use current wall clock time */);
                 AssertRC(rc2);
+
+                rc2 = hdaTimerSet(pThis, TMTimerGet(pThis->pTimer) + pStream->State.cTransferTicks, false /* fForce */);
+                AssertRC(rc2);
             }
             else
             {
+                /* Keep track of running streams. */
+                Assert(pThis->cStreamsActive);
+                if (pThis->cStreamsActive)
+                    pThis->cStreamsActive--;
+
                 /* Make sure to (re-)schedule outstanding (delayed) interrupts. */
                 hdaReschedulePendingInterrupts(pThis);
 
@@ -1331,14 +1441,6 @@ static int hdaRegWriteSDCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 # endif
             /* Make sure to leave the lock before (eventually) starting the timer. */
             hdaStreamUnlock(pStream);
-
-# ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
-            /* See if we need to start or stop the timer. */
-            if (!fRun)
-                hdaTimerMaybeStop(pThis);
-            else
-                hdaTimerMaybeStart(pThis);
-# endif
         }
     }
 
@@ -1357,7 +1459,7 @@ static int hdaRegWriteSDCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 static int hdaRegWriteSDSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 {
 #ifdef IN_RING3
-    DEVHDA_LOCK(pThis);
+    DEVHDA_LOCK_BOTH_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
 
     PHDASTREAM pStream = hdaGetStreamFromSD(pThis, HDA_SD_NUM_FROM_REG(pThis, STS, iReg));
     if (!pStream)
@@ -1365,7 +1467,7 @@ static int hdaRegWriteSDSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
         AssertMsgFailed(("[SD%RU8] Warning: Writing SDSTS on non-attached stream (0x%x)\n",
                          HDA_SD_NUM_FROM_REG(pThis, STS, iReg), u32Value));
 
-        DEVHDA_UNLOCK(pThis);
+        DEVHDA_UNLOCK_BOTH(pThis);
         return hdaRegWriteU16(pThis, iReg, u32Value);
     }
 
@@ -1390,6 +1492,12 @@ static int hdaRegWriteSDSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 
         if (hdaStreamPeriodIsComplete(pPeriod))
         {
+            /* Make sure to try to update the WALCLK register if a period is complete.
+             * Use the maximum WALCLK value all (active) streams agree to. */
+            const uint64_t uWalClkMax = hdaWalClkGetMax(pThis);
+            if (uWalClkMax > hdaWalClkGetCurrent(pThis))
+                hdaWalClkSet(pThis, uWalClkMax, false /* fForce */);
+
             hdaStreamPeriodEnd(pPeriod);
 
             if (fInRun)
@@ -1397,18 +1505,55 @@ static int hdaRegWriteSDSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
         }
 
         hdaStreamPeriodUnlock(pPeriod); /* Unlock before processing interrupt. */
+    }
 
-        if (fNeedsInterrupt)
-        {
 #ifndef DEBUG
-            hdaProcessInterrupt(pThis);
+    hdaProcessInterrupt(pThis);
 #else
-            hdaProcessInterrupt(pThis, __FUNCTION__);
+    hdaProcessInterrupt(pThis, __FUNCTION__);
 #endif
-        }
+
+    const uint64_t tsNow = TMTimerGet(pThis->pTimer);
+    Assert(tsNow >= pStream->State.tsTransferLast);
+
+    const uint64_t cTicksElapsed     = tsNow - pStream->State.tsTransferLast;
+#ifdef LOG_ENABLED
+    const uint64_t cTicksTransferred = pStream->State.cbTransferProcessed * pStream->State.cTicksPerByte;
+#endif
+
+    uint64_t cTicksToNext = pStream->State.cTransferTicks;
+
+    Log3Func(("[SD%RU8] cTicksElapsed=%RU64, cTicksTransferred=%RU64, cTicksToNext=%RU64\n",
+              pStream->u8SD, cTicksElapsed, cTicksTransferred, cTicksToNext));
+
+    Log3Func(("[SD%RU8] cbTransferProcessed=%RU32, cbTransferChunk=%RU32, cbTransferSize=%RU32\n",
+              pStream->u8SD, pStream->State.cbTransferProcessed, pStream->State.cbTransferChunk, pStream->State.cbTransferSize));
+
+    if (cTicksElapsed <= cTicksToNext)
+    {
+        cTicksToNext = cTicksToNext - cTicksElapsed;
     }
+    else /* Catch up. */
+    {
+        Log3Func(("[SD%RU8] Warning: Lagging behind (%RU64 ticks elapsed, maximum allowed is %RU64)\n",
+                 pStream->u8SD, cTicksElapsed, cTicksToNext));
 
-    DEVHDA_UNLOCK(pThis);
+        LogRelMax2(64, ("HDA: Stream #%RU8 interrupt lagging behind (expected %uus, got %uus), trying to catch up ...\n",
+                        pStream->u8SD,
+                        (TMTimerGetFreq(pThis->pTimer) / pThis->u16TimerHz) / 1000, (tsNow - pStream->State.tsTransferLast) / 1000));
+
+        cTicksToNext = 0;
+    }
+
+    Log3Func(("[SD%RU8] -> cTicksToNext=%RU64\n", pStream->u8SD, cTicksToNext));
+
+    /* Reset processed data counter. */
+    pStream->State.cbTransferProcessed = 0;
+
+    /* Re-arm the timer. */
+    hdaTimerSet(pThis, tsNow + cTicksToNext, false /* fForce */);
+
+    DEVHDA_UNLOCK_BOTH(pThis);
     return VINF_SUCCESS;
 #else /* IN_RING3 */
     RT_NOREF(pThis, iReg, u32Value);
@@ -1997,12 +2142,31 @@ static int hdaRegWriteIRS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 
 static int hdaRegWriteRIRBWP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 {
-    RT_NOREF_PV(iReg);
+    RT_NOREF(iReg);
 
     DEVHDA_LOCK_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
 
+    if (HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA) /* Ignore request if CORB DMA engine is (still) running. */
+    {
+        LogFunc(("CORB DMA (still) running, skipping\n"));
+
+        DEVHDA_UNLOCK(pThis);
+        return VINF_SUCCESS;
+    }
+
     if (u32Value & HDA_RIRBWP_RST)
+    {
+        /* Do a RIRB reset. */
+        if (pThis->cbRirbBuf)
+        {
+            Assert(pThis->pu64RirbBuf);
+            RT_BZERO((void *)pThis->pu64RirbBuf, pThis->cbRirbBuf);
+        }
+
+        LogRel2(("HDA: RIRB reset\n"));
+
         HDA_REG(pThis, RIRBWP) = 0;
+    }
 
     DEVHDA_UNLOCK(pThis);
 
@@ -2010,6 +2174,29 @@ static int hdaRegWriteRIRBWP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
     return VINF_SUCCESS;
 }
 
+static int hdaRegWriteRINTCNT(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
+{
+    DEVHDA_LOCK_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
+
+    if (HDA_REG(pThis, CORBCTL) & HDA_CORBCTL_DMA) /* Ignore request if CORB DMA engine is (still) running. */
+    {
+        LogFunc(("CORB DMA is (still) running, skipping\n"));
+
+        DEVHDA_UNLOCK(pThis);
+        return VINF_SUCCESS;
+    }
+
+    RT_NOREF(iReg);
+
+    int rc = hdaRegWriteU16(pThis, iReg, u32Value);
+    AssertRC(rc);
+
+    LogFunc(("Response interrupt count is now %RU8\n", HDA_REG(pThis, RINTCNT) & 0xFF));
+
+    DEVHDA_UNLOCK(pThis);
+    return rc;
+}
+
 static int hdaRegWriteBase(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
 {
     uint32_t iRegMem = g_aHdaRegMap[iReg].mem_idx;
@@ -2514,116 +2701,6 @@ static DECLCALLBACK(int) hdaMixerSetVolume(PHDASTATE pThis,
     return rc;
 }
 
-#ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
-/**
- * Starts the internal audio device timer.
- *
- * @return  IPRT status code.
- * @param   pThis               HDA state.
- */
-static int hdaTimerStart(PHDASTATE pThis)
-{
-    LogFlowFuncEnter();
-
-    DEVHDA_LOCK_BOTH_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
-
-    AssertPtr(pThis->pTimer);
-
-    if (!pThis->fTimerActive)
-    {
-        LogRel2(("HDA: Starting transfers\n"));
-
-        pThis->fTimerActive  = true;
-        pThis->tsTimerExpire = TMTimerGet(pThis->pTimer) + pThis->cTimerTicks; /* Update current time timestamp. */
-
-        /* Start transfers. */
-        hdaTimerMain(pThis);
-    }
-
-    DEVHDA_UNLOCK_BOTH(pThis);
-
-    return VINF_SUCCESS;
-}
-
-/**
- * Starts the internal audio device timer (if not started yet).
- *
- * @return  IPRT status code.
- * @param   pThis               HDA state.
- */
-static int hdaTimerMaybeStart(PHDASTATE pThis)
-{
-    LogFlowFuncEnter();
-
-    if (!pThis->pTimer)
-        return VERR_WRONG_ORDER;
-
-    pThis->cStreamsActive++;
-
-    /* Only start the timer at the first active stream. */
-    if (pThis->cStreamsActive == 1)
-        return hdaTimerStart(pThis);
-
-    return VINF_SUCCESS;
-}
-
-/**
- * Stops the internal audio device timer.
- *
- * @return  IPRT status code.
- * @param   pThis               HDA state.
- */
-static int hdaTimerStop(PHDASTATE pThis)
-{
-    LogFlowFuncEnter();
-
-    if (!pThis->pTimer) /* Only can happen on device construction time, so no locking needed here. */
-        return VINF_SUCCESS;
-
-    DEVHDA_LOCK_BOTH_RETURN(pThis, VINF_IOM_R3_MMIO_WRITE);
-
-    if (pThis->fTimerActive)
-    {
-        LogRel2(("HDA: Stopping transfers ...\n"));
-
-        pThis->fTimerActive = false;
-
-        /* Note: Do not stop the timer via TMTimerStop() here, as there still might
-         *       be queued audio data which needs to be handled (e.g. played back) first
-         *       before actually stopping the timer for good. */
-    }
-
-    DEVHDA_UNLOCK_BOTH(pThis);
-
-    return VINF_SUCCESS;
-}
-
-/**
- * Decreases the active HDA streams count by one and
- * then checks if the internal audio device timer can be
- * stopped.
- *
- * @return  IPRT status code.
- * @param   pThis               HDA state.
- */
-static int hdaTimerMaybeStop(PHDASTATE pThis)
-{
-    LogFlowFuncEnter();
-
-    if (!pThis->pTimer)
-        return VERR_WRONG_ORDER;
-
-    if (pThis->cStreamsActive) /* Disable can be called mupltiple times. */
-    {
-        pThis->cStreamsActive--;
-
-        if (pThis->cStreamsActive == 0)
-            return hdaTimerStop(pThis);
-    }
-
-    return VINF_SUCCESS;
-}
-
 /**
  * Main routine for the device timer.
  *
@@ -2637,11 +2714,12 @@ static void hdaTimerMain(PHDASTATE pThis)
 
     DEVHDA_LOCK_BOTH_RETURN_VOID(pThis);
 
+    /* Do all transfers from/to DMA. */
+    hdaDoTransfers(pThis);
+
     /* Flag indicating whether to kick the timer again for a
      * new data processing round. */
-    bool fKickTimer = false;
-
-    hdaDoTransfers(pThis);
+    bool fSinksActive = false;
 
     /* Do we need to kick the timer again? */
     if (   AudioMixerSinkIsActive(pThis->SinkFront.pMixSink)
@@ -2655,19 +2733,26 @@ static void hdaTimerMain(PHDASTATE pThis)
 #endif
         )
     {
-        fKickTimer = true;
+        fSinksActive = true;
     }
 
-    if (   ASMAtomicReadBool(&pThis->fTimerActive)
-        || fKickTimer)
+    bool fTimerScheduled = false;
+    if (   hdaStreamTransferIsScheduled(hdaGetStreamFromSink(pThis, &pThis->SinkFront))
+#ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
+        || hdaStreamTransferIsScheduled(hdaGetStreamFromSink(pThis, &pThis->SinkMicIn))
+#endif
+        || hdaStreamTransferIsScheduled(hdaGetStreamFromSink(pThis, &pThis->SinkLineIn)))
     {
-        /* Kick the timer again. */
-        pThis->tsTimerExpire += pThis->cTimerTicks;
+        fTimerScheduled = true;
+    }
+
+    Log3Func(("fSinksActive=%RTbool, fTimerScheduled=%RTbool\n", fSinksActive, fTimerScheduled));
 
-        TMTimerSet(pThis->pTimer, pThis->tsTimerExpire);
+    if (    fSinksActive
+        && !fTimerScheduled)
+    {
+        hdaTimerSet(pThis, TMTimerGet(pThis->pTimer) + TMTimerGetFreq(pThis->pTimer) / pThis->u16TimerHz, true /* fForce */);
     }
-    else
-        LogRel2(("HDA: Stopped transfers\n"));
 
     DEVHDA_UNLOCK_BOTH(pThis);
 
@@ -2726,11 +2811,11 @@ static DECLCALLBACK(VBOXSTRICTRC) hdaDMAAccessHandler(PVM pVM, PVMCPU pVCpu, RTG
             uint64_t cWritesHz   = ASMAtomicReadU64(&pStreamDbg->cWritesHz);
             uint64_t cbWrittenHz = ASMAtomicReadU64(&pStreamDbg->cbWrittenHz);
 
-            if (tsElapsedMs >= (1000 / HDA_TIMER_HZ))
+            if (tsElapsedMs >= (1000 / HDA_TIMER_HZ_DEFAULT))
             {
                 LogFunc(("[SD%RU8] %RU32ms elapsed, cbWritten=%RU64, cWritten=%RU64 -- %RU32 bytes on average per time slot (%zums)\n",
                          pStream->u8SD, tsElapsedMs, cbWrittenHz, cWritesHz,
-                         ASMDivU64ByU32RetU32(cbWrittenHz, cWritesHz ? cWritesHz : 1), 1000 / HDA_TIMER_HZ));
+                         ASMDivU64ByU32RetU32(cbWrittenHz, cWritesHz ? cWritesHz : 1), 1000 / HDA_TIMER_HZ_DEFAULT));
 
                 pStreamDbg->tsWriteSlotBegin = tsNowNs;
 
@@ -2755,13 +2840,14 @@ static DECLCALLBACK(VBOXSTRICTRC) hdaDMAAccessHandler(PVM pVM, PVMCPU pVCpu, RTG
                      ASMDivU64ByU32RetU32(pStreamDbg->cbWrittenTotal, pStreamDbg->cWritesTotal)));
 # endif
 
-# ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-            RTFILE fh;
-            RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaDMAAccessWrite.pcm",
-                       RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
-            RTFileWrite(fh, pvBuf, cbBuf, NULL);
-            RTFileClose(fh);
-# endif
+            if (pThis->fDebugEnabled)
+            {
+                RTFILE fh;
+                RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaDMAAccessWrite.pcm",
+                           RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
+                RTFileWrite(fh, pvBuf, cbBuf, NULL);
+                RTFileClose(fh);
+            }
 
 # ifdef HDA_USE_DMA_ACCESS_HANDLER_WRITING
             PRTCIRCBUF pCircBuf = pStream->State.pCircBuf;
@@ -2816,33 +2902,21 @@ static void hdaGCTLReset(PHDASTATE pThis)
 {
     LogFlowFuncEnter();
 
-# ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
-    /*
-     * Stop the timer, if any.
-     */
-    hdaTimerStop(pThis);
-
     pThis->cStreamsActive = 0;
-# endif
 
-    memset(pThis->au32Regs, 0, sizeof(pThis->au32Regs));
-    /* See 6.2.1. */
-    HDA_REG(pThis, GCAP)     = HDA_MAKE_GCAP(HDA_MAX_SDO /* Ouput streams */,
-                                             HDA_MAX_SDI /* Input streams */,
-                                             0           /* Bidirectional output streams */,
-                                             0           /* Serial data out signals */,
-                                             1           /* 64-bit */);
-    HDA_REG(pThis, VMIN)     = 0x00;                     /* see 6.2.2 */
-    HDA_REG(pThis, VMAJ)     = 0x01;                     /* see 6.2.3 */
-    /* Announce the full 60 words output payload. */
-    HDA_REG(pThis, OUTPAY)   = 0x003C;                   /* see 6.2.4 */
-    /* Announce the full 29 words input payload. */
-    HDA_REG(pThis, INPAY)    = 0x001D;                   /* see 6.2.5 */
-    HDA_REG(pThis, CORBSIZE) = 0x42;                     /* see 6.2.1 */
-    HDA_REG(pThis, RIRBSIZE) = 0x42;                     /* see 6.2.1 */
+    HDA_REG(pThis, GCAP)     = HDA_MAKE_GCAP(HDA_MAX_SDO, HDA_MAX_SDI, 0, 0, 1); /* see 6.2.1 */
+    HDA_REG(pThis, VMIN)     = 0x00;                                             /* see 6.2.2 */
+    HDA_REG(pThis, VMAJ)     = 0x01;                                             /* see 6.2.3 */
+    HDA_REG(pThis, OUTPAY)   = 0x003C;                                           /* see 6.2.4 */
+    HDA_REG(pThis, INPAY)    = 0x001D;                                           /* see 6.2.5 */
+    HDA_REG(pThis, CORBSIZE) = 0x42; /* Up to 256 CORB entries                      see 6.2.1 */
+    HDA_REG(pThis, RIRBSIZE) = 0x42; /* Up to 256 RIRB entries                      see 6.2.1 */
     HDA_REG(pThis, CORBRP)   = 0x0;
+    HDA_REG(pThis, CORBWP)   = 0x0;
     HDA_REG(pThis, RIRBWP)   = 0x0;
-    HDA_REG(pThis, RINTCNT)  = 0x0;
+    /* Some guests (like Haiku) don't set RINTCNT explicitly but expect an interrupt after each
+     * RIRB response -- so initialize RINTCNT to 1 by default. */
+    HDA_REG(pThis, RINTCNT)  = 0x1;
 
     /*
      * Stop any audio currently playing and/or recording.
@@ -2871,7 +2945,7 @@ static void hdaGCTLReset(PHDASTATE pThis)
         pThis->pCodec->pfnReset(pThis->pCodec);
     }
 
-    /*
+       /*
      * Set some sensible defaults for which HDA sinks
      * are connected to which stream number.
      *
@@ -2922,7 +2996,6 @@ static void hdaGCTLReset(PHDASTATE pThis)
     LogRel(("HDA: Reset\n"));
 }
 
-
 /**
  * Timer callback which handles the audio data transfers on a periodic basis.
  *
@@ -2941,56 +3014,6 @@ static DECLCALLBACK(void) hdaTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pv
     hdaTimerMain(pThis);
 }
 
-#else /* VBOX_WITH_AUDIO_HDA_CALLBACKS */
-
-static DECLCALLBACK(int) hdaCallbackInput(PDMAUDIOBACKENDCBTYPE enmType, void *pvCtx, size_t cbCtx, void *pvUser, size_t cbUser)
-{
-    Assert(enmType == PDMAUDIOCALLBACKTYPE_INPUT);
-    AssertPtrReturn(pvCtx,  VERR_INVALID_POINTER);
-    AssertReturn(cbCtx,     VERR_INVALID_PARAMETER);
-    AssertPtrReturn(pvUser, VERR_INVALID_POINTER);
-    AssertReturn(cbUser,    VERR_INVALID_PARAMETER);
-
-    PHDACALLBACKCTX pCtx = (PHDACALLBACKCTX)pvCtx;
-    AssertReturn(cbCtx == sizeof(HDACALLBACKCTX), VERR_INVALID_PARAMETER);
-
-    PPDMAUDIOCBDATA_DATA_INPUT pData = (PPDMAUDIOCBDATA_DATA_INPUT)pvUser;
-    AssertReturn(cbUser == sizeof(PDMAUDIOCBDATA_DATA_INPUT), VERR_INVALID_PARAMETER);
-
-    return hdaStreamDoDMA(pCtx->pThis, PI_INDEX, UINT32_MAX, &pData->cbOutRead);
-}
-
-static DECLCALLBACK(int) hdaCallbackOutput(PDMAUDIOBACKENDCBTYPE enmType, void *pvCtx, size_t cbCtx, void *pvUser, size_t cbUser)
-{
-    Assert(enmType == PDMAUDIOCALLBACKTYPE_OUTPUT);
-    AssertPtrReturn(pvCtx,  VERR_INVALID_POINTER);
-    AssertReturn(cbCtx,     VERR_INVALID_PARAMETER);
-    AssertPtrReturn(pvUser, VERR_INVALID_POINTER);
-    AssertReturn(cbUser,    VERR_INVALID_PARAMETER);
-
-    PHDACALLBACKCTX pCtx = (PHDACALLBACKCTX)pvCtx;
-    AssertReturn(cbCtx == sizeof(HDACALLBACKCTX), VERR_INVALID_PARAMETER);
-
-    PPDMAUDIOCBDATA_DATA_OUTPUT pData = (PPDMAUDIOCBDATA_DATA_OUTPUT)pvUser;
-    AssertReturn(cbUser == sizeof(PDMAUDIOCBDATA_DATA_OUTPUT), VERR_INVALID_PARAMETER);
-
-    PHDASTATE pThis = pCtx->pThis;
-
-    int rc = hdaStreamDoDMA(pCtx->pThis, PO_INDEX, UINT32_MAX, &pData->cbOutWritten);
-    if (   RT_SUCCESS(rc)
-        && pData->cbOutWritten)
-    {
-        PHDADRIVER pDrv;
-        RTListForEach(&pThis->lstDrv, pDrv, HDADRIVER, Node)
-        {
-            uint32_t cFramesPlayed;
-            int rc2 = pDrv->pConnector->pfnPlay(pDrv->pConnector, &cFramesPlayed);
-            LogFlowFunc(("LUN#%RU8: cFramesPlayed=%RU32, rc=%Rrc\n", pDrv->uLUN, cFramesPlayed, rc2));
-        }
-    }
-}
-#endif /* VBOX_WITH_AUDIO_HDA_CALLBACKS */
-
 /**
  * Main routine to perform the actual audio data transfers from the HDA streams
  * to the backend(s) and vice versa.
@@ -3004,9 +3027,6 @@ static void hdaDoTransfers(PHDASTATE pThis)
     PHDASTREAM pStreamMicIn   = hdaGetStreamFromSink(pThis, &pThis->SinkMicIn);
 #endif
     PHDASTREAM pStreamFront   = hdaGetStreamFromSink(pThis, &pThis->SinkFront);
-#ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
-    /** @todo See note below. */
-#endif
 
     hdaStreamUpdate(pStreamFront,  true /* fInTimer */);
 #ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
@@ -3364,54 +3384,54 @@ static DECLCALLBACK(int)  hdaPciIoRegionMap(PPDMDEVINS pDevIns, PPDMPCIDEV pPciD
 
 /* Saved state callbacks. */
 
-static int hdaSaveStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PHDASTREAM pStrm)
+static int hdaSaveStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PHDASTREAM pStream)
 {
     RT_NOREF(pDevIns);
 #ifdef VBOX_STRICT
     PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE);
 #endif
 
-    Log2Func(("[SD%RU8]\n", pStrm->u8SD));
+    Log2Func(("[SD%RU8]\n", pStream->u8SD));
 
     /* Save stream ID. */
-    int rc = SSMR3PutU8(pSSM, pStrm->u8SD);
+    int rc = SSMR3PutU8(pSSM, pStream->u8SD);
     AssertRCReturn(rc, rc);
-    Assert(pStrm->u8SD < HDA_MAX_STREAMS);
+    Assert(pStream->u8SD < HDA_MAX_STREAMS);
 
-    rc = SSMR3PutStructEx(pSSM, &pStrm->State, sizeof(HDASTREAMSTATE), 0 /*fFlags*/, g_aSSMStreamStateFields7, NULL);
+    rc = SSMR3PutStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE), 0 /*fFlags*/, g_aSSMStreamStateFields7, NULL);
     AssertRCReturn(rc, rc);
 
 #ifdef VBOX_STRICT /* Sanity checks. */
-    uint64_t u64BaseDMA = RT_MAKE_U64(HDA_STREAM_REG(pThis, BDPL, pStrm->u8SD),
-                                      HDA_STREAM_REG(pThis, BDPU, pStrm->u8SD));
-    uint16_t u16LVI     = HDA_STREAM_REG(pThis, LVI, pStrm->u8SD);
-    uint32_t u32CBL     = HDA_STREAM_REG(pThis, CBL, pStrm->u8SD);
-
-    Assert(u64BaseDMA == pStrm->u64BDLBase);
-    Assert(u16LVI     == pStrm->u16LVI);
-    Assert(u32CBL     == pStrm->u32CBL);
+    uint64_t u64BaseDMA = RT_MAKE_U64(HDA_STREAM_REG(pThis, BDPL, pStream->u8SD),
+                                      HDA_STREAM_REG(pThis, BDPU, pStream->u8SD));
+    uint16_t u16LVI     = HDA_STREAM_REG(pThis, LVI, pStream->u8SD);
+    uint32_t u32CBL     = HDA_STREAM_REG(pThis, CBL, pStream->u8SD);
+
+    Assert(u64BaseDMA == pStream->u64BDLBase);
+    Assert(u16LVI     == pStream->u16LVI);
+    Assert(u32CBL     == pStream->u32CBL);
 #endif
 
-    rc = SSMR3PutStructEx(pSSM, &pStrm->State.BDLE.Desc, sizeof(HDABDLEDESC),
+    rc = SSMR3PutStructEx(pSSM, &pStream->State.BDLE.Desc, sizeof(HDABDLEDESC),
                           0 /*fFlags*/, g_aSSMBDLEDescFields7, NULL);
     AssertRCReturn(rc, rc);
 
-    rc = SSMR3PutStructEx(pSSM, &pStrm->State.BDLE.State, sizeof(HDABDLESTATE),
+    rc = SSMR3PutStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE),
                           0 /*fFlags*/, g_aSSMBDLEStateFields7, NULL);
     AssertRCReturn(rc, rc);
 
-    rc = SSMR3PutStructEx(pSSM, &pStrm->State.Period, sizeof(HDASTREAMPERIOD),
+    rc = SSMR3PutStructEx(pSSM, &pStream->State.Period, sizeof(HDASTREAMPERIOD),
                           0 /* fFlags */, g_aSSMStreamPeriodFields7, NULL);
     AssertRCReturn(rc, rc);
 
 #ifdef VBOX_STRICT /* Sanity checks. */
-    PHDABDLE pBDLE = &pStrm->State.BDLE;
+    PHDABDLE pBDLE = &pStream->State.BDLE;
     if (u64BaseDMA)
     {
-        Assert(pStrm->State.uCurBDLE <= u16LVI + 1);
+        Assert(pStream->State.uCurBDLE <= u16LVI + 1);
 
         HDABDLE curBDLE;
-        rc = hdaBDLEFetch(pThis, &curBDLE, u64BaseDMA, pStrm->State.uCurBDLE);
+        rc = hdaBDLEFetch(pThis, &curBDLE, u64BaseDMA, pStream->State.uCurBDLE);
         AssertRC(rc);
 
         Assert(curBDLE.Desc.u32BufSize == pBDLE->Desc.u32BufSize);
@@ -3428,10 +3448,10 @@ static int hdaSaveStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PHDASTREAM pStrm)
     uint32_t cbCircBufSize = 0;
     uint32_t cbCircBufUsed = 0;
 
-    if (pStrm->State.pCircBuf)
+    if (pStream->State.pCircBuf)
     {
-        cbCircBufSize = (uint32_t)RTCircBufSize(pStrm->State.pCircBuf);
-        cbCircBufUsed = (uint32_t)RTCircBufUsed(pStrm->State.pCircBuf);
+        cbCircBufSize = (uint32_t)RTCircBufSize(pStream->State.pCircBuf);
+        cbCircBufUsed = (uint32_t)RTCircBufUsed(pStream->State.pCircBuf);
     }
 
     rc = SSMR3PutU32(pSSM, cbCircBufSize);
@@ -3449,11 +3469,11 @@ static int hdaSaveStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PHDASTREAM pStrm)
          *
          * So get the current read offset and serialize the buffer data manually based on that.
          */
-        size_t cbCircBufOffRead = RTCircBufOffsetRead(pStrm->State.pCircBuf);
+        size_t cbCircBufOffRead = RTCircBufOffsetRead(pStream->State.pCircBuf);
 
         void  *pvBuf;
         size_t cbBuf;
-        RTCircBufAcquireReadBlock(pStrm->State.pCircBuf, cbCircBufUsed, &pvBuf, &cbBuf);
+        RTCircBufAcquireReadBlock(pStream->State.pCircBuf, cbCircBufUsed, &pvBuf, &cbBuf);
 
         if (cbBuf)
         {
@@ -3479,15 +3499,15 @@ static int hdaSaveStream(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, PHDASTREAM pStrm)
             }
         }
 
-        RTCircBufReleaseReadBlock(pStrm->State.pCircBuf, 0 /* Don't advance read pointer -- see comment above */);
+        RTCircBufReleaseReadBlock(pStream->State.pCircBuf, 0 /* Don't advance read pointer -- see comment above */);
     }
 
     Log2Func(("[SD%RU8] LPIB=%RU32, CBL=%RU32, LVI=%RU32\n",
-              pStrm->u8SD,
-              HDA_STREAM_REG(pThis, LPIB, pStrm->u8SD), HDA_STREAM_REG(pThis, CBL, pStrm->u8SD), HDA_STREAM_REG(pThis, LVI, pStrm->u8SD)));
+              pStream->u8SD,
+              HDA_STREAM_REG(pThis, LPIB, pStream->u8SD), HDA_STREAM_REG(pThis, CBL, pStream->u8SD), HDA_STREAM_REG(pThis, LVI, pStream->u8SD)));
 
 #ifdef LOG_ENABLED
-    hdaBDLEDumpAll(pThis, pStrm->u64BDLBase, pStrm->u16LVI + 1);
+    hdaBDLEDumpAll(pThis, pStream->u64BDLBase, pStream->u16LVI + 1);
 #endif
 
     return rc;
@@ -3533,7 +3553,7 @@ static int hdaLoadExecPost(PHDASTATE pThis)
 {
     int rc = VINF_SUCCESS;
 
-    bool fStartTimer = false; /* Whether to resume the device timer. */
+    uint64_t tsExpire = 0; /* Timestamp of new timer expiration time / Whether to resume the device timer. */
 
     /*
      * Enable all previously active streams.
@@ -3556,10 +3576,6 @@ static int hdaLoadExecPost(PHDASTATE pThis)
                 /* ... and enabling it. */
                 hdaStreamAsyncIOEnable(pStream, true /* fEnable */);
 #endif
-                /* (Re-)initialize the stream with current values. */
-                rc2 = hdaStreamInit(pStream, pStream->u8SD);
-                AssertRC(rc2);
-
                 /* Resume the stream's period. */
                 hdaStreamPeriodResume(&pStream->State.Period);
 
@@ -3575,16 +3591,26 @@ static int hdaLoadExecPost(PHDASTATE pThis)
                 /* (Re-)install the DMA handler. */
                 hdaStreamRegisterDMAHandlers(pThis, pStream);
 #endif
-                fStartTimer = true;
+                /* Determine the earliest timing slot we need to use. */
+                if (tsExpire)
+                    tsExpire = RT_MIN(tsExpire, hdaStreamTransferGetNext(pStream));
+                else
+                    tsExpire = hdaStreamTransferGetNext(pStream);
+
+                Log2Func(("[SD%RU8] tsExpire=%RU64\n", pStream->u8SD, tsExpire));
+
+                /* Also keep track of the currently active streams. */
+                pThis->cStreamsActive++;
             }
         }
     }
 
-#ifndef VBOX_WITH_AUDIO_CALLBACKS
     /* Start the timer if one of the above streams were active during taking the saved state. */
-    if (fStartTimer)
-        hdaTimerMaybeStart(pThis);
-#endif
+    if (tsExpire)
+    {
+        LogFunc(("Resuming timer at %RU64\n", tsExpire));
+        hdaTimerSet(pThis, tsExpire, true /* fForce */);
+    }
 
     LogFlowFuncLeaveRC(rc);
     return rc;
@@ -3760,16 +3786,16 @@ static int hdaLoadExecLegacy(PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion
                 if (RT_FAILURE(rc))
                     break;
 
-                PHDASTREAM pStrm = hdaGetStreamFromSD(pThis, uStreamID);
+                PHDASTREAM pStream = hdaGetStreamFromSD(pThis, uStreamID);
                 HDASTREAM  StreamDummy;
 
-                if (!pStrm)
+                if (!pStream)
                 {
-                    pStrm = &StreamDummy;
+                    pStream = &StreamDummy;
                     LogRel2(("HDA: Warning: Stream ID=%RU32 not supported, skipping to load ...\n", uStreamID));
                 }
 
-                rc = hdaStreamInit(pStrm, uStreamID);
+                rc = hdaStreamInit(pStream, uStreamID);
                 if (RT_FAILURE(rc))
                 {
                     LogRel(("HDA: Stream #%RU32: Initialization of stream %RU8 failed, rc=%Rrc\n", i, uStreamID, rc));
@@ -3789,7 +3815,7 @@ static int hdaLoadExecLegacy(PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion
                     AssertRC(rc);
                     rc = SSMR3GetU16(pSSM, &cBDLE);                 /* cBDLE */
                     AssertRC(rc);
-                    rc = SSMR3GetU16(pSSM, &pStrm->State.uCurBDLE); /* uCurBDLE */
+                    rc = SSMR3GetU16(pSSM, &pStream->State.uCurBDLE); /* uCurBDLE */
                     AssertRC(rc);
                     rc = SSMR3Skip(pSSM, sizeof(uint32_t));         /* End marker */
                     AssertRC(rc);
@@ -3803,13 +3829,13 @@ static int hdaLoadExecLegacy(PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion
                         AssertRC(rc);
 
                         /* Does the current BDLE index match the current BDLE to process? */
-                        if (u32BDLEIndex == pStrm->State.uCurBDLE)
+                        if (u32BDLEIndex == pStream->State.uCurBDLE)
                         {
-                            rc = SSMR3GetU32(pSSM, &pStrm->State.BDLE.State.cbBelowFIFOW); /* cbBelowFIFOW */
+                            rc = SSMR3GetU32(pSSM, &pStream->State.BDLE.State.cbBelowFIFOW); /* cbBelowFIFOW */
                             AssertRC(rc);
                             rc = SSMR3Skip(pSSM, sizeof(uint8_t) * 256);                   /* FIFO, deprecated */
                             AssertRC(rc);
-                            rc = SSMR3GetU32(pSSM, &pStrm->State.BDLE.State.u32BufOff);    /* u32BufOff */
+                            rc = SSMR3GetU32(pSSM, &pStream->State.BDLE.State.u32BufOff);    /* u32BufOff */
                             AssertRC(rc);
                             rc = SSMR3Skip(pSSM, sizeof(uint32_t));                        /* End marker */
                             AssertRC(rc);
@@ -3826,7 +3852,7 @@ static int hdaLoadExecLegacy(PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion
                 }
                 else
                 {
-                    rc = SSMR3GetStructEx(pSSM, &pStrm->State, sizeof(HDASTREAMSTATE),
+                    rc = SSMR3GetStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE),
                                           0 /* fFlags */, g_aSSMStreamStateFields6, NULL);
                     if (RT_FAILURE(rc))
                         break;
@@ -3836,19 +3862,19 @@ static int hdaLoadExecLegacy(PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion
                     rc = SSMR3GetU32(pSSM, &uMarker);      /* Begin marker. */
                     AssertRC(rc);
                     Assert(uMarker == UINT32_C(0x19200102) /* SSMR3STRUCT_BEGIN */);
-                    rc = SSMR3GetU64(pSSM, &pStrm->State.BDLE.Desc.u64BufAdr);
+                    rc = SSMR3GetU64(pSSM, &pStream->State.BDLE.Desc.u64BufAdr);
                     AssertRC(rc);
-                    rc = SSMR3GetU32(pSSM, &pStrm->State.BDLE.Desc.u32BufSize);
+                    rc = SSMR3GetU32(pSSM, &pStream->State.BDLE.Desc.u32BufSize);
                     AssertRC(rc);
                     bool fFlags = false;
                     rc = SSMR3GetBool(pSSM, &fFlags);      /* Saved states < v7 only stored the IOC as boolean flag. */
                     AssertRC(rc);
-                    pStrm->State.BDLE.Desc.fFlags = fFlags ? HDA_BDLE_FLAG_IOC : 0;
+                    pStream->State.BDLE.Desc.fFlags = fFlags ? HDA_BDLE_FLAG_IOC : 0;
                     rc = SSMR3GetU32(pSSM, &uMarker);      /* End marker. */
                     AssertRC(rc);
                     Assert(uMarker == UINT32_C(0x19920406) /* SSMR3STRUCT_END */);
 
-                    rc = SSMR3GetStructEx(pSSM, &pStrm->State.BDLE.State, sizeof(HDABDLESTATE),
+                    rc = SSMR3GetStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE),
                                           0 /* fFlags */, g_aSSMBDLEStateFields6, NULL);
                     if (RT_FAILURE(rc))
                         break;
@@ -3857,7 +3883,7 @@ static int hdaLoadExecLegacy(PHDASTATE pThis, PSSMHANDLE pSSM, uint32_t uVersion
                               uStreamID,
                               HDA_STREAM_REG(pThis, LPIB, uStreamID), HDA_STREAM_REG(pThis, CBL, uStreamID), HDA_STREAM_REG(pThis, LVI, uStreamID)));
 #ifdef LOG_ENABLED
-                    hdaBDLEDumpAll(pThis, pStrm->u64BDLBase, pStrm->u16LVI + 1);
+                    hdaBDLEDumpAll(pThis, pStream->u64BDLBase, pStream->u16LVI + 1);
 #endif
                 }
 
@@ -3956,51 +3982,51 @@ static DECLCALLBACK(int) hdaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32
         rc = SSMR3GetU8(pSSM, &uStreamID);
         AssertRC(rc);
 
-        PHDASTREAM pStrm = hdaGetStreamFromSD(pThis, uStreamID);
+        PHDASTREAM pStream = hdaGetStreamFromSD(pThis, uStreamID);
         HDASTREAM  StreamDummy;
 
-        if (!pStrm)
+        if (!pStream)
         {
-            pStrm = &StreamDummy;
+            pStream = &StreamDummy;
             LogRel2(("HDA: Warning: Loading of stream #%RU8 not supported, skipping to load ...\n", uStreamID));
         }
 
-        rc = hdaStreamInit(pStrm, uStreamID);
+        rc = hdaStreamInit(pStream, uStreamID);
         if (RT_FAILURE(rc))
         {
             LogRel(("HDA: Stream #%RU8: Loading initialization failed, rc=%Rrc\n", uStreamID, rc));
             /* Continue. */
         }
 
-        /*
-         * Load BDLEs (Buffer Descriptor List Entries) and DMA counters.
-         */
-        rc = SSMR3GetStructEx(pSSM, &pStrm->State, sizeof(HDASTREAMSTATE),
+        rc = SSMR3GetStructEx(pSSM, &pStream->State, sizeof(HDASTREAMSTATE),
                               0 /* fFlags */, g_aSSMStreamStateFields7,
                               NULL);
         AssertRC(rc);
 
-        rc = SSMR3GetStructEx(pSSM, &pStrm->State.BDLE.Desc, sizeof(HDABDLEDESC),
+        /*
+         * Load BDLEs (Buffer Descriptor List Entries) and DMA counters.
+         */
+        rc = SSMR3GetStructEx(pSSM, &pStream->State.BDLE.Desc, sizeof(HDABDLEDESC),
                               0 /* fFlags */, g_aSSMBDLEDescFields7, NULL);
         AssertRC(rc);
 
-        rc = SSMR3GetStructEx(pSSM, &pStrm->State.BDLE.State, sizeof(HDABDLESTATE),
+        rc = SSMR3GetStructEx(pSSM, &pStream->State.BDLE.State, sizeof(HDABDLESTATE),
                               0 /* fFlags */, g_aSSMBDLEStateFields7, NULL);
         AssertRC(rc);
 
-        Log2Func(("[SD%RU8] %R[bdle]\n", pStrm->u8SD, &pStrm->State.BDLE));
+        Log2Func(("[SD%RU8] %R[bdle]\n", pStream->u8SD, &pStream->State.BDLE));
 
         /*
          * Load period state.
          * Don't annoy other team mates (forgot this for state v7).
          */
-        hdaStreamPeriodInit(&pStrm->State.Period,
-                            pStrm->u8SD, pStrm->u16LVI, pStrm->u32CBL, &pStrm->State.Cfg);
+        hdaStreamPeriodInit(&pStream->State.Period,
+                            pStream->u8SD, pStream->u16LVI, pStream->u32CBL, &pStream->State.Cfg);
 
         if (   SSMR3HandleRevision(pSSM) >= 116273
             || SSMR3HandleVersion(pSSM)  >= VBOX_FULL_VERSION_MAKE(5, 2, 0))
         {
-            rc = SSMR3GetStructEx(pSSM, &pStrm->State.Period, sizeof(HDASTREAMPERIOD),
+            rc = SSMR3GetStructEx(pSSM, &pStream->State.Period, sizeof(HDASTREAMPERIOD),
                                   0 /* fFlags */, g_aSSMStreamPeriodFields7, NULL);
             AssertRC(rc);
         }
@@ -4008,7 +4034,6 @@ static DECLCALLBACK(int) hdaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32
         /*
          * Load internal (FIFO) buffer.
          */
-
         uint32_t cbCircBufSize = 0;
         rc = SSMR3GetU32(pSSM, &cbCircBufSize); /* cbCircBuf */
         AssertRC(rc);
@@ -4026,15 +4051,15 @@ static DECLCALLBACK(int) hdaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32
             AssertReleaseMsg(cbCircBufUsed <= cbCircBufSize,
                              ("HDA: Saved state contains invalid DMA buffer usage (%RU32/%RU32) for stream #%RU8",
                               cbCircBufUsed, cbCircBufSize, uStreamID));
-            AssertPtr(pStrm->State.pCircBuf);
+            AssertPtr(pStream->State.pCircBuf);
 
             /* Do we need to cre-create the circular buffer do fit the data size? */
-            if (cbCircBufSize != (uint32_t)RTCircBufSize(pStrm->State.pCircBuf))
+            if (cbCircBufSize != (uint32_t)RTCircBufSize(pStream->State.pCircBuf))
             {
-                RTCircBufDestroy(pStrm->State.pCircBuf);
-                pStrm->State.pCircBuf = NULL;
+                RTCircBufDestroy(pStream->State.pCircBuf);
+                pStream->State.pCircBuf = NULL;
 
-                rc = RTCircBufCreate(&pStrm->State.pCircBuf, cbCircBufSize);
+                rc = RTCircBufCreate(&pStream->State.pCircBuf, cbCircBufSize);
                 AssertRC(rc);
             }
 
@@ -4044,7 +4069,7 @@ static DECLCALLBACK(int) hdaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32
                 void  *pvBuf;
                 size_t cbBuf;
 
-                RTCircBufAcquireWriteBlock(pStrm->State.pCircBuf, cbCircBufUsed, &pvBuf, &cbBuf);
+                RTCircBufAcquireWriteBlock(pStream->State.pCircBuf, cbCircBufUsed, &pvBuf, &cbBuf);
 
                 if (cbBuf)
                 {
@@ -4052,7 +4077,7 @@ static DECLCALLBACK(int) hdaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32
                     AssertRC(rc);
                 }
 
-                RTCircBufReleaseWriteBlock(pStrm->State.pCircBuf, cbBuf);
+                RTCircBufReleaseWriteBlock(pStream->State.pCircBuf, cbBuf);
 
                 Assert(cbBuf == cbCircBufUsed);
             }
@@ -4062,7 +4087,7 @@ static DECLCALLBACK(int) hdaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32
                   uStreamID,
                   HDA_STREAM_REG(pThis, LPIB, uStreamID), HDA_STREAM_REG(pThis, CBL, uStreamID), HDA_STREAM_REG(pThis, LVI, uStreamID)));
 #ifdef LOG_ENABLED
-        hdaBDLEDumpAll(pThis, pStrm->u64BDLBase, pStrm->u16LVI + 1);
+        hdaBDLEDumpAll(pThis, pStream->u64BDLBase, pStream->u16LVI + 1);
 #endif
         /** @todo (Re-)initialize active periods? */
 
@@ -4201,14 +4226,14 @@ static void hdaDbgPrintStream(PHDASTATE pThis, PCDBGFINFOHLP pHlp, int iIdx)
            && iIdx >= 0
            && iIdx < HDA_MAX_STREAMS);
 
-    const PHDASTREAM pStrm = &pThis->aStreams[iIdx];
+    const PHDASTREAM pStream = &pThis->aStreams[iIdx];
 
     pHlp->pfnPrintf(pHlp, "Stream #%d:\n", iIdx);
     pHlp->pfnPrintf(pHlp, "\tSD%dCTL  : %R[sdctl]\n",   iIdx, HDA_STREAM_REG(pThis, CTL,   iIdx));
     pHlp->pfnPrintf(pHlp, "\tSD%dCTS  : %R[sdsts]\n",   iIdx, HDA_STREAM_REG(pThis, STS,   iIdx));
     pHlp->pfnPrintf(pHlp, "\tSD%dFIFOS: %R[sdfifos]\n", iIdx, HDA_STREAM_REG(pThis, FIFOS, iIdx));
     pHlp->pfnPrintf(pHlp, "\tSD%dFIFOW: %R[sdfifow]\n", iIdx, HDA_STREAM_REG(pThis, FIFOW, iIdx));
-    pHlp->pfnPrintf(pHlp, "\tBDLE     : %R[bdle]\n",    &pStrm->State.BDLE);
+    pHlp->pfnPrintf(pHlp, "\tBDLE     : %R[bdle]\n",    &pStream->State.BDLE);
 }
 
 static void hdaDbgPrintBDLE(PHDASTATE pThis, PCDBGFINFOHLP pHlp, int iIdx)
@@ -4217,8 +4242,8 @@ static void hdaDbgPrintBDLE(PHDASTATE pThis, PCDBGFINFOHLP pHlp, int iIdx)
            && iIdx >= 0
            && iIdx < HDA_MAX_STREAMS);
 
-    const PHDASTREAM pStrm = &pThis->aStreams[iIdx];
-    const PHDABDLE   pBDLE = &pStrm->State.BDLE;
+    const PHDASTREAM pStream = &pThis->aStreams[iIdx];
+    const PHDABDLE   pBDLE   = &pStream->State.BDLE;
 
     pHlp->pfnPrintf(pHlp, "Stream #%d BDLE:\n",      iIdx);
 
@@ -4730,9 +4755,15 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
      */
     if (!CFGMR3AreValuesValid(pCfg, "R0Enabled\0"
                                     "RCEnabled\0"
-                                    "TimerHz\0"))
+                                    "TimerHz\0"
+                                    "PosAdjustEnabled\0"
+                                    "PosAdjustFrames\0"
+                                    "DebugEnabled\0"
+                                    "DebugPathOut\0"))
+    {
         return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
                                 N_ ("Invalid configuration for the Intel HDA device"));
+    }
 
     int rc = CFGMR3QueryBoolDef(pCfg, "RCEnabled", &pThis->fRCEnabled, false);
     if (RT_FAILURE(rc))
@@ -4742,13 +4773,47 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
     if (RT_FAILURE(rc))
         return PDMDEV_SET_ERROR(pDevIns, rc,
                                 N_("HDA configuration error: failed to read R0Enabled as boolean"));
-#ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
-    uint16_t uTimerHz;
-    rc = CFGMR3QueryU16Def(pCfg, "TimerHz", &uTimerHz, HDA_TIMER_HZ /* Default value, if not set. */);
+
+    rc = CFGMR3QueryU16Def(pCfg, "TimerHz", &pThis->u16TimerHz, HDA_TIMER_HZ_DEFAULT /* Default value, if not set. */);
     if (RT_FAILURE(rc))
         return PDMDEV_SET_ERROR(pDevIns, rc,
                                 N_("HDA configuration error: failed to read Hertz (Hz) rate as unsigned integer"));
-#endif
+
+    if (pThis->u16TimerHz != HDA_TIMER_HZ_DEFAULT)
+        LogRel(("HDA: Using custom device timer rate (%RU16Hz)\n", pThis->u16TimerHz));
+
+    rc = CFGMR3QueryBoolDef(pCfg, "PosAdjustEnabled", &pThis->fPosAdjustEnabled, true);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("HDA configuration error: failed to read position adjustment enabled as boolean"));
+
+    if (!pThis->fPosAdjustEnabled)
+        LogRel(("HDA: Position adjustment is disabled\n"));
+
+    rc = CFGMR3QueryU16Def(pCfg, "PosAdjustFrames", &pThis->cPosAdjustFrames, HDA_POS_ADJUST_DEFAULT);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("HDA configuration error: failed to read position adjustment frames as unsigned integer"));
+
+    if (pThis->cPosAdjustFrames)
+        LogRel(("HDA: Using custom position adjustment (%RU16 audio frames)\n", pThis->cPosAdjustFrames));
+
+    rc = CFGMR3QueryBoolDef(pCfg, "DebugEnabled", &pThis->Dbg.fEnabled, false);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("HDA configuration error: failed to read debugging enabled flag as boolean"));
+
+    rc = CFGMR3QueryStringDef(pCfg, "DebugPathOut", pThis->Dbg.szOutPath, sizeof(pThis->Dbg.szOutPath),
+                              VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("HDA configuration error: failed to read debugging output path flag as string"));
+
+    if (!strlen(pThis->Dbg.szOutPath))
+        RTStrPrintf(pThis->Dbg.szOutPath, sizeof(pThis->Dbg.szOutPath), VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH);
+
+    if (pThis->Dbg.fEnabled)
+        LogRel2(("HDA: Debug output will be saved to '%s'\n", pThis->Dbg.szOutPath));
 
     /*
      * Use an own critical section for the device instead of the default
@@ -4982,7 +5047,7 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
          */
         for (uint8_t i = 0; i < HDA_MAX_STREAMS; ++i)
         {
-            rc = hdaStreamCreate(&pThis->aStreams[i], pThis);
+            rc = hdaStreamCreate(&pThis->aStreams[i], pThis, i /* u8SD */);
             AssertRC(rc);
         }
 
@@ -5173,7 +5238,6 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
         }
     }
 
-# ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
     if (RT_SUCCESS(rc))
     {
         /* Create the emulation timer.
@@ -5190,41 +5254,7 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
          * That way we can control more fine-grained when to lock what. */
         rc = TMR3TimerSetCritSect(pThis->pTimer, &pThis->CritSect);
         AssertRCReturn(rc, rc);
-
-        pThis->cTimerTicks = TMTimerGetFreq(pThis->pTimer) / uTimerHz;
-        LogFunc(("Timer ticks=%RU64 (%RU16 Hz)\n", pThis->cTimerTicks, uTimerHz));
     }
-# else
-    if (RT_SUCCESS(rc))
-    {
-        PHDADRIVER pDrv;
-        RTListForEach(&pThis->lstDrv, pDrv, HDADRIVER, Node)
-        {
-            /* Only register primary driver.
-             * The device emulation does the output multiplexing then. */
-            if (pDrv->fFlags != PDMAUDIODRVFLAGS_PRIMARY)
-                continue;
-
-            PDMAUDIOCBRECORD AudioCallbacks[2];
-
-            HDACALLBACKCTX Ctx = { pThis, pDrv };
-
-            AudioCallbacks[0].enmType     = PDMAUDIOCALLBACKTYPE_INPUT;
-            AudioCallbacks[0].pfnCallback = hdaCallbackInput;
-            AudioCallbacks[0].pvCtx       = &Ctx;
-            AudioCallbacks[0].cbCtx       = sizeof(HDACALLBACKCTX);
-
-            AudioCallbacks[1].enmType     = PDMAUDIOCALLBACKTYPE_OUTPUT;
-            AudioCallbacks[1].pfnCallback = hdaCallbackOutput;
-            AudioCallbacks[1].pvCtx       = &Ctx;
-            AudioCallbacks[1].cbCtx       = sizeof(HDACALLBACKCTX);
-
-            rc = pDrv->pConnector->pfnRegisterCallbacks(pDrv->pConnector, AudioCallbacks, RT_ELEMENTS(AudioCallbacks));
-            if (RT_FAILURE(rc))
-                break;
-        }
-    }
-# endif
 
 # ifdef VBOX_WITH_STATISTICS
     if (RT_SUCCESS(rc))
@@ -5232,9 +5262,7 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
         /*
          * Register statistics.
          */
-#  ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
         PDMDevHlpSTAMRegister(pDevIns, &pThis->StatTimer,            STAMTYPE_PROFILE, "/Devices/HDA/Timer",             STAMUNIT_TICKS_PER_CALL, "Profiling hdaTimer.");
-#  endif
         PDMDevHlpSTAMRegister(pDevIns, &pThis->StatIn,               STAMTYPE_PROFILE, "/Devices/HDA/Input",             STAMUNIT_TICKS_PER_CALL, "Profiling input.");
         PDMDevHlpSTAMRegister(pDevIns, &pThis->StatOut,              STAMTYPE_PROFILE, "/Devices/HDA/Output",            STAMUNIT_TICKS_PER_CALL, "Profiling output.");
         PDMDevHlpSTAMRegister(pDevIns, &pThis->StatBytesRead,        STAMTYPE_COUNTER, "/Devices/HDA/BytesRead"   ,      STAMUNIT_BYTES,          "Bytes read from HDA emulation.");
@@ -5242,13 +5270,6 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
     }
 # endif
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-    RTFileDelete(VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaDMARead.pcm");
-    RTFileDelete(VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaDMAWrite.pcm");
-    RTFileDelete(VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamRead.pcm");
-    RTFileDelete(VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamWrite.pcm");
-#endif
-
     LogFlowFuncLeaveRC(rc);
     return rc;
 }
diff --git a/src/VBox/Devices/Audio/DevHDA.h b/src/VBox/Devices/Audio/DevHDA.h
index 2ad1cc7..3068107 100644
--- a/src/VBox/Devices/Audio/DevHDA.h
+++ b/src/VBox/Devices/Audio/DevHDA.h
@@ -21,6 +21,8 @@
 /*********************************************************************************************************************************
 *   Header Files                                                                                                                 *
 *********************************************************************************************************************************/
+#include <iprt/path.h>
+
 #include <VBox/vmm/pdmdev.h>
 
 #include "AudioMixer.h"
@@ -74,10 +76,10 @@ typedef struct HDATAG
     R3PTRTYPE(PHDASTREAM) pStream;
 } HDATAG, *PHDATAG;
 
-#ifdef DEBUG
 /** @todo Make STAM values out of this? */
 typedef struct HDASTATEDBGINFO
 {
+#ifdef DEBUG
     /** Timestamp (in ns) of the last timer callback (hdaTimer).
      * Used to calculate the time actually elapsed between two timer callbacks. */
     uint64_t                           tsTimerLastCalledNs;
@@ -99,8 +101,13 @@ typedef struct HDASTATEDBGINFO
         /** Accumulated elapsed time (in ns) of all IRQ being deasserted. */
         uint64_t                       tsDeassertedTotalNs;
     } IRQ;
-} HDASTATEDBGINFO, *PHDASTATEDBGINFO;
 #endif
+    /** Whether debugging is enabled or not. */
+    bool                               fEnabled;
+    /** Path where to dump the debug output to.
+     *  Defaults to VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH. */
+    char                               szOutPath[RTPATH_MAX + 1];
+} HDASTATEDBGINFO, *PHDASTATEDBGINFO;
 
 /**
  * ICH Intel HD Audio Controller state.
@@ -153,21 +160,10 @@ typedef struct HDASTATE
     bool                               fRCEnabled;
     /** Number of active (running) SDn streams. */
     uint8_t                            cStreamsActive;
-#ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
     /** The timer for pumping data thru the attached LUN drivers. */
     PTMTIMERR3                         pTimer;
-    /** Flag indicating whether the timer is active or not. */
-    bool                               fTimerActive;
-    uint8_t                            u8Padding1[7];
-    /** Timer ticks per Hz. */
-    uint64_t                           cTimerTicks;
-    /** The current timer expire time (in timer ticks). */
-    uint64_t                           tsTimerExpire;
-#endif
 #ifdef VBOX_WITH_STATISTICS
-# ifndef VBOX_WITH_AUDIO_HDA_CALLBACKS
     STAMPROFILE                        StatTimer;
-# endif
     STAMPROFILE                        StatIn;
     STAMPROFILE                        StatOut;
     STAMCOUNTER                        StatBytesRead;
@@ -204,22 +200,27 @@ typedef struct HDASTATE
 #endif
     /** Response Interrupt Count (RINTCNT). */
     uint16_t                           u16RespIntCnt;
+    /** Position adjustment (in audio frames).
+     *
+     *  This is not an official feature of the HDA specs, but used by
+     *  certain OS drivers (e.g. snd_hda_intel) to work around certain
+     *  quirks by "real" HDA hardware implementations.
+     *
+     *  The position adjustment specifies how many audio frames
+     *  a stream is ahead from its actual reading/writing position when
+     *  starting a stream.
+     */
+    uint16_t                           cPosAdjustFrames;
+    /** Whether the position adjustment is enabled or not. */
+    bool                               fPosAdjustEnabled;
+    uint8_t                            Padding1[3];
     /** Current IRQ level. */
     uint8_t                            u8IRQL;
+    /** The device timer Hz rate. Defaults to HDA_TIMER_HZ_DEFAULT. */
+    uint16_t                           u16TimerHz;
     /** Padding for alignment. */
-    uint8_t                            au8Padding3[5];
-#ifdef DEBUG
+    uint8_t                            au8Padding3[3];
     HDASTATEDBGINFO                    Dbg;
-#endif
 } HDASTATE, *PHDASTATE;
-
-#ifdef VBOX_WITH_AUDIO_HDA_CALLBACKS
-typedef struct HDACALLBACKCTX
-{
-    PHDASTATE  pThis;
-    PHDADRIVER pDriver;
-} HDACALLBACKCTX, *PHDACALLBACKCTX;
-#endif
-
 #endif /* !DEV_HDA_H */
 
diff --git a/src/VBox/Devices/Audio/DevHDACommon.cpp b/src/VBox/Devices/Audio/DevHDACommon.cpp
index c702a7d..3d49d4a 100644
--- a/src/VBox/Devices/Audio/DevHDACommon.cpp
+++ b/src/VBox/Devices/Audio/DevHDACommon.cpp
@@ -25,6 +25,7 @@
 #define LOG_GROUP LOG_GROUP_DEV_HDA
 #include <VBox/log.h>
 
+#include "DrvAudio.h"
 
 #include "DevHDA.h"
 #include "DevHDACommon.h"
@@ -52,89 +53,33 @@ int hdaProcessInterrupt(PHDASTATE pThis)
 int hdaProcessInterrupt(PHDASTATE pThis, const char *pszSource)
 #endif
 {
-    HDA_REG(pThis, INTSTS) = hdaGetINTSTS(pThis);
+    uint32_t uIntSts = hdaGetINTSTS(pThis);
 
-    Log3Func(("IRQL=%RU8\n", pThis->u8IRQL));
+    HDA_REG(pThis, INTSTS) = uIntSts;
 
     /* NB: It is possible to have GIS set even when CIE/SIEn are all zero; the GIS bit does
      * not control the interrupt signal. See Figure 4 on page 54 of the HDA 1.0a spec.
      */
-
-    /* If global interrupt enable (GIE) is set, check if any enabled interrupts are set. */
+    /* Global Interrupt Enable (GIE) set? */
     if (   (HDA_REG(pThis, INTCTL) & HDA_INTCTL_GIE)
         && (HDA_REG(pThis, INTSTS) & HDA_REG(pThis, INTCTL) & (HDA_INTCTL_CIE | HDA_STRMINT_MASK)))
     {
-        if (!pThis->u8IRQL)
-        {
-#ifdef DEBUG
-            if (!pThis->Dbg.IRQ.tsProcessedLastNs)
-                pThis->Dbg.IRQ.tsProcessedLastNs = RTTimeNanoTS();
-
-            const uint64_t tsLastElapsedNs = RTTimeNanoTS() - pThis->Dbg.IRQ.tsProcessedLastNs;
-
-            if (!pThis->Dbg.IRQ.tsAssertedNs)
-                pThis->Dbg.IRQ.tsAssertedNs = RTTimeNanoTS();
-
-            const uint64_t tsAssertedElapsedNs = RTTimeNanoTS() - pThis->Dbg.IRQ.tsAssertedNs;
-
-            pThis->Dbg.IRQ.cAsserted++;
-            pThis->Dbg.IRQ.tsAssertedTotalNs += tsAssertedElapsedNs;
-
-            const uint64_t avgAssertedUs = (pThis->Dbg.IRQ.tsAssertedTotalNs / pThis->Dbg.IRQ.cAsserted) / 1000;
-
-            if (avgAssertedUs > (1000 / HDA_TIMER_HZ) /* ms */ * 1000) /* Exceeds time slot? */
-                Log3Func(("Asserted (%s): %zuus elapsed (%zuus on average) -- %zuus alternation delay\n",
-                          pszSource, tsAssertedElapsedNs / 1000,
-                          avgAssertedUs,
-                          (pThis->Dbg.IRQ.tsDeassertedNs - pThis->Dbg.IRQ.tsAssertedNs) / 1000));
-#endif
-            Log3Func(("Asserted (%s): %RU64us between alternation (WALCLK=%RU64)\n",
-                      pszSource, tsLastElapsedNs / 1000, pThis->u64WalClk));
+        Log3Func(("Asserted (%s)\n", pszSource));
 
-            PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 1 /* Assert */);
-            pThis->u8IRQL = 1;
+        PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 1 /* Assert */);
+        pThis->u8IRQL = 1;
 
 #ifdef DEBUG
-            pThis->Dbg.IRQ.tsAssertedNs = RTTimeNanoTS();
-            pThis->Dbg.IRQ.tsProcessedLastNs = pThis->Dbg.IRQ.tsAssertedNs;
+        pThis->Dbg.IRQ.tsAssertedNs = RTTimeNanoTS();
+        pThis->Dbg.IRQ.tsProcessedLastNs = pThis->Dbg.IRQ.tsAssertedNs;
 #endif
-        }
     }
     else
     {
-        if (pThis->u8IRQL)
-        {
-#ifdef DEBUG
-            if (!pThis->Dbg.IRQ.tsProcessedLastNs)
-                pThis->Dbg.IRQ.tsProcessedLastNs = RTTimeNanoTS();
-
-            const uint64_t tsLastElapsedNs = RTTimeNanoTS() - pThis->Dbg.IRQ.tsProcessedLastNs;
-
-            if (!pThis->Dbg.IRQ.tsDeassertedNs)
-                pThis->Dbg.IRQ.tsDeassertedNs = RTTimeNanoTS();
-
-            const uint64_t tsDeassertedElapsedNs = RTTimeNanoTS() - pThis->Dbg.IRQ.tsDeassertedNs;
-
-            pThis->Dbg.IRQ.cDeasserted++;
-            pThis->Dbg.IRQ.tsDeassertedTotalNs += tsDeassertedElapsedNs;
-
-            const uint64_t avgDeassertedUs = (pThis->Dbg.IRQ.tsDeassertedTotalNs / pThis->Dbg.IRQ.cDeasserted) / 1000;
-
-            if (avgDeassertedUs > (1000 / HDA_TIMER_HZ) /* ms */ * 1000) /* Exceeds time slot? */
-                Log3Func(("Deasserted (%s): %zuus elapsed (%zuus on average)\n",
-                          pszSource, tsDeassertedElapsedNs / 1000, avgDeassertedUs));
+        Log3Func(("Deasserted (%s)\n", pszSource));
 
-            Log3Func(("Deasserted (%s): %RU64us between alternation (WALCLK=%RU64)\n",
-                      pszSource, tsLastElapsedNs / 1000, pThis->u64WalClk));
-#endif
-            PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 0 /* Deassert */);
-            pThis->u8IRQL = 0;
-
-#ifdef DEBUG
-            pThis->Dbg.IRQ.tsDeassertedNs    = RTTimeNanoTS();
-            pThis->Dbg.IRQ.tsProcessedLastNs = pThis->Dbg.IRQ.tsDeassertedNs;
-#endif
-        }
+        PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 0 /* Deassert */);
+        pThis->u8IRQL = 0;
     }
 
     return VINF_SUCCESS;
@@ -183,9 +128,8 @@ bool hdaWalClkSet(PHDASTATE pThis, uint64_t u64WalClk, bool fForce)
 #endif
 
 #ifdef VBOX_STRICT
-    const uint64_t u64WalClkCur = ASMAtomicReadU64(&pThis->u64WalClk);
+    const uint64_t u64WalClkCur       = ASMAtomicReadU64(&pThis->u64WalClk);
 #endif
-          uint64_t u64WalClkSet = u64WalClk;
 
     /* Only drive the WALCLK register forward if all (active) stream periods have passed
      * the specified point in time given by u64WalClk. */
@@ -204,24 +148,24 @@ bool hdaWalClkSet(PHDASTATE pThis, uint64_t u64WalClk, bool fForce)
         {
             /* Get the maximum value of all periods we need to handle.
              * Not the most elegant solution, but works for now ... */
-            u64WalClk = RT_MAX(u64WalClkSet, u64FrontAbsWalClk);
+            u64WalClk = RT_MAX(u64WalClk, u64FrontAbsWalClk);
 #ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
 # error "Implement me!"
 #endif
-            u64WalClk = RT_MAX(u64WalClkSet, u64LineInAbsWalClk);
+            u64WalClk = RT_MAX(u64WalClk, u64LineInAbsWalClk);
 #ifdef VBOX_WITH_HDA_MIC_IN
-            u64WalClk = RT_MAX(u64WalClkSet, u64MicInAbsWalClk);
+            u64WalClk = RT_MAX(u64WalClk, u64MicInAbsWalClk);
 #endif
 
 #ifdef VBOX_STRICT
-            AssertMsg(u64WalClkSet >= u64WalClkCur,
+            AssertMsg(u64WalClk >= u64WalClkCur,
                       ("Setting WALCLK to a value going backwards does not make any sense (old %RU64 vs. new %RU64)\n",
-                       u64WalClkCur, u64WalClkSet));
-            if (u64WalClkSet == u64WalClkCur)     /* Setting a stale value? */
+                       u64WalClkCur, u64WalClk));
+            if (u64WalClk == u64WalClkCur)     /* Setting a stale value? */
             {
                 if (pThis->u8WalClkStaleCnt++ > 3)
                     AssertMsgFailed(("Setting WALCLK to a stale value (%RU64) too often isn't a good idea really. "
-                                     "Good luck with stuck audio stuff.\n", u64WalClkSet));
+                                     "Good luck with stuck audio stuff.\n", u64WalClk));
             }
             else
                 pThis->u8WalClkStaleCnt = 0;
@@ -229,7 +173,7 @@ bool hdaWalClkSet(PHDASTATE pThis, uint64_t u64WalClk, bool fForce)
         }
 
         /* Set the new WALCLK value. */
-        ASMAtomicWriteU64(&pThis->u64WalClk, u64WalClkSet);
+        ASMAtomicWriteU64(&pThis->u64WalClk, u64WalClk);
     }
 
     const uint64_t u64WalClkNew = hdaWalClkGetCurrent(pThis);
@@ -297,27 +241,27 @@ PHDASTREAM hdaGetStreamFromSink(PHDASTATE pThis, PHDAMIXERSINK pSink)
 }
 
 /**
- * Reads DMA data from a given HDA output stream into its associated FIFO buffer.
+ * Reads DMA data from a given HDA output stream.
  *
  * @return  IPRT status code.
  * @param   pThis               HDA state.
  * @param   pStream             HDA output stream to read DMA data from.
- * @param   cbToRead            How much (in bytes) to read from DMA.
+ * @param   pvBuf               Where to store the read data.
+ * @param   cbBuf               How much to read in bytes.
  * @param   pcbRead             Returns read bytes from DMA. Optional.
  */
-int hdaDMARead(PHDASTATE pThis, PHDASTREAM pStream, uint32_t cbToRead, uint32_t *pcbRead)
+int hdaDMARead(PHDASTATE pThis, PHDASTREAM pStream, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead)
 {
     AssertPtrReturn(pThis,   VERR_INVALID_POINTER);
     AssertPtrReturn(pStream, VERR_INVALID_POINTER);
     /* pcbRead is optional. */
 
+    PHDABDLE pBDLE       = &pStream->State.BDLE;
+
     int rc = VINF_SUCCESS;
 
     uint32_t cbReadTotal = 0;
-
-    PHDABDLE   pBDLE     = &pStream->State.BDLE;
-    PRTCIRCBUF pCircBuf  = pStream->State.pCircBuf;
-    AssertPtr(pCircBuf);
+    uint32_t cbLeft      = RT_MIN(cbBuf, pBDLE->Desc.u32BufSize - pBDLE->State.u32BufOff);
 
 #ifdef HDA_DEBUG_SILENCE
     uint64_t   csSilence = 0;
@@ -326,79 +270,41 @@ int hdaDMARead(PHDASTATE pThis, PHDASTREAM pStream, uint32_t cbToRead, uint32_t
     pStream->Dbg.cbSilenceReadMin  = _1M;
 #endif
 
-    while (cbToRead)
+    RTGCPHYS addrChunk = pBDLE->Desc.u64BufAdr + pBDLE->State.u32BufOff;
+
+    while (cbLeft)
     {
-        /* Make sure we only copy as much as the stream's FIFO can hold (SDFIFOS, 18.2.39). */
-        void *pvBuf;
-        size_t cbBuf;
-        RTCircBufAcquireWriteBlock(pCircBuf, RT_MIN(cbToRead, pStream->u16FIFOS), &pvBuf, &cbBuf);
+        uint32_t cbChunk = RT_MIN(cbLeft, pStream->u16FIFOS);
 
-        if (cbBuf)
-        {
-            /*
-             * Read from the current BDLE's DMA buffer.
-             */
-            int rc2 = PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns),
-                                        pBDLE->Desc.u64BufAdr + pBDLE->State.u32BufOff + cbReadTotal, pvBuf, cbBuf);
-            AssertRC(rc2);
+        rc = PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), addrChunk, (uint8_t *)pvBuf + cbReadTotal, cbChunk);
+        if (RT_FAILURE(rc))
+            break;
 
 #ifdef HDA_DEBUG_SILENCE
-            uint16_t *pu16Buf = (uint16_t *)pvBuf;
-            for (size_t i = 0; i < cbBuf / sizeof(uint16_t); i++)
-            {
-                if (*pu16Buf == 0)
-                {
-                    csSilence++;
-                }
-                else
-                    break;
-                pu16Buf++;
-            }
-#endif
-
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-            if (cbBuf)
+        uint16_t *pu16Buf = (uint16_t *)pvBuf;
+        for (size_t i = 0; i < cbChunk / sizeof(uint16_t); i++)
+        {
+            if (*pu16Buf == 0)
             {
-                RTFILE fh;
-                rc2 = RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaDMARead.pcm",
-                                 RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
-                if (RT_SUCCESS(rc2))
-                {
-                    RTFileWrite(fh, pvBuf, cbBuf, NULL);
-                    RTFileClose(fh);
-                }
-                else
-                    AssertRC(rc2);
+                csSilence++;
             }
+            else
+                break;
+            pu16Buf++;
+        }
 #endif
-
-#if 0
-            pStream->Dbg.cbReadTotal += cbBuf;
-            const uint64_t cbWritten = ASMAtomicReadU64(&pStream->Dbg.cbWrittenTotal);
-            Log3Func(("cbRead=%RU64, cbWritten=%RU64 -> %RU64 bytes %s\n",
-                      pStream->Dbg.cbReadTotal, cbWritten,
-                      pStream->Dbg.cbReadTotal >= cbWritten ? pStream->Dbg.cbReadTotal - cbWritten : cbWritten - pStream->Dbg.cbReadTotal,
-                      pStream->Dbg.cbReadTotal > cbWritten ? "too much" : "too little"));
-#endif
+        if (pStream->Dbg.Runtime.fEnabled)
+            DrvAudioHlpFileWrite(pStream->Dbg.Runtime.pFileDMA, (uint8_t *)pvBuf + cbReadTotal, cbChunk, 0 /* fFlags */);
 
 #ifdef VBOX_WITH_STATISTICS
-            STAM_COUNTER_ADD(&pThis->StatBytesRead, cbBuf);
+        STAM_COUNTER_ADD(&pThis->StatBytesRead, cbChunk);
 #endif
-        }
-
-        RTCircBufReleaseWriteBlock(pCircBuf, cbBuf);
-
-        if (!cbBuf)
-        {
-            rc = VERR_BUFFER_OVERFLOW;
-            break;
-        }
+        addrChunk         = (addrChunk + cbChunk) % pBDLE->Desc.u32BufSize;
 
-        cbReadTotal += (uint32_t)cbBuf;
-        Assert(pBDLE->State.u32BufOff + cbReadTotal <= pBDLE->Desc.u32BufSize);
+        Assert(cbLeft    >= cbChunk);
+        cbLeft           -= cbChunk;
 
-        Assert(cbToRead >= cbBuf);
-        cbToRead    -= (uint32_t)cbBuf;
+        cbReadTotal      += cbChunk;
     }
 
 #ifdef HDA_DEBUG_SILENCE
@@ -430,72 +336,51 @@ int hdaDMARead(PHDASTATE pThis, PHDASTREAM pStream, uint32_t cbToRead, uint32_t
  * @return  IPRT status code.
  * @param   pThis               HDA state.
  * @param   pStream             HDA input stream to write audio data to.
- * @param   cbToWrite           How much (in bytes) to write.
+ * @param   pvBuf               Data to write.
+ * @param   cbBuf               How much (in bytes) to write.
  * @param   pcbWritten          Returns written bytes on success. Optional.
  */
-int hdaDMAWrite(PHDASTATE pThis, PHDASTREAM pStream, uint32_t cbToWrite, uint32_t *pcbWritten)
+int hdaDMAWrite(PHDASTATE pThis, PHDASTREAM pStream, const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten)
 {
     AssertPtrReturn(pThis,   VERR_INVALID_POINTER);
     AssertPtrReturn(pStream, VERR_INVALID_POINTER);
     /* pcbWritten is optional. */
 
-    PHDABDLE   pBDLE    = &pStream->State.BDLE;
-    PRTCIRCBUF pCircBuf = pStream->State.pCircBuf;
-    AssertPtr(pCircBuf);
+    PHDABDLE pBDLE  = &pStream->State.BDLE;
 
     int rc = VINF_SUCCESS;
 
     uint32_t cbWrittenTotal = 0;
+    uint32_t cbLeft = RT_MIN(cbBuf, pBDLE->Desc.u32BufSize - pBDLE->State.u32BufOff);
 
-    void *pvBuf  = NULL;
-    size_t cbBuf = 0;
-
-    uint8_t abSilence[HDA_FIFO_MAX + 1] = { 0 };
+    RTGCPHYS addrChunk = pBDLE->Desc.u64BufAdr + pBDLE->State.u32BufOff;
 
-    while (cbToWrite)
+    while (cbLeft)
     {
-        size_t cbChunk = RT_MIN(cbToWrite, pStream->u16FIFOS);
+        uint32_t cbChunk = RT_MIN(cbLeft, pStream->u16FIFOS);
 
-        size_t cbBlock = 0;
-        RTCircBufAcquireReadBlock(pCircBuf, cbChunk, &pvBuf, &cbBlock);
+        /* Sanity checks. */
+        Assert(cbChunk <= pBDLE->Desc.u32BufSize - pBDLE->State.u32BufOff);
+        Assert(cbChunk % HDA_FRAME_SIZE == 0);
+        Assert((cbChunk >> 1) >= 1);
 
-        if (cbBlock)
-        {
-            cbBuf = cbBlock;
-        }
-        else /* No audio data available? Send silence. */
-        {
-            pvBuf = &abSilence;
-            cbBuf = cbChunk;
-        }
+        if (pStream->Dbg.Runtime.fEnabled)
+            DrvAudioHlpFileWrite(pStream->Dbg.Runtime.pFileDMA, (uint8_t *)pvBuf + cbWrittenTotal, cbChunk, 0 /* fFlags */);
 
-        /* Sanity checks. */
-        Assert(cbBuf <= pBDLE->Desc.u32BufSize - pBDLE->State.u32BufOff);
-        Assert(cbBuf % HDA_FRAME_SIZE == 0);
-        Assert((cbBuf >> 1) >= 1);
-
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-        RTFILE fh;
-        RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaDMAWrite.pcm",
-                   RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
-        RTFileWrite(fh, pvBuf, cbBuf, NULL);
-        RTFileClose(fh);
-#endif
-        int rc2 = PDMDevHlpPCIPhysWrite(pThis->CTX_SUFF(pDevIns),
-                                        pBDLE->Desc.u64BufAdr + pBDLE->State.u32BufOff + cbWrittenTotal,
-                                        pvBuf, cbBuf);
-        AssertRC(rc2);
+        rc = PDMDevHlpPCIPhysWrite(pThis->CTX_SUFF(pDevIns),
+                                   addrChunk, (uint8_t *)pvBuf + cbWrittenTotal, cbChunk);
+        if (RT_FAILURE(rc))
+            break;
 
 #ifdef VBOX_WITH_STATISTICS
-        STAM_COUNTER_ADD(&pThis->StatBytesWritten, cbBuf);
+        STAM_COUNTER_ADD(&pThis->StatBytesWritten, cbChunk);
 #endif
-        if (cbBlock)
-            RTCircBufReleaseReadBlock(pCircBuf, cbBlock);
+        addrChunk       = (addrChunk + cbChunk) % pBDLE->Desc.u32BufSize;
 
-        Assert(cbToWrite >= cbBuf);
-        cbToWrite -= (uint32_t)cbBuf;
+        Assert(cbLeft  >= cbChunk);
+        cbLeft -= (uint32_t)cbChunk;
 
-        cbWrittenTotal += (uint32_t)cbBuf;
+        cbWrittenTotal += (uint32_t)cbChunk;
     }
 
     if (RT_SUCCESS(rc))
@@ -706,5 +591,56 @@ bool hdaBDLENeedsInterrupt(PHDABDLE pBDLE)
 {
     return (pBDLE->Desc.fFlags & HDA_BDLE_FLAG_IOC);
 }
+
+/**
+ * Sets the virtual device timer to a new expiration time.
+ *
+ * @returns Whether the new expiration time was set or not.
+ * @param   pThis               HDA state.
+ * @param   tsExpire            New (virtual) expiration time to set.
+ * @param   fForce              Whether to force setting the expiration time or not.
+ *
+ * @remark  This function takes all active HDA streams and their
+ *          current timing into account. This is needed to make sure
+ *          that all streams can match their needed timing.
+ *
+ *          To achieve this, the earliest (lowest) timestamp of all
+ *          active streams found will be used for the next scheduling slot.
+ *
+ *          Forcing a new expiration time will override the above mechanism.
+ */
+bool hdaTimerSet(PHDASTATE pThis, uint64_t tsExpire, bool fForce)
+{
+    AssertPtr(pThis->pTimer);
+
+    uint64_t tsExpireMin = tsExpire;
+
+    if (!fForce)
+    {
+        for (uint8_t i = 0; i < HDA_MAX_STREAMS; i++)
+        {
+            PHDASTREAM pStream = &pThis->aStreams[i];
+
+            if (!(HDA_STREAM_REG(pThis, CTL, pStream->u8SD) & HDA_SDCTL_RUN))
+                continue;
+
+            if (hdaStreamTransferIsScheduled(pStream))
+                tsExpireMin = RT_MIN(tsExpireMin, hdaStreamTransferGetNext(pStream));
+        }
+    }
+
+    const uint64_t tsNow = TMTimerGet(pThis->pTimer);
+
+    if (tsExpireMin < tsNow) /* Make sure to not go backwards in time. */
+        tsExpireMin = tsNow;
+
+    Log3Func(("u64Epxire=%RU64 -> u64ExpireMin=%RU64, fForce=%RTbool [%s]\n",
+              tsExpire, tsExpireMin, fForce, tsExpireMin == tsExpire ? "OK" : "DELAYED"));
+
+    int rc2 = TMTimerSet(pThis->pTimer, tsExpireMin);
+    AssertRC(rc2);
+
+    return tsExpireMin == tsExpire;
+}
 #endif /* IN_RING3 */
 
diff --git a/src/VBox/Devices/Audio/DevHDACommon.h b/src/VBox/Devices/Audio/DevHDACommon.h
index 783904f..76c69e2 100644
--- a/src/VBox/Devices/Audio/DevHDACommon.h
+++ b/src/VBox/Devices/Audio/DevHDACommon.h
@@ -88,13 +88,26 @@ AssertCompile(HDA_MAX_SDI <= HDA_MAX_SDO);
 
 /** Default timer frequency (in Hz).
  *
- *  Note: Keep in mind that the Hz rate has nothing to do with samples rates
- *        or DMA / interrupt timing -- it's purely needed in order to drive
- *        the data flow at a constant (and sufficient) rate.
+ * Lowering this value can ask for trouble, as backends then can run
+ * into data underruns. */
+#define HDA_TIMER_HZ_DEFAULT        100
+
+/** Default position adjustment (in audio samples).
+ *
+ * For snd_hda_intel (Linux guests), the first BDL entry always is being used as
+ * so-called BDL adjustment, which can vary, and is being used for chipsets which
+ * misbehave and/or are incorrectly implemented.
+ *
+ * The BDL adjustment entry *always* has the IOC (Interrupt on Completion) bit set.
  *
- *        Lowering this value can ask for trouble, as backends then can run
- *        into data underruns. */
-#define HDA_TIMER_HZ                200
+ * For Intel Baytrail / Braswell implementations the BDL default adjustment is 32 frames, whereas
+ * for ICH / PCH it's only one (1) frame.
+ *
+ * See default_bdl_pos_adj() and snd_hdac_stream_setup_periods() for more information.
+ *
+ * By default we apply some simple heuristics in hdaStreamInit().
+ */
+#define HDA_POS_ADJUST_DEFAULT      0
 
 /** HDA's (fixed) audio frame size in bytes.
  *  We only support 16-bit stereo frames at the moment. */
@@ -230,11 +243,17 @@ extern const HDAREGDESC g_aHdaRegMap[HDA_NUM_REGS];
 
 #define HDA_REG_CORBSIZE            21          /* 0x4E */
 #define HDA_RMX_CORBSIZE            19
+#define HDA_CORBSIZE_SZ_CAP         0xF0
+#define HDA_CORBSIZE_SZ             0x3
 
 /** Number of CORB buffer entries. */
 #define HDA_CORB_SIZE               256
+/** CORB element size (in bytes). */
+#define HDA_CORB_ELEMENT_SIZE       4
 /** Number of RIRB buffer entries. */
 #define HDA_RIRB_SIZE               256
+/** RIRB element size (in bytes). */
+#define HDA_RIRB_ELEMENT_SIZE       8
 
 #define HDA_REG_RIRBLBASE           22          /* 0x50 */
 #define HDA_RMX_RIRBLBASE           20
@@ -585,8 +604,8 @@ bool          hdaWalClkSet(PHDASTATE pThis, uint64_t u64WalClk, bool fForce);
 /** @name DMA utility functions.
  * @{
  */
-int           hdaDMARead(PHDASTATE pThis, PHDASTREAM pStream, uint32_t cbToRead, uint32_t *pcbRead);
-int           hdaDMAWrite(PHDASTATE pThis, PHDASTREAM pStream, uint32_t cbToWrite, uint32_t *pcbWritten);
+int           hdaDMARead(PHDASTATE pThis, PHDASTREAM pStream, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead);
+int           hdaDMAWrite(PHDASTATE pThis, PHDASTREAM pStream, const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten);
 /** @} */
 
 /** @name Register functions.
@@ -608,5 +627,13 @@ bool          hdaBDLENeedsInterrupt(PHDABDLE pBDLE);
 #endif /* IN_RING3 */
 /** @} */
 
+/** @name Device timer functions.
+ * @{
+ */
+#ifdef IN_RING3
+bool          hdaTimerSet(PHDASTATE pThis, uint64_t u64Expire, bool fForce);
+#endif /* IN_RING3 */
+/** @} */
+
 #endif /* !DEV_HDA_H_COMMON */
 
diff --git a/src/VBox/Devices/Audio/DevSB16.cpp b/src/VBox/Devices/Audio/DevSB16.cpp
index 8563725..d6e3dff 100644
--- a/src/VBox/Devices/Audio/DevSB16.cpp
+++ b/src/VBox/Devices/Audio/DevSB16.cpp
@@ -1213,34 +1213,66 @@ static uint8_t sb16MixRegToVol(PSB16STATE pThis, int reg)
     return vol;
 }
 
-static void sb16SetMasterVolume(PSB16STATE pThis)
+/**
+ * Returns the device's current master volume.
+ *
+ * @param   pThis               SB16 state.
+ * @param   pVol                Where to store the master volume information.
+ */
+static void sb16GetMasterVolume(PSB16STATE pThis, PPDMAUDIOVOLUME pVol)
 {
     /* There's no mute switch, only volume controls. */
     uint8_t lvol = sb16MixRegToVol(pThis, 0x30);
     uint8_t rvol = sb16MixRegToVol(pThis, 0x31);
 
-    PDMAUDIOVOLUME Vol = { false /* fMute */, lvol, rvol };
-
-    PSB16DRIVER pDrv;
-    RTListForEach(&pThis->lstDrv, pDrv, SB16DRIVER, Node)
-    {
-        int rc2 = pDrv->pConnector->pfnStreamSetVolume(pDrv->pConnector, pDrv->Out.pStream, &Vol);
-        AssertRC(rc2);
-    }
+    pVol->fMuted = false;
+    pVol->uLeft  = lvol;
+    pVol->uRight = rvol;
 }
 
-static void sb16SetPcmOutVolume(PSB16STATE pThis)
+/**
+ * Returns the device's current output stream volume.
+ *
+ * @param   pThis               SB16 state.
+ * @param   pVol                Where to store the output stream volume information.
+ */
+static void sb16GetPcmOutVolume(PSB16STATE pThis, PPDMAUDIOVOLUME pVol)
 {
     /* There's no mute switch, only volume controls. */
     uint8_t lvol = sb16MixRegToVol(pThis, 0x32);
     uint8_t rvol = sb16MixRegToVol(pThis, 0x33);
 
-    PDMAUDIOVOLUME Vol = { false /* fMute */, lvol, rvol };
+    pVol->fMuted = false;
+    pVol->uLeft  = lvol;
+    pVol->uRight = rvol;
+}
+
+static void sb16UpdateVolume(PSB16STATE pThis)
+{
+    PDMAUDIOVOLUME VolMaster;
+    sb16GetMasterVolume(pThis, &VolMaster);
+
+    PDMAUDIOVOLUME VolOut;
+    sb16GetPcmOutVolume(pThis, &VolOut);
+
+    /* Combine the master + output stream volume. */
+    PDMAUDIOVOLUME VolCombined;
+    RT_ZERO(VolCombined);
+
+    VolCombined.fMuted = VolMaster.fMuted || VolOut.fMuted;
+    if (!VolCombined.fMuted)
+    {
+        VolCombined.uLeft  = (   (VolOut.uLeft    ? VolOut.uLeft     : 1)
+                               * (VolMaster.uLeft ? VolMaster.uLeft  : 1)) / PDMAUDIO_VOLUME_MAX;
+
+        VolCombined.uRight = (  (VolOut.uRight    ? VolOut.uRight    : 1)
+                              * (VolMaster.uRight ? VolMaster.uRight : 1)) / PDMAUDIO_VOLUME_MAX;
+    }
 
     PSB16DRIVER pDrv;
     RTListForEach(&pThis->lstDrv, pDrv, SB16DRIVER, Node)
     {
-        int rc2 = pDrv->pConnector->pfnStreamSetVolume(pDrv->pConnector, pDrv->Out.pStream, &Vol);
+        int rc2 = pDrv->pConnector->pfnStreamSetVolume(pDrv->pConnector, pDrv->Out.pStream, &VolCombined);
         AssertRC(rc2);
     }
 }
@@ -1510,8 +1542,7 @@ static void sb16MixerReset(PSB16STATE pThis)
         pThis->mixer_regs[i] = 0x80;
 
     /* Update the master (mixer) and PCM out volumes. */
-    sb16SetMasterVolume(pThis);
-    sb16SetPcmOutVolume(pThis);
+    sb16UpdateVolume(pThis);
 }
 
 static IO_WRITE_PROTO(mixer_write_indexb)
@@ -1685,12 +1716,11 @@ static IO_WRITE_PROTO(mixer_write_datab)
     pThis->mixer_regs[pThis->mixer_nreg] = val;
 
     /* Update the master (mixer) volume. */
-    if (fUpdateMaster)
-        sb16SetMasterVolume(pThis);
-
-    /* Update the stream (PCM) volume. */
-    if (fUpdateStream)
-        sb16SetPcmOutVolume(pThis);
+    if (   fUpdateMaster
+        || fUpdateStream)
+    {
+        sb16UpdateVolume(pThis);
+    }
 
     return VINF_SUCCESS;
 }
@@ -2183,8 +2213,7 @@ static int sb16Load(PSSMHANDLE pSSM, PSB16STATE pThis)
     }
 
     /* Update the master (mixer) and PCM out volumes. */
-    sb16SetMasterVolume(pThis);
-    sb16SetPcmOutVolume(pThis);
+    sb16UpdateVolume(pThis);
 
     return VINF_SUCCESS;
 }
@@ -2342,6 +2371,8 @@ static int sb16OpenOut(PSB16STATE pThis, PPDMAUDIOSTREAMCFG pCfg)
             rc = rc2;
     }
 
+    sb16UpdateVolume(pThis);
+
     LogFlowFuncLeaveRC(rc);
     return rc;
 }
diff --git a/src/VBox/Devices/Audio/DrvAudio.cpp b/src/VBox/Devices/Audio/DrvAudio.cpp
index 606bcbe..5d959f5 100644
--- a/src/VBox/Devices/Audio/DrvAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvAudio.cpp
@@ -137,12 +137,6 @@ static const char *drvAudioGetConfStr(PCFGMNODE pCfgHandle, const char *pszKey,
 
 # endif /* unused */
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-static char *drvAudioDbgGetFileNameA(PDRVAUDIO pThis, const char *pszPath, const char *pszSuffix);
-static void  drvAudioDbgPCMDelete(PDRVAUDIO pThis, const char *pszPath, const char *pszSuffix);
-static void  drvAudioDbgPCMDump(PDRVAUDIO pThis, const char *pszPath, const char *pszSuffix, const void *pvData, size_t cbData);
-#endif
-
 #ifdef LOG_ENABLED
 /**
  * Converts an audio stream status to a string.
@@ -966,9 +960,8 @@ static DECLCALLBACK(int) drvAudioStreamWrite(PPDMIAUDIOCONNECTOR pInterface, PPD
             break;
         }
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-        drvAudioDbgPCMDump(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "StreamWrite.pcm", pvBuf, cbBuf);
-#endif
+        if (pThis->Dbg.fEnabled)
+            DrvAudioHlpFileWrite(pHstStream->Out.Dbg.pFileStreamWrite, pvBuf, cbBuf, 0 /* fFlags */);
 
 #ifdef VBOX_WITH_STATISTICS
         STAM_COUNTER_ADD(&pThis->Stats.TotalFramesWritten, cfWritten);
@@ -1335,10 +1328,9 @@ static int drvAudioStreamPlayNonInterleaved(PDRVAUDIO pThis,
                     break;
                 }
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-                drvAudioDbgPCMDump(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "PlayNonInterleaved.pcm",
-                                   auBuf, cbPlayed);
-#endif
+                if (pThis->Dbg.fEnabled)
+                    DrvAudioHlpFileWrite(pHstStream->Out.Dbg.pFilePlayNonInterleaved, auBuf, cbPlayed, 0 /* fFlags */);
+
                 AssertMsg(cbPlayed <= cbRead, ("Played more than available (%RU32 available but got %RU32)\n", cbRead, cbPlayed));
 #if 0 /** @todo Also handle mono channels. Needs fixing */
                 AssertMsg(cbPlayed % 2 == 0,
@@ -1638,10 +1630,9 @@ static int drvAudioStreamCaptureNonInterleaved(PDRVAUDIO pThis, PPDMAUDIOSTREAM
         }
         else if (cbCaptured)
         {
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-            drvAudioDbgPCMDump(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "CaptureNonInterleaved.pcm",
-                               auBuf, cbCaptured);
-#endif
+            if (pThis->Dbg.fEnabled)
+                DrvAudioHlpFileWrite(pHstStream->In.Dbg.pFileCaptureNonInterleaved, auBuf, cbCaptured, 0 /* fFlags */);
+
             Assert(cbCaptured <= cbBuf);
             if (cbCaptured > cbBuf) /* Paranoia. */
                 cbCaptured = (uint32_t)cbBuf;
@@ -2094,80 +2085,6 @@ static int drvAudioDevicesEnumerateInternal(PDRVAUDIO pThis, bool fLog, PPDMAUDI
 }
 #endif /* VBOX_WITH_AUDIO_ENUM */
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-/**
- * Returns an unique file name for this given audio connector instance.
- *
- * @return  Allocated file name. Must be free'd using RTStrFree().
- * @param   pThis               Driver instance.
- * @param   pszPath             Path name of the file to delete. The path must exist.
- * @param   pszSuffix           File name suffix to use.
- */
-static char *drvAudioDbgGetFileNameA(PDRVAUDIO pThis, const char *pszPath, const char *pszSuffix)
-{
-    char szFileName[64];
-    RTStrPrintf(szFileName, sizeof(szFileName), "drvAudio%RU32-%s", pThis->pDrvIns->iInstance, pszSuffix);
-
-    char szFilePath[RTPATH_MAX];
-    int rc2 = RTStrCopy(szFilePath, sizeof(szFilePath), pszPath);
-    AssertRC(rc2);
-    rc2 = RTPathAppend(szFilePath, sizeof(szFilePath), szFileName);
-    AssertRC(rc2);
-
-    return RTStrDup(szFilePath);
-}
-
-/**
- * Deletes a PCM audio dump file.
- *
- * @param   pThis               Driver instance.
- * @param   pszPath             Path name of the file to delete. The path must exist.
- * @param   pszSuffix           File name suffix to use.
- */
-static void drvAudioDbgPCMDelete(PDRVAUDIO pThis, const char *pszPath, const char *pszSuffix)
-{
-    char *pszFileName = drvAudioDbgGetFileNameA(pThis, pszPath, pszSuffix);
-    AssertPtr(pszFileName);
-
-    RTFileDelete(pszFileName);
-
-    RTStrFree(pszFileName);
-}
-
-/**
- * Dumps (raw) PCM audio data into a file by appending.
- * Every driver instance will have an own prefix to not introduce writing races.
- *
- * @param   pThis               Driver instance.
- * @param   pszPath             Path name to save file to. The path must exist.
- * @param   pszSuffix           File name suffix to use.
- * @param   pvData              Pointer to PCM data to dump.
- * @param   cbData              Size (in bytes) of PCM data to dump.
- */
-static void drvAudioDbgPCMDump(PDRVAUDIO pThis,
-                               const char *pszPath, const char *pszSuffix, const void *pvData, size_t cbData)
-{
-    if (!pvData || !cbData)
-        return;
-
-    AssertPtr(pThis->pDrvIns);
-
-    char *pszFileName = drvAudioDbgGetFileNameA(pThis, pszPath, pszSuffix);
-    AssertPtr(pszFileName);
-
-    RTFILE fh;
-    int rc2 = RTFileOpen(&fh, pszFileName, RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
-    AssertRC(rc2);
-    if (RT_SUCCESS(rc2))
-    {
-        RTFileWrite(fh, pvData, cbData, NULL);
-        RTFileClose(fh);
-    }
-
-    RTStrFree(pszFileName);
-}
-#endif /* VBOX_AUDIO_DEBUG_DUMP_PCM_DATA */
-
 /**
  * Initializes the host backend and queries its initial configuration.
  * If the host backend fails, VERR_AUDIO_BACKEND_INIT_FAILED will be returned.
@@ -2300,17 +2217,19 @@ static int drvAudioInit(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle)
         RTStrPrintf(pThis->szName, sizeof(pThis->szName), "Untitled");
 
     /* By default we don't enable anything if wrongly / not set-up. */
-    pThis->In.fEnabled  = false;
-    pThis->Out.fEnabled = false;
+    CFGMR3QueryBoolDef(pCfgHandle, "InputEnabled",  &pThis->In.fEnabled,   false);
+    CFGMR3QueryBoolDef(pCfgHandle, "OutputEnabled", &pThis->Out.fEnabled,  false);
 
-    uint64_t u64Temp;
-    rc2 = CFGMR3QueryInteger(pCfgHandle, "InputEnabled",  &u64Temp);
-    if (RT_SUCCESS(rc2))
-        pThis->In.fEnabled  = RT_BOOL(u64Temp);
+    CFGMR3QueryBoolDef(pCfgHandle, "DebugEnabled",      &pThis->Dbg.fEnabled,  false);
+    rc2 = CFGMR3QueryString(pCfgHandle, "DebugPathOut", pThis->Dbg.szPathOut, sizeof(pThis->Dbg.szPathOut));
+    if (   RT_FAILURE(rc2)
+        || !strlen(pThis->Dbg.szPathOut))
+    {
+        RTStrPrintf(pThis->Dbg.szPathOut, sizeof(pThis->Dbg.szPathOut), VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH);
+    }
 
-    rc2 = CFGMR3QueryInteger(pCfgHandle, "OutputEnabled", &u64Temp);
-    if (RT_SUCCESS(rc2))
-        pThis->Out.fEnabled = RT_BOOL(u64Temp);
+    if (pThis->Dbg.fEnabled)
+        LogRel(("Audio: Debugging enabled (audio data written to '%s')\n", pThis->Dbg.szPathOut));
 
     LogRel2(("Audio: Initial status for driver '%s': Input is %s, output is %s\n",
              pThis->szName, pThis->In.fEnabled ? "enabled" : "disabled", pThis->Out.fEnabled ? "enabled" : "disabled"));
@@ -2406,10 +2325,10 @@ static DECLCALLBACK(int) drvAudioStreamRead(PPDMIAUDIOCONNECTOR pInterface, PPDM
 
         if (cReadTotal)
         {
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-            drvAudioDbgPCMDump(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "StreamRead.pcm",
-                               pvBuf, AUDIOMIXBUF_F2B(&pGstStream->MixBuf, cReadTotal));
-#endif
+            if (pThis->Dbg.fEnabled)
+                DrvAudioHlpFileWrite(pHstStream->In.Dbg.pFileStreamRead,
+                                     pvBuf, AUDIOMIXBUF_F2B(&pGstStream->MixBuf, cReadTotal), 0 /* fFlags */);
+
             AudioMixBufFinish(&pGstStream->MixBuf, cReadTotal);
 
             pGstStream->In.tsLastReadMS = RTTimeMilliTS();
@@ -2637,11 +2556,71 @@ static DECLCALLBACK(int) drvAudioStreamCreate(PPDMIAUDIOCONNECTOR pInterface,
 
         if (pCfgHost->enmDir == PDMAUDIODIR_IN)
         {
+            if (pThis->Dbg.fEnabled)
+            {
+                char szFile[RTPATH_MAX + 1];
+
+                int rc2 = DrvAudioHlpGetFileName(szFile, RT_ELEMENTS(szFile), pThis->Dbg.szPathOut, "CaptureNonInterleaved",
+                                                 pThis->pDrvIns->iInstance, PDMAUDIOFILETYPE_WAV, PDMAUDIOFILENAME_FLAG_NONE);
+                if (RT_SUCCESS(rc2))
+                {
+                    rc2 = DrvAudioHlpFileCreate(PDMAUDIOFILETYPE_WAV, szFile, PDMAUDIOFILE_FLAG_NONE,
+                                                &pHstStrm->In.Dbg.pFileCaptureNonInterleaved);
+                    if (RT_SUCCESS(rc2))
+                        rc2 = DrvAudioHlpFileOpen(pHstStrm->In.Dbg.pFileCaptureNonInterleaved, PDMAUDIOFILE_DEFAULT_OPEN_FLAGS,
+                                                  &pHstStrm->Cfg.Props);
+                }
+
+                if (RT_SUCCESS(rc2))
+                {
+                    rc2 = DrvAudioHlpGetFileName(szFile, RT_ELEMENTS(szFile), pThis->Dbg.szPathOut, "StreamRead",
+                                                 pThis->pDrvIns->iInstance, PDMAUDIOFILETYPE_WAV, PDMAUDIOFILENAME_FLAG_NONE);
+                    if (RT_SUCCESS(rc2))
+                    {
+                        rc2 = DrvAudioHlpFileCreate(PDMAUDIOFILETYPE_WAV, szFile, PDMAUDIOFILE_FLAG_NONE,
+                                                    &pHstStrm->In.Dbg.pFileStreamRead);
+                        if (RT_SUCCESS(rc2))
+                            rc2 = DrvAudioHlpFileOpen(pHstStrm->In.Dbg.pFileStreamRead, PDMAUDIOFILE_DEFAULT_OPEN_FLAGS,
+                                                      &pHstStrm->Cfg.Props);
+                    }
+                }
+            }
+
             if (pThis->In.cStreamsFree)
                 pThis->In.cStreamsFree--;
         }
         else /* Out */
         {
+            if (pThis->Dbg.fEnabled)
+            {
+                char szFile[RTPATH_MAX + 1];
+
+                int rc2 = DrvAudioHlpGetFileName(szFile, RT_ELEMENTS(szFile), pThis->Dbg.szPathOut, "PlayNonInterleaved",
+                                                 pThis->pDrvIns->iInstance, PDMAUDIOFILETYPE_WAV, PDMAUDIOFILENAME_FLAG_NONE);
+                if (RT_SUCCESS(rc2))
+                {
+                    rc2 = DrvAudioHlpFileCreate(PDMAUDIOFILETYPE_WAV, szFile, PDMAUDIOFILE_FLAG_NONE,
+                                                &pHstStrm->Out.Dbg.pFilePlayNonInterleaved);
+                    if (RT_SUCCESS(rc2))
+                        rc = DrvAudioHlpFileOpen(pHstStrm->Out.Dbg.pFilePlayNonInterleaved, PDMAUDIOFILE_DEFAULT_OPEN_FLAGS,
+                                                 &pHstStrm->Cfg.Props);
+                }
+
+                if (RT_SUCCESS(rc2))
+                {
+                    rc2 = DrvAudioHlpGetFileName(szFile, RT_ELEMENTS(szFile), pThis->Dbg.szPathOut, "StreamWrite",
+                                                 pThis->pDrvIns->iInstance, PDMAUDIOFILETYPE_WAV, PDMAUDIOFILENAME_FLAG_NONE);
+                    if (RT_SUCCESS(rc2))
+                    {
+                        rc2 = DrvAudioHlpFileCreate(PDMAUDIOFILETYPE_WAV, szFile, PDMAUDIOFILE_FLAG_NONE,
+                                                    &pHstStrm->Out.Dbg.pFileStreamWrite);
+                        if (RT_SUCCESS(rc2))
+                            rc2 = DrvAudioHlpFileOpen(pHstStrm->Out.Dbg.pFileStreamWrite, PDMAUDIOFILE_DEFAULT_OPEN_FLAGS,
+                                                      &pHstStrm->Cfg.Props);
+                    }
+                }
+            }
+
             if (pThis->Out.cStreamsFree)
                 pThis->Out.cStreamsFree--;
         }
@@ -2970,18 +2949,31 @@ static DECLCALLBACK(int) drvAudioStreamDestroy(PPDMIAUDIOCONNECTOR pInterface, P
             rc = drvAudioStreamUninitInternal(pThis, pHstStream);
             if (RT_SUCCESS(rc))
             {
-#ifdef VBOX_WITH_STATISTICS
                 if (pHstStream->enmDir == PDMAUDIODIR_IN)
                 {
+#ifdef VBOX_WITH_STATISTICS
                     PDMDrvHlpSTAMDeregister(pThis->pDrvIns, &pHstStream->In.StatFramesCaptured);
+#endif
+                    if (pThis->Dbg.fEnabled)
+                    {
+                        DrvAudioHlpFileDestroy(pHstStream->In.Dbg.pFileCaptureNonInterleaved);
+                        DrvAudioHlpFileDestroy(pHstStream->In.Dbg.pFileStreamRead);
+                    }
                 }
                 else if (pHstStream->enmDir == PDMAUDIODIR_OUT)
                 {
+#ifdef VBOX_WITH_STATISTICS
                     PDMDrvHlpSTAMDeregister(pThis->pDrvIns, &pHstStream->Out.StatFramesPlayed);
+#endif
+                    if (pThis->Dbg.fEnabled)
+                    {
+                        DrvAudioHlpFileDestroy(pHstStream->Out.Dbg.pFilePlayNonInterleaved);
+                        DrvAudioHlpFileDestroy(pHstStream->Out.Dbg.pFileStreamWrite);
+                    }
                 }
                 else
                     AssertFailed();
-#endif
+
                 RTListNodeRemove(&pHstStream->Node);
 
                 drvAudioStreamFree(pHstStream);
@@ -3359,13 +3351,6 @@ static DECLCALLBACK(int) drvAudioConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, u
         PDMDrvHlpSTAMRegProfileAdvEx(pDrvIns, &pThis->Stats.DelayOut,          "DelayOut",
                                      STAMUNIT_NS_PER_CALL, "Profiling of output data processing.");
 #endif
-
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-        drvAudioDbgPCMDelete(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "StreamRead.pcm");
-        drvAudioDbgPCMDelete(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "StreamWrite.pcm");
-        drvAudioDbgPCMDelete(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "PlayNonInterleaved.pcm");
-        drvAudioDbgPCMDelete(pThis, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH, "CaptureNonInterleaved.pcm");
-#endif
     }
 
     LogFlowFuncLeaveRC(rc);
diff --git a/src/VBox/Devices/Audio/DrvAudio.h b/src/VBox/Devices/Audio/DrvAudio.h
index 33080bf..4ed2c00 100644
--- a/src/VBox/Devices/Audio/DrvAudio.h
+++ b/src/VBox/Devices/Audio/DrvAudio.h
@@ -29,14 +29,6 @@
 #include <VBox/vmm/pdm.h>
 #include <VBox/vmm/pdmaudioifs.h>
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-# ifdef RT_OS_WINDOWS
-#  define VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "c:\\temp\\"
-# else
-#  define VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "/tmp/"
-# endif
-#endif
-
 typedef enum
 {
     AUD_OPT_INT,
@@ -133,11 +125,19 @@ typedef struct DRVAUDIO
         bool                fEnabled;
         /** Max. number of free output streams.
          *  UINT32_MAX for unlimited streams. */
-    uint32_t                cStreamsFree;
+        uint32_t            cStreamsFree;
 #ifdef VBOX_WITH_AUDIO_CALLBACKS
         RTLISTANCHOR        lstCB;
 #endif
     } Out;
+    struct
+    {
+        /** Whether audio debugging is enabled or not. */
+        bool                    fEnabled;
+        /** Where to store the debugging files.
+         *  Defaults to VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH if not set. */
+        char                    szPathOut[RTPATH_MAX + 1];
+    } Dbg;
 } DRVAUDIO, *PDRVAUDIO;
 
 /** Makes a PDRVAUDIO out of a PPDMIAUDIOCONNECTOR. */
@@ -166,7 +166,7 @@ const char *DrvAudioHlpStreamCmdToStr(PDMAUDIOSTREAMCMD enmCmd);
 PDMAUDIOFMT DrvAudioHlpStrToAudFmt(const char *pszFmt);
 
 int DrvAudioHlpSanitizeFileName(char *pszPath, size_t cbPath);
-int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, const char *pszName, PDMAUDIOFILETYPE enmType);
+int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, const char *pszName, uint32_t uInstance, PDMAUDIOFILETYPE enmType, PDMAUDIOFILENAMEFLAGS fFlags);
 
 PPDMAUDIODEVICE DrvAudioHlpDeviceAlloc(size_t cbData);
 void DrvAudioHlpDeviceFree(PPDMAUDIODEVICE pDev);
@@ -187,10 +187,13 @@ const char *DrvAudioHlpAudDirToStr(PDMAUDIODIR enmDir);
 const char *DrvAudioHlpAudMixerCtlToStr(PDMAUDIOMIXERCTL enmMixerCtl);
 char *DrvAudioHlpAudDevFlagsToStrA(PDMAUDIODEVFLAG fFlags);
 
-int DrvAudioHlpWAVFileOpen(PPDMAUDIOFILE pFile, const char *pszFile, uint32_t fOpen, const PPDMAUDIOPCMPROPS pProps, PDMAUDIOFILEFLAGS fFlags);
-int DrvAudioHlpWAVFileClose(PPDMAUDIOFILE pFile);
-size_t DrvAudioHlpWAVFileGetDataSize(PPDMAUDIOFILE pFile);
-int DrvAudioHlpWAVFileWrite(PPDMAUDIOFILE pFile, const void *pvBuf, size_t cbBuf, uint32_t fFlags);
+int DrvAudioHlpFileCreate(PDMAUDIOFILETYPE enmType, const char *pszFile, PDMAUDIOFILEFLAGS fFlags, PPDMAUDIOFILE *ppFile);
+void DrvAudioHlpFileDestroy(PPDMAUDIOFILE pFile);
+int DrvAudioHlpFileOpen(PPDMAUDIOFILE pFile, uint32_t fOpen, const PPDMAUDIOPCMPROPS pProps);
+int DrvAudioHlpFileClose(PPDMAUDIOFILE pFile);
+int DrvAudioHlpFileDelete(PPDMAUDIOFILE pFile);
+size_t DrvAudioHlpFileGetDataSize(PPDMAUDIOFILE pFile);
+int DrvAudioHlpFileWrite(PPDMAUDIOFILE pFile, const void *pvBuf, size_t cbBuf, uint32_t fFlags);
 
 #define AUDIO_MAKE_FOURCC(c0, c1, c2, c3) RT_H2LE_U32_C(RT_MAKE_U32_FROM_U8(c0, c1, c2, c3))
 
diff --git a/src/VBox/Devices/Audio/DrvAudioCommon.cpp b/src/VBox/Devices/Audio/DrvAudioCommon.cpp
index b27b710..ddb3a3b 100644
--- a/src/VBox/Devices/Audio/DrvAudioCommon.cpp
+++ b/src/VBox/Devices/Audio/DrvAudioCommon.cpp
@@ -197,6 +197,28 @@ void DrvAudioHlpClearBuf(const PPDMAUDIOPCMPROPS pPCMProps, void *pvBuf, size_t
 }
 
 /**
+ * Returns an unique file name for this given audio connector instance.
+ *
+ * @return  Allocated file name. Must be free'd using RTStrFree().
+ * @param   uInstance           Driver / device instance.
+ * @param   pszPath             Path name of the file to delete. The path must exist.
+ * @param   pszSuffix           File name suffix to use.
+ */
+char *DrvAudioDbgGetFileNameA(uint8_t uInstance, const char *pszPath, const char *pszSuffix)
+{
+    char szFileName[64];
+    RTStrPrintf(szFileName, sizeof(szFileName), "drvAudio%RU8-%s", uInstance, pszSuffix);
+
+    char szFilePath[RTPATH_MAX];
+    int rc2 = RTStrCopy(szFilePath, sizeof(szFilePath), pszPath);
+    AssertRC(rc2);
+    rc2 = RTPathAppend(szFilePath, sizeof(szFilePath), szFileName);
+    AssertRC(rc2);
+
+    return RTStrDup(szFilePath);
+}
+
+/**
  * Allocates an audio device.
  *
  * @returns Newly allocated audio device, or NULL if failed.
@@ -1051,22 +1073,26 @@ int DrvAudioHlpSanitizeFileName(char *pszPath, size_t cbPath)
  * @param   pszFile             Where to store the constructed file name.
  * @param   cchFile             Size (in characters) of the file name buffer.
  * @param   pszPath             Base path to use.
- * @param   pszName             A name for better identifying the file. Optional.
+ * @param   pszName             A name for better identifying the file.
+ * @param   uInstance           Device / driver instance which is using this file.
  * @param   enmType             Audio file type to construct file name for.
+ * @param   fFlags              File naming flags.
  */
-int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, const char *pszName, PDMAUDIOFILETYPE enmType)
+int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, const char *pszName,
+                           uint32_t uInstance, PDMAUDIOFILETYPE enmType, PDMAUDIOFILENAMEFLAGS fFlags)
 {
     AssertPtrReturn(pszFile, VERR_INVALID_POINTER);
     AssertReturn(cchFile,    VERR_INVALID_PARAMETER);
     AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
-    /* pszName is optional. */
+    AssertPtrReturn(pszName, VERR_INVALID_POINTER);
+    /** @todo Validate fFlags. */
 
     int rc;
 
     do
     {
-        char szFilePath[RTPATH_MAX];
-        RTStrPrintf(szFilePath, sizeof(szFilePath), "%s", pszPath);
+        char szFilePath[RTPATH_MAX + 1];
+        RTStrPrintf2(szFilePath, sizeof(szFilePath), "%s", pszPath);
 
         /* Create it when necessary. */
         if (!RTDirExists(szFilePath))
@@ -1076,49 +1102,62 @@ int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, c
                 break;
         }
 
-        /* The actually drop directory consist of the current time stamp and a
-         * unique number when necessary. */
-        char pszTime[64];
-        RTTIMESPEC time;
-        if (!RTTimeSpecToString(RTTimeNow(&time), pszTime, sizeof(pszTime)))
+        if (fFlags & PDMAUDIOFILENAME_FLAG_TS)
         {
-            rc = VERR_BUFFER_OVERFLOW;
-            break;
-        }
-
-        rc = DrvAudioHlpSanitizeFileName(pszTime, sizeof(pszTime));
-        if (RT_FAILURE(rc))
-            break;
+            char szTime[64];
+            RTTIMESPEC time;
+            if (!RTTimeSpecToString(RTTimeNow(&time), szTime, sizeof(szTime)))
+            {
+                rc = VERR_BUFFER_OVERFLOW;
+                break;
+            }
 
-        rc = RTPathAppend(szFilePath, sizeof(szFilePath), pszTime);
-        if (RT_FAILURE(rc))
-            break;
+            rc = DrvAudioHlpSanitizeFileName(szTime, sizeof(szTime));
+            if (RT_FAILURE(rc))
+                break;
 
-        if (pszName) /* Optional name given? */
-        {
-            rc = RTStrCat(szFilePath, sizeof(szFilePath), "-");
+            rc = RTStrCat(szFilePath, sizeof(szFilePath), szTime);
             if (RT_FAILURE(rc))
                 break;
 
-            rc = RTStrCat(szFilePath, sizeof(szFilePath), pszName);
+            rc = RTStrCat(szFilePath, sizeof(szFilePath), "-");
             if (RT_FAILURE(rc))
                 break;
         }
 
+        rc = RTStrCat(szFilePath, sizeof(szFilePath), pszName);
+        if (RT_FAILURE(rc))
+            break;
+
+        rc = RTStrCat(szFilePath, sizeof(szFilePath), "-");
+        if (RT_FAILURE(rc))
+            break;
+
+        char szInst[16];
+        RTStrPrintf2(szInst, sizeof(szInst), "%RU32", uInstance);
+        rc = RTStrCat(szFilePath, sizeof(szFilePath), szInst);
+        if (RT_FAILURE(rc))
+            break;
+
         switch (enmType)
         {
+            case PDMAUDIOFILETYPE_RAW:
+                rc = RTStrCat(szFilePath, sizeof(szFilePath), ".pcm");
+                break;
+
             case PDMAUDIOFILETYPE_WAV:
                 rc = RTStrCat(szFilePath, sizeof(szFilePath), ".wav");
                 break;
 
             default:
                 AssertFailedStmt(rc = VERR_NOT_IMPLEMENTED);
+                break;
         }
 
         if (RT_FAILURE(rc))
             break;
 
-        RTStrPrintf(pszFile, cchFile, "%s", szFilePath);
+        RTStrPrintf2(pszFile, cchFile, "%s", szFilePath);
 
     } while (0);
 
@@ -1127,135 +1166,270 @@ int DrvAudioHlpGetFileName(char *pszFile, size_t cchFile, const char *pszPath, c
 }
 
 /**
- * Opens or creates a wave (.WAV) file.
+ * Creates an audio file.
  *
  * @returns IPRT status code.
- * @param   pFile               Pointer to audio file handle to use.
+ * @param   enmType             Audio file type to open / create.
  * @param   pszFile             File path of file to open or create.
+ * @param   fFlags              Audio file flags.
+ * @param   ppFile              Where to store the created audio file handle.
+ *                              Needs to be destroyed with DrvAudioHlpFileDestroy().
+ */
+int DrvAudioHlpFileCreate(PDMAUDIOFILETYPE enmType, const char *pszFile, PDMAUDIOFILEFLAGS fFlags, PPDMAUDIOFILE *ppFile)
+{
+    AssertPtrReturn(pszFile, VERR_INVALID_POINTER);
+    /** @todo Validate fFlags. */
+
+    PPDMAUDIOFILE pFile = (PPDMAUDIOFILE)RTMemAlloc(sizeof(PDMAUDIOFILE));
+    if (!pFile)
+        return VERR_NO_MEMORY;
+
+    int rc = VINF_SUCCESS;
+
+    switch (enmType)
+    {
+        case PDMAUDIOFILETYPE_RAW:
+        case PDMAUDIOFILETYPE_WAV:
+            pFile->enmType = enmType;
+            break;
+
+        default:
+            rc = VERR_INVALID_PARAMETER;
+            break;
+    }
+
+    if (RT_SUCCESS(rc))
+    {
+        RTStrPrintf(pFile->szName, RT_ELEMENTS(pFile->szName), "%s", pszFile);
+        pFile->fFlags = fFlags;
+        pFile->pvData = NULL;
+        pFile->cbData = 0;
+    }
+
+    if (RT_FAILURE(rc))
+    {
+        RTMemFree(pFile);
+        pFile = NULL;
+    }
+    else
+        *ppFile = pFile;
+
+    return rc;
+}
+
+/**
+ * Destroys a formerly created audio file.
+ *
+ * @param   pFile               Audio file (object) to destroy.
+ */
+void DrvAudioHlpFileDestroy(PPDMAUDIOFILE pFile)
+{
+    if (!pFile)
+        return;
+
+    DrvAudioHlpFileClose(pFile);
+
+    RTMemFree(pFile);
+    pFile = NULL;
+}
+
+/**
+ * Opens or creates an audio file.
+ *
+ * @returns IPRT status code.
+ * @param   pFile               Pointer to audio file handle to use.
  * @param   fOpen               Open flags.
+ *                              Use PDMAUDIOFILE_DEFAULT_OPEN_FLAGS for the default open flags.
  * @param   pProps              PCM properties to use.
- * @param   fFlags              Audio file flags.
  */
-int DrvAudioHlpWAVFileOpen(PPDMAUDIOFILE pFile, const char *pszFile, uint32_t fOpen, const PPDMAUDIOPCMPROPS pProps,
-                           PDMAUDIOFILEFLAGS fFlags)
+int DrvAudioHlpFileOpen(PPDMAUDIOFILE pFile, uint32_t fOpen, const PPDMAUDIOPCMPROPS pProps)
 {
     AssertPtrReturn(pFile,   VERR_INVALID_POINTER);
-    AssertPtrReturn(pszFile, VERR_INVALID_POINTER);
     /** @todo Validate fOpen flags. */
     AssertPtrReturn(pProps,  VERR_INVALID_POINTER);
-    RT_NOREF(fFlags); /** @todo Validate fFlags flags. */
 
-    Assert(pProps->cChannels);
-    Assert(pProps->uHz);
-    Assert(pProps->cBits);
+    int rc;
 
-    pFile->pvData = (PAUDIOWAVFILEDATA)RTMemAllocZ(sizeof(AUDIOWAVFILEDATA));
-    if (!pFile->pvData)
-        return VERR_NO_MEMORY;
-    pFile->cbData = sizeof(PAUDIOWAVFILEDATA);
-
-    PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
-    AssertPtr(pData);
-
-    /* Header. */
-    pData->Hdr.u32RIFF          = AUDIO_MAKE_FOURCC('R','I','F','F');
-    pData->Hdr.u32Size          = 36;
-    pData->Hdr.u32WAVE          = AUDIO_MAKE_FOURCC('W','A','V','E');
-
-    pData->Hdr.u32Fmt           = AUDIO_MAKE_FOURCC('f','m','t',' ');
-    pData->Hdr.u32Size1         = 16; /* Means PCM. */
-    pData->Hdr.u16AudioFormat   = 1;  /* PCM, linear quantization. */
-    pData->Hdr.u16NumChannels   = pProps->cChannels;
-    pData->Hdr.u32SampleRate    = pProps->uHz;
-    pData->Hdr.u32ByteRate      = DrvAudioHlpCalcBitrate(pProps->cBits, pProps->uHz, pProps->cChannels) / 8;
-    pData->Hdr.u16BlockAlign    = pProps->cChannels * pProps->cBits / 8;
-    pData->Hdr.u16BitsPerSample = pProps->cBits;
-
-    /* Data chunk. */
-    pData->Hdr.u32ID2           = AUDIO_MAKE_FOURCC('d','a','t','a');
-    pData->Hdr.u32Size2         = 0;
-
-    int rc = RTFileOpen(&pFile->hFile, pszFile, fOpen);
-    if (RT_SUCCESS(rc))
+    if (pFile->enmType == PDMAUDIOFILETYPE_RAW)
     {
-        rc = RTFileWrite(pFile->hFile, &pData->Hdr, sizeof(pData->Hdr), NULL);
-        if (RT_FAILURE(rc))
+        rc = RTFileOpen(&pFile->hFile, pFile->szName, fOpen);
+    }
+    else if (pFile->enmType == PDMAUDIOFILETYPE_WAV)
+    {
+        Assert(pProps->cChannels);
+        Assert(pProps->uHz);
+        Assert(pProps->cBits);
+
+        pFile->pvData = (PAUDIOWAVFILEDATA)RTMemAllocZ(sizeof(AUDIOWAVFILEDATA));
+        if (pFile->pvData)
         {
-            RTFileClose(pFile->hFile);
-            pFile->hFile = NIL_RTFILE;
+            pFile->cbData = sizeof(PAUDIOWAVFILEDATA);
+
+            PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
+            AssertPtr(pData);
+
+            /* Header. */
+            pData->Hdr.u32RIFF          = AUDIO_MAKE_FOURCC('R','I','F','F');
+            pData->Hdr.u32Size          = 36;
+            pData->Hdr.u32WAVE          = AUDIO_MAKE_FOURCC('W','A','V','E');
+
+            pData->Hdr.u32Fmt           = AUDIO_MAKE_FOURCC('f','m','t',' ');
+            pData->Hdr.u32Size1         = 16; /* Means PCM. */
+            pData->Hdr.u16AudioFormat   = 1;  /* PCM, linear quantization. */
+            pData->Hdr.u16NumChannels   = pProps->cChannels;
+            pData->Hdr.u32SampleRate    = pProps->uHz;
+            pData->Hdr.u32ByteRate      = DrvAudioHlpCalcBitrate(pProps->cBits, pProps->uHz, pProps->cChannels) / 8;
+            pData->Hdr.u16BlockAlign    = pProps->cChannels * pProps->cBits / 8;
+            pData->Hdr.u16BitsPerSample = pProps->cBits;
+
+            /* Data chunk. */
+            pData->Hdr.u32ID2           = AUDIO_MAKE_FOURCC('d','a','t','a');
+            pData->Hdr.u32Size2         = 0;
+
+            rc = RTFileOpen(&pFile->hFile, pFile->szName, fOpen);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTFileWrite(pFile->hFile, &pData->Hdr, sizeof(pData->Hdr), NULL);
+                if (RT_FAILURE(rc))
+                {
+                    RTFileClose(pFile->hFile);
+                    pFile->hFile = NIL_RTFILE;
+                }
+            }
+
+            if (RT_FAILURE(rc))
+            {
+                RTMemFree(pFile->pvData);
+                pFile->pvData = NULL;
+                pFile->cbData = 0;
+            }
         }
+        else
+            rc = VERR_NO_MEMORY;
     }
+    else
+        rc = VERR_INVALID_PARAMETER;
 
     if (RT_SUCCESS(rc))
     {
-        pFile->enmType = PDMAUDIOFILETYPE_WAV;
-
-        RTStrPrintf(pFile->szName, RT_ELEMENTS(pFile->szName), "%s", pszFile);
+        LogRel2(("Audio: Opened file '%s'\n", pFile->szName));
     }
     else
-    {
-        RTMemFree(pFile->pvData);
-        pFile->pvData = NULL;
-        pFile->cbData = 0;
-    }
+        LogRel(("Audio: Failed opening file '%s', rc=%Rrc\n", pFile->szName, rc));
 
     return rc;
 }
 
 /**
- * Closes a wave (.WAV) audio file.
+ * Closes an audio file.
  *
  * @returns IPRT status code.
  * @param   pFile               Audio file handle to close.
  */
-int DrvAudioHlpWAVFileClose(PPDMAUDIOFILE pFile)
+int DrvAudioHlpFileClose(PPDMAUDIOFILE pFile)
 {
     AssertPtrReturn(pFile, VERR_INVALID_POINTER);
 
-    Assert(pFile->enmType == PDMAUDIOFILETYPE_WAV);
+    size_t cbSize = DrvAudioHlpFileGetDataSize(pFile);
+
+    int rc = VINF_SUCCESS;
 
-    if (pFile->hFile != NIL_RTFILE)
+    if (pFile->enmType == PDMAUDIOFILETYPE_RAW)
     {
-        PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
-        AssertPtr(pData);
+        if (RTFileIsValid(pFile->hFile))
+            rc = RTFileClose(pFile->hFile);
+    }
+    else if (pFile->enmType == PDMAUDIOFILETYPE_WAV)
+    {
+        if (RTFileIsValid(pFile->hFile))
+        {
+            PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
+            if (pData) /* The .WAV file data only is valid when a file actually has been created. */
+            {
+                /* Update the header with the current data size. */
+                RTFileWriteAt(pFile->hFile, 0, &pData->Hdr, sizeof(pData->Hdr), NULL);
+            }
 
-        /* Update the header with the current data size. */
-        RTFileWriteAt(pFile->hFile, 0, &pData->Hdr, sizeof(pData->Hdr), NULL);
+            rc = RTFileClose(pFile->hFile);
+        }
 
-        RTFileClose(pFile->hFile);
-        pFile->hFile = NIL_RTFILE;
+        if (pFile->pvData)
+        {
+            RTMemFree(pFile->pvData);
+            pFile->pvData = NULL;
+        }
     }
+    else
+        AssertFailedStmt(rc = VERR_NOT_IMPLEMENTED);
 
-    if (pFile->pvData)
+    if (   RT_SUCCESS(rc)
+        && !cbSize
+        && !(pFile->fFlags & PDMAUDIOFILE_FLAG_KEEP_IF_EMPTY))
     {
-        RTMemFree(pFile->pvData);
-        pFile->pvData = NULL;
+        rc = DrvAudioHlpFileDelete(pFile);
     }
 
-    pFile->cbData  = 0;
-    pFile->enmType = PDMAUDIOFILETYPE_UNKNOWN;
+    pFile->cbData = 0;
 
-    return VINF_SUCCESS;
+    if (RT_SUCCESS(rc))
+    {
+        pFile->hFile = NIL_RTFILE;
+        LogRel2(("Audio: Closed file '%s' (%zu bytes)\n", pFile->szName, cbSize));
+    }
+    else
+        LogRel(("Audio: Failed closing file '%s', rc=%Rrc\n", pFile->szName, rc));
+
+    return rc;
 }
 
 /**
- * Returns the raw PCM audio data size of a wave file.
- * This does *not* include file headers and other data which does
- * not belong to the actual PCM audio data.
+ * Deletes an audio file.
+ *
+ * @returns IPRT status code.
+ * @param   pFile               Audio file handle to delete.
+ */
+int DrvAudioHlpFileDelete(PPDMAUDIOFILE pFile)
+{
+    AssertPtrReturn(pFile, VERR_INVALID_POINTER);
+
+    int rc = RTFileDelete(pFile->szName);
+
+    if (rc == VERR_FILE_NOT_FOUND) /* Don't bitch if the file is not around (anymore). */
+        rc = VINF_SUCCESS;
+
+    if (RT_FAILURE(rc))
+        LogRel(("Audio: Failed deleting file '%s', rc=%Rrc\n", pFile->szName, rc));
+
+    return rc;
+}
+
+/**
+ * Returns the raw audio data size of an audio file.
+ *
+ * Note: This does *not* include file headers and other data which does
+ *       not belong to the actual PCM audio data.
  *
  * @returns Size (in bytes) of the raw PCM audio data.
  * @param   pFile               Audio file handle to retrieve the audio data size for.
  */
-size_t DrvAudioHlpWAVFileGetDataSize(PPDMAUDIOFILE pFile)
+size_t DrvAudioHlpFileGetDataSize(PPDMAUDIOFILE pFile)
 {
     AssertPtrReturn(pFile, 0);
 
-    Assert(pFile->enmType == PDMAUDIOFILETYPE_WAV);
+    size_t cbSize = 0;
 
-    PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
-    AssertPtr(pData);
+    if (pFile->enmType == PDMAUDIOFILETYPE_RAW)
+    {
+        cbSize = RTFileTell(pFile->hFile);
+    }
+    else if (pFile->enmType == PDMAUDIOFILETYPE_WAV)
+    {
+        PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
+        if (pData) /* The .WAV file data only is valid when a file actually has been created. */
+            cbSize = pData->Hdr.u32Size2;
+    }
 
-    return pData->Hdr.u32Size2;
+    return cbSize;
 }
 
 /**
@@ -1267,27 +1441,36 @@ size_t DrvAudioHlpWAVFileGetDataSize(PPDMAUDIOFILE pFile)
  * @param   cbBuf               Size (in bytes) of audio data to write.
  * @param   fFlags              Additional write flags. Not being used at the moment and must be 0.
  */
-int DrvAudioHlpWAVFileWrite(PPDMAUDIOFILE pFile, const void *pvBuf, size_t cbBuf, uint32_t fFlags)
+int DrvAudioHlpFileWrite(PPDMAUDIOFILE pFile, const void *pvBuf, size_t cbBuf, uint32_t fFlags)
 {
     AssertPtrReturn(pFile, VERR_INVALID_POINTER);
     AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
 
     AssertReturn(fFlags == 0, VERR_INVALID_PARAMETER); /** @todo fFlags are currently not implemented. */
 
-    Assert(pFile->enmType == PDMAUDIOFILETYPE_WAV);
-
     if (!cbBuf)
         return VINF_SUCCESS;
 
-    PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
-    AssertPtr(pData);
+    int rc;
 
-    int rc = RTFileWrite(pFile->hFile, pvBuf, cbBuf, NULL);
-    if (RT_SUCCESS(rc))
+    if (pFile->enmType == PDMAUDIOFILETYPE_RAW)
     {
-        pData->Hdr.u32Size  += (uint32_t)cbBuf;
-        pData->Hdr.u32Size2 += (uint32_t)cbBuf;
+        rc = RTFileWrite(pFile->hFile, pvBuf, cbBuf, NULL);
     }
+    else if (pFile->enmType == PDMAUDIOFILETYPE_WAV)
+    {
+        PAUDIOWAVFILEDATA pData = (PAUDIOWAVFILEDATA)pFile->pvData;
+        AssertPtr(pData);
+
+        rc = RTFileWrite(pFile->hFile, pvBuf, cbBuf, NULL);
+        if (RT_SUCCESS(rc))
+        {
+            pData->Hdr.u32Size  += (uint32_t)cbBuf;
+            pData->Hdr.u32Size2 += (uint32_t)cbBuf;
+        }
+    }
+    else
+        rc = VERR_NOT_SUPPORTED;
 
     return rc;
 }
diff --git a/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp b/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp
index 50f74f9..df2195c 100644
--- a/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp
@@ -955,35 +955,42 @@ static int alsaStreamResume(snd_pcm_t *phPCM)
 }
 
 
-static int drvHostALSAAudioStreamCtl(snd_pcm_t *phPCM, bool fPause)
+static int drvHostALSAAudioStreamCtl(PALSAAUDIOSTREAM pStreamALSA, bool fPause)
 {
     int rc = VINF_SUCCESS;
 
+    const bool fInput = pStreamALSA->pCfg->enmDir == PDMAUDIODIR_IN;
+
     int err;
     if (fPause)
     {
-        err = snd_pcm_drop(phPCM);
+        err = snd_pcm_drop(pStreamALSA->phPCM);
         if (err < 0)
         {
-            LogRel(("ALSA: Error stopping stream %p: %s\n", phPCM, snd_strerror(err)));
+            LogRel(("ALSA: Error stopping %s stream: %s\n", fInput ? "input" : "output", snd_strerror(err)));
             rc = VERR_ACCESS_DENIED; /** @todo Find a better rc. */
         }
     }
     else
     {
-        err = snd_pcm_prepare(phPCM);
+        err = snd_pcm_prepare(pStreamALSA->phPCM);
         if (err < 0)
         {
-            LogRel(("ALSA: Error preparing stream %p: %s\n", phPCM, snd_strerror(err)));
+            LogRel(("ALSA: Error preparing %s stream: %s\n", fInput ? "input" : "output", snd_strerror(err)));
             rc = VERR_ACCESS_DENIED; /** @todo Find a better rc. */
         }
         else
         {
-            err = snd_pcm_start(phPCM);
-            if (err < 0)
+            Assert(snd_pcm_state(pStreamALSA->phPCM) == SND_PCM_STATE_PREPARED);
+
+            if (fInput) /* Only start the PCM stream for input streams. */
             {
-                LogRel(("ALSA: Error starting stream %p: %s\n", phPCM, snd_strerror(err)));
-                rc = VERR_ACCESS_DENIED; /** @todo Find a better rc. */
+                err = snd_pcm_start(pStreamALSA->phPCM);
+                if (err < 0)
+                {
+                    LogRel(("ALSA: Error starting input stream: %s\n", snd_strerror(err)));
+                    rc = VERR_ACCESS_DENIED; /** @todo Find a better rc. */
+                }
             }
         }
     }
@@ -1421,12 +1428,12 @@ static int alsaControlStreamIn(PALSAAUDIOSTREAM pStreamALSA, PDMAUDIOSTREAMCMD e
     {
         case PDMAUDIOSTREAMCMD_ENABLE:
         case PDMAUDIOSTREAMCMD_RESUME:
-            rc = drvHostALSAAudioStreamCtl(pStreamALSA->phPCM, false /* fStop */);
+            rc = drvHostALSAAudioStreamCtl(pStreamALSA, false /* fStop */);
             break;
 
         case PDMAUDIOSTREAMCMD_DISABLE:
         case PDMAUDIOSTREAMCMD_PAUSE:
-            rc = drvHostALSAAudioStreamCtl(pStreamALSA->phPCM, true /* fStop */);
+            rc = drvHostALSAAudioStreamCtl(pStreamALSA, true /* fStop */);
             break;
 
         default:
@@ -1446,12 +1453,12 @@ static int alsaControlStreamOut(PALSAAUDIOSTREAM pStreamALSA, PDMAUDIOSTREAMCMD
     {
         case PDMAUDIOSTREAMCMD_ENABLE:
         case PDMAUDIOSTREAMCMD_RESUME:
-            rc = drvHostALSAAudioStreamCtl(pStreamALSA->phPCM, false /* fStop */);
+            rc = drvHostALSAAudioStreamCtl(pStreamALSA, false /* fStop */);
             break;
 
         case PDMAUDIOSTREAMCMD_DISABLE:
         case PDMAUDIOSTREAMCMD_PAUSE:
-            rc = drvHostALSAAudioStreamCtl(pStreamALSA->phPCM, true /* fStop */);
+            rc = drvHostALSAAudioStreamCtl(pStreamALSA, true /* fStop */);
             break;
 
         default:
diff --git a/src/VBox/Devices/Audio/DrvHostDebugAudio.cpp b/src/VBox/Devices/Audio/DrvHostDebugAudio.cpp
index 040c652..1dabcb6 100644
--- a/src/VBox/Devices/Audio/DrvHostDebugAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvHostDebugAudio.cpp
@@ -36,7 +36,7 @@ typedef struct DEBUGAUDIOSTREAM
     /** The stream's acquired configuration. */
     PPDMAUDIOSTREAMCFG pCfg;
     /** Audio file to dump output to or read input from. */
-    PDMAUDIOFILE       File;
+    PPDMAUDIOFILE      pFile;
     union
     {
         struct
@@ -149,13 +149,17 @@ static int debugCreateStreamOut(PDRVHOSTDEBUGAUDIO pDrv, PDEBUGAUDIOSTREAM pStre
         if (RT_SUCCESS(rc))
         {
             char szFile[RTPATH_MAX];
-            rc = DrvAudioHlpGetFileName(szFile, RT_ELEMENTS(szFile), szTemp, NULL, PDMAUDIOFILETYPE_WAV);
+            rc = DrvAudioHlpGetFileName(szFile, RT_ELEMENTS(szFile), szTemp, "DebugAudioOut",
+                                        pDrv->pDrvIns->iInstance, PDMAUDIOFILETYPE_WAV, PDMAUDIOFILENAME_FLAG_NONE);
             if (RT_SUCCESS(rc))
             {
-                LogFlowFunc(("%s\n", szFile));
-                rc = DrvAudioHlpWAVFileOpen(&pStreamDbg->File, szFile,
-                                            RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE,
-                                            &pCfgReq->Props, PDMAUDIOFILEFLAG_NONE);
+                rc = DrvAudioHlpFileCreate(PDMAUDIOFILETYPE_WAV, szFile, PDMAUDIOFILE_FLAG_NONE, &pStreamDbg->pFile);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = DrvAudioHlpFileOpen(pStreamDbg->pFile, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE,
+                                             &pCfgReq->Props);
+                }
+
                 if (RT_FAILURE(rc))
                     LogRel(("DebugAudio: Creating output file '%s' failed with %Rrc\n", szFile, rc));
             }
@@ -227,15 +231,7 @@ static DECLCALLBACK(int) drvHostDebugAudioStreamPlay(PPDMIHOSTAUDIO pInterface,
 
         memcpy(pStreamDbg->Out.auPlayBuffer, (uint8_t *)pvBuf + cbWrittenTotal, cbChunk);
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-        RTFILE fh;
-        RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "AudioDebugOutput.pcm",
-                   RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
-        RTFileWrite(fh, pStreamDbg->Out.auPlayBuffer, cbChunk, NULL);
-        RTFileClose(fh);
-#endif
-        int rc2 = DrvAudioHlpWAVFileWrite(&pStreamDbg->File,
-                                          pStreamDbg->Out.auPlayBuffer, cbChunk, 0 /* fFlags */);
+        int rc2 = DrvAudioHlpFileWrite(pStreamDbg->pFile, pStreamDbg->Out.auPlayBuffer, cbChunk, 0 /* fFlags */);
         if (RT_FAILURE(rc2))
         {
             LogRel(("DebugAudio: Writing output failed with %Rrc\n", rc2));
@@ -288,24 +284,9 @@ static int debugDestroyStreamOut(PDRVHOSTDEBUGAUDIO pDrv, PDEBUGAUDIOSTREAM pStr
         pStreamDbg->Out.auPlayBuffer = NULL;
     }
 
-    size_t cbDataSize = DrvAudioHlpWAVFileGetDataSize(&pStreamDbg->File);
+    DrvAudioHlpFileDestroy(pStreamDbg->pFile);
 
-    int rc = DrvAudioHlpWAVFileClose(&pStreamDbg->File);
-    if (RT_SUCCESS(rc))
-    {
-        /* Delete the file again if nothing but the header was written to it. */
-        bool fDeleteEmptyFiles = true; /** @todo Make deletion configurable? */
-
-        if (   !cbDataSize
-            && fDeleteEmptyFiles)
-        {
-            rc = RTFileDelete(pStreamDbg->File.szName);
-        }
-        else
-            LogRel(("DebugAudio: Created output file '%s' (%zu bytes)\n", pStreamDbg->File.szName, cbDataSize));
-    }
-
-    return rc;
+    return VINF_SUCCESS;
 }
 
 
diff --git a/src/VBox/Devices/Audio/DrvHostValidationKit.cpp b/src/VBox/Devices/Audio/DrvHostValidationKit.cpp
index e8fd2d6..28adeb9 100644
--- a/src/VBox/Devices/Audio/DrvHostValidationKit.cpp
+++ b/src/VBox/Devices/Audio/DrvHostValidationKit.cpp
@@ -166,9 +166,9 @@ static int debugCreateStreamOut(PDRVHOSTVAKITAUDIO pDrv, PVAKITAUDIOSTREAM pStre
             if (RT_SUCCESS(rc))
             {
                 LogFlowFunc(("%s\n", szFile));
-                rc = DrvAudioHlpWAVFileOpen(&pStreamDbg->File, szFile,
-                                            RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE,
-                                            &pCfgReq->Props, PDMAUDIOFILEFLAG_NONE);
+                rc = DrvAudioHlpFileOpen(&pStreamDbg->File, PDMAUDIOFILETYPE_WAV, szFile,
+                                         RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE,
+                                         &pCfgReq->Props, PDMAUDIOFILE_FLAG_NONE);
                 if (RT_FAILURE(rc))
                     LogRel(("VaKitAudio: Creating output file '%s' failed with %Rrc\n", szFile, rc));
 
@@ -276,7 +276,7 @@ static DECLCALLBACK(int) drvHostVaKitAudioStreamPlay(PPDMIHOSTAUDIO pInterface,
     /* Remember when samples were consumed. */
    // pStreamDbg->Out.tsLastPlayed = PDMDrvHlpTMGetVirtualTime(pDrv->pDrvIns);;
 
-    int rc2 = DrvAudioHlpWAVFileWrite(&pStreamDbg->File, pvBuf, cxBuf, 0 /* fFlags */);
+    int rc2 = DrvAudioHlpFileWrite(&pStreamDbg->File, pvBuf, cxBuf, 0 /* fFlags */);
     if (RT_FAILURE(rc2))
         LogRel(("DebugAudio: Writing output failed with %Rrc\n", rc2));
 
@@ -320,9 +320,9 @@ static int debugDestroyStreamOut(PDRVHOSTVAKITAUDIO pDrv, PVAKITAUDIOSTREAM pStr
         pStreamDbg->Out.pu8PlayBuffer = NULL;
     }
 
-    size_t cbDataSize = DrvAudioHlpWAVFileGetDataSize(&pStreamDbg->File);
+    size_t cbDataSize = DrvAudioHlpFileGetDataSize(&pStreamDbg->File);
 
-    int rc = DrvAudioHlpWAVFileClose(&pStreamDbg->File);
+    int rc = DrvAudioHlpFileClose(&pStreamDbg->File);
     RTFileClose(pStreamDbg->hFileTiming);
 
     if (RT_SUCCESS(rc))
diff --git a/src/VBox/Devices/Audio/HDAStream.cpp b/src/VBox/Devices/Audio/HDAStream.cpp
index 1d39056..67fa0e6 100644
--- a/src/VBox/Devices/Audio/HDAStream.cpp
+++ b/src/VBox/Devices/Audio/HDAStream.cpp
@@ -42,13 +42,14 @@
  * @returns IPRT status code.
  * @param   pStream             HDA stream to create.
  * @param   pThis               HDA state to assign the HDA stream to.
+ * @param   u8SD                Stream descriptor number to assign.
  */
-int hdaStreamCreate(PHDASTREAM pStream, PHDASTATE pThis)
+int hdaStreamCreate(PHDASTREAM pStream, PHDASTATE pThis, uint8_t u8SD)
 {
     RT_NOREF(pThis);
     AssertPtrReturn(pStream, VERR_INVALID_POINTER);
 
-    pStream->u8SD           = UINT8_MAX;
+    pStream->u8SD           = u8SD;
     pStream->pMixSink       = NULL;
     pStream->pHDAState      = pThis;
 
@@ -65,11 +66,48 @@ int hdaStreamCreate(PHDASTREAM pStream, PHDASTATE pThis)
             rc = RTCritSectInit(&pStream->State.CritSect);
     }
 
+    int rc2;
+
 #ifdef DEBUG
-    int rc2 = RTCritSectInit(&pStream->Dbg.CritSect);
+    rc2 = RTCritSectInit(&pStream->Dbg.CritSect);
     AssertRC(rc2);
 #endif
 
+    pStream->Dbg.Runtime.fEnabled = pThis->Dbg.fEnabled;
+
+    if (pStream->Dbg.Runtime.fEnabled)
+    {
+        char szFile[64];
+
+        if (pStream->State.Cfg.enmDir == PDMAUDIODIR_IN)
+            RTStrPrintf(szFile, sizeof(szFile), "hdaStreamWriteSD%RU8", pStream->u8SD);
+        else
+            RTStrPrintf(szFile, sizeof(szFile), "hdaStreamReadSD%RU8", pStream->u8SD);
+
+        char szPath[RTPATH_MAX + 1];
+        rc2 = DrvAudioHlpGetFileName(szPath, sizeof(szPath), pThis->Dbg.szOutPath, szFile,
+                                     0 /* uInst */, PDMAUDIOFILETYPE_WAV, PDMAUDIOFILENAME_FLAG_NONE);
+        AssertRC(rc2);
+        rc2 = DrvAudioHlpFileCreate(PDMAUDIOFILETYPE_WAV, szPath, PDMAUDIOFILE_FLAG_NONE, &pStream->Dbg.Runtime.pFileStream);
+        AssertRC(rc2);
+
+        if (pStream->State.Cfg.enmDir == PDMAUDIODIR_IN)
+            RTStrPrintf(szFile, sizeof(szFile), "hdaDMAWriteSD%RU8", pStream->u8SD);
+        else
+            RTStrPrintf(szFile, sizeof(szFile), "hdaDMAReadSD%RU8", pStream->u8SD);
+
+        rc2 = DrvAudioHlpGetFileName(szPath, sizeof(szPath), pThis->Dbg.szOutPath, szFile,
+                                     0 /* uInst */, PDMAUDIOFILETYPE_WAV, PDMAUDIOFILENAME_FLAG_NONE);
+        AssertRC(rc2);
+
+        rc2 = DrvAudioHlpFileCreate(PDMAUDIOFILETYPE_WAV, szPath, PDMAUDIOFILE_FLAG_NONE, &pStream->Dbg.Runtime.pFileDMA);
+        AssertRC(rc2);
+
+        /* Delete stale debugging files from a former run. */
+        DrvAudioHlpFileDelete(pStream->Dbg.Runtime.pFileStream);
+        DrvAudioHlpFileDelete(pStream->Dbg.Runtime.pFileDMA);
+    }
+
     return rc;
 }
 
@@ -91,8 +129,6 @@ void hdaStreamDestroy(PHDASTREAM pStream)
 #ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
     rc2 = hdaStreamAsyncIODestroy(pStream);
     AssertRC(rc2);
-#else
-    RT_NOREF(pThis);
 #endif
 
     rc2 = RTCritSectDelete(&pStream->State.CritSect);
@@ -111,6 +147,15 @@ void hdaStreamDestroy(PHDASTREAM pStream)
     AssertRC(rc2);
 #endif
 
+    if (pStream->Dbg.Runtime.fEnabled)
+    {
+        DrvAudioHlpFileDestroy(pStream->Dbg.Runtime.pFileStream);
+        pStream->Dbg.Runtime.pFileStream = NULL;
+
+        DrvAudioHlpFileDestroy(pStream->Dbg.Runtime.pFileDMA);
+        pStream->Dbg.Runtime.pFileDMA = NULL;
+    }
+
     LogFlowFuncLeave();
 }
 
@@ -136,7 +181,7 @@ int hdaStreamInit(PHDASTREAM pStream, uint8_t uSD)
     pStream->u16FIFOS   = HDA_STREAM_REG(pThis, FIFOS, pStream->u8SD) + 1;
 
     /* Make sure to also update the stream's DMA counter (based on its current LPIB value). */
-    hdaStreamUpdateLPIB(pStream, HDA_STREAM_REG(pThis, LPIB, pStream->u8SD));
+    hdaStreamSetPosition(pStream, HDA_STREAM_REG(pThis, LPIB, pStream->u8SD));
 
     PPDMAUDIOSTREAMCFG pCfg = &pStream->State.Cfg;
 
@@ -187,6 +232,101 @@ int hdaStreamInit(PHDASTREAM pStream, uint8_t uSD)
     LogFunc(("[SD%RU8] DMA @ 0x%x (%RU32 bytes), LVI=%RU16, FIFOS=%RU16, rc=%Rrc\n",
              pStream->u8SD, pStream->u64BDLBase, pStream->u32CBL, pStream->u16LVI, pStream->u16FIFOS, rc));
 
+    if (   pStream->u32CBL
+        && pStream->u16LVI)
+    {
+        /* Make sure that the chosen Hz rate dividable by the stream's rate. */
+        if (pStream->State.Cfg.Props.uHz % pThis->u16TimerHz != 0)
+            LogRel(("HDA: Device timer (%RU32) does not fit to stream #RU8 timing (%RU32)\n",
+                    pThis->u16TimerHz, pStream->State.Cfg.Props.uHz));
+
+        /** @todo Use a more dynamic fragment size? */
+        uint8_t cFragments = pStream->u16LVI;
+        if (cFragments <= 1)
+            cFragments = 2; /* At least two fragments (BDLEs) must be present. */
+
+        /* Calculate the fragment size the guest OS expects interrupt delivery at. */
+        pStream->State.cbTransferSize = pStream->u32CBL / cFragments;
+        Assert(pStream->State.cbTransferSize);
+        Assert(pStream->State.cbTransferSize % HDA_FRAME_SIZE == 0);
+
+        /* Calculate the bytes we need to transfer to / from the stream's DMA per iteration.
+         * This is bound to the device's Hz rate and thus to the (virtual) timing the device expects. */
+        pStream->State.cbTransferChunk = (pStream->State.Cfg.Props.uHz / pThis->u16TimerHz) * HDA_FRAME_SIZE;
+        Assert(pStream->State.cbTransferChunk);
+        Assert(pStream->State.cbTransferChunk % HDA_FRAME_SIZE == 0);
+
+        /* Make sure that the transfer chunk does not exceed the overall transfer size. */
+        if (pStream->State.cbTransferChunk > pStream->State.cbTransferSize)
+            pStream->State.cbTransferChunk = pStream->State.cbTransferSize;
+
+        pStream->State.cbTransferProcessed        = 0;
+        pStream->State.cTransferPendingInterrupts = 0;
+
+        const uint64_t cTicksPerHz = TMTimerGetFreq(pThis->pTimer) / pThis->u16TimerHz;
+
+        /* Calculate the timer ticks per byte for this stream. */
+        pStream->State.cTicksPerByte = cTicksPerHz / pStream->State.cbTransferChunk;
+        Assert(pStream->State.cTicksPerByte);
+
+        /* Calculate timer ticks per transfer. */
+        pStream->State.cTransferTicks     = pStream->State.cbTransferChunk * pStream->State.cTicksPerByte;
+
+        /* Initialize the transfer timestamps. */
+        pStream->State.tsTransferLast     = 0;
+        pStream->State.tsTransferNext     = 0;
+
+        LogFunc(("[SD%RU8] Timer %uHz (%RU64 ticks per Hz), ticks per byte: %RU64 (%RU64 bytes per iteration = %RU64 ticks)," \
+                 " transfer size = %RU64\n",
+                 pStream->u8SD, pThis->u16TimerHz, cTicksPerHz, pStream->State.cTicksPerByte,
+                 pStream->State.cbTransferChunk, pStream->State.cTransferTicks, pStream->State.cbTransferSize));
+        /*
+         * Handle the stream's position adjustment.
+         */
+        uint32_t cfPosAdjust = 0;
+
+        if (pThis->fPosAdjustEnabled) /* Is the position adjustment enabled at all? */
+        {
+            /* If no custom set position adjustment is set, apply some
+             * simple heuristics to detect the appropriate position adjustment. */
+            if (   pStream->u64BDLBase
+                && !pThis->cPosAdjustFrames)
+            {
+                HDABDLE BDLE;
+                int rc2 = hdaBDLEFetch(pThis, &BDLE, pStream->u64BDLBase, 0 /* Entry */);
+                AssertRC(rc2);
+
+                /** @todo Implement / use a (dynamic) table once this gets more complicated. */
+
+#ifdef VBOX_WITH_INTEL_HDA
+                /* Intel ICH / PCH: 1 frame. */
+                if (BDLE.Desc.u32BufSize == 1 * HDA_FRAME_SIZE)
+                {
+                    cfPosAdjust = 1;
+                }
+                /* Intel Baytrail / Braswell: 32 frames. */
+                else if (BDLE.Desc.u32BufSize == 32 * HDA_FRAME_SIZE)
+                {
+                    cfPosAdjust = 32;
+                }
+                else
+#endif
+                    cfPosAdjust = pThis->cPosAdjustFrames;
+            }
+            else /* Go with the set default. */
+                cfPosAdjust = pThis->cPosAdjustFrames;
+
+            if (cfPosAdjust)
+            {
+                /* Initialize position adjustment counter. */
+                pStream->State.cPosAdjustFramesLeft = cfPosAdjust;
+                LogRel2(("HDA: Position adjustment for stream #%RU8 active (%RU32 frames)\n", pStream->u8SD, cfPosAdjust));
+            }
+        }
+
+        LogFunc(("[SD%RU8] cfPosAdjust=%RU32\n", pStream->u8SD, cfPosAdjust));
+    }
+
     return rc;
 }
 
@@ -238,6 +378,9 @@ void hdaStreamReset(PHDASTATE pThis, PHDASTREAM pStream, uint8_t uSD)
     hdaStreamUnregisterDMAHandlers(pThis, pStream);
 #endif
 
+    pStream->State.tsTransferLast = 0;
+    pStream->State.tsTransferNext = 0;
+
     RT_ZERO(pStream->State.BDLE);
     pStream->State.uCurBDLE = 0;
 
@@ -297,71 +440,67 @@ int hdaStreamEnable(PHDASTREAM pStream, bool fEnable)
         /* First, enable or disable the stream and the stream's sink, if any. */
         if (pStream->pMixSink->pMixSink)
             rc = AudioMixerSinkCtl(pStream->pMixSink->pMixSink, enmCmd);
+
+        if (   RT_SUCCESS(rc)
+            && pStream->Dbg.Runtime.fEnabled)
+        {
+            if (fEnable)
+            {
+                int rc2 = DrvAudioHlpFileOpen(pStream->Dbg.Runtime.pFileStream, PDMAUDIOFILE_DEFAULT_OPEN_FLAGS,
+                                              &pStream->State.Cfg.Props);
+                AssertRC(rc2);
+
+                rc2 = DrvAudioHlpFileOpen(pStream->Dbg.Runtime.pFileDMA, PDMAUDIOFILE_DEFAULT_OPEN_FLAGS,
+                                          &pStream->State.Cfg.Props);
+                AssertRC(rc2);
+            }
+            else
+            {
+                int rc2 = DrvAudioHlpFileClose(pStream->Dbg.Runtime.pFileStream);
+                AssertRC(rc2);
+
+                rc2 = DrvAudioHlpFileClose(pStream->Dbg.Runtime.pFileDMA);
+                AssertRC(rc2);
+            }
+        }
     }
 
     LogFunc(("[SD%RU8] rc=%Rrc\n", pStream->u8SD, rc));
     return rc;
 }
 
-/**
- * Returns the number of outstanding stream data bytes which need to be processed
- * by the DMA engine assigned to this stream.
- *
- * @return Number of bytes for the DMA engine to process.
- */
-uint32_t hdaStreamGetTransferSize(PHDASTATE pThis, PHDASTREAM pStream)
+uint32_t hdaStreamGetPosition(PHDASTATE pThis, PHDASTREAM pStream)
 {
-    AssertPtrReturn(pThis, 0);
-    AssertPtrReturn(pStream, 0);
-
-    if (!RT_BOOL(HDA_STREAM_REG(pThis, CTL, pStream->u8SD) & HDA_SDCTL_RUN))
-    {
-        AssertFailed(); /* Should never happen. */
-        return 0;
-    }
-
-    /* Determine how much for the current BDL entry we have left to transfer. */
-    PHDABDLE pBDLE  = &pStream->State.BDLE;
-    const uint32_t cbBDLE = RT_MIN(pBDLE->Desc.u32BufSize, pBDLE->Desc.u32BufSize - pBDLE->State.u32BufOff);
-
-    /* Determine how much we (still) can stuff in the stream's internal FIFO.  */
-    const uint32_t cbCircBuf   = (uint32_t)RTCircBufFree(pStream->State.pCircBuf);
-
-    uint32_t cbToTransfer = cbBDLE;
-
-    /* Make sure that we don't transfer more than our FIFO can hold at the moment.
-     * As the host sets the overall pace it needs to process some of the FIFO data first before
-     * we can issue a new DMA data transfer. */
-    if (cbToTransfer > cbCircBuf)
-        cbToTransfer = cbCircBuf;
-
-    Log3Func(("[SD%RU8] LPIB=%RU32 CBL=%RU32 cbCircBuf=%RU32, -> cbToTransfer=%RU32 %R[bdle]\n", pStream->u8SD,
-              HDA_STREAM_REG(pThis, LPIB, pStream->u8SD), pStream->u32CBL, cbCircBuf, cbToTransfer, pBDLE));
-    return cbToTransfer;
+    return HDA_STREAM_REG(pThis, LPIB, pStream->u8SD);
 }
 
 /**
- * Increases the amount of transferred (audio) data of an HDA stream and
- * reports this as needed to the guest.
+ * Updates an HDA stream's current read or write buffer position (depending on the stream type) by
+ * updating its associated LPIB register and DMA position buffer (if enabled).
  *
- * @param  pStream              HDA stream to increase amount for.
- * @param  cbInc                Amount (in bytes) to increase.
+ * @param   pStream             HDA stream to update read / write position for.
+ * @param   u32LPIB             Absolute position (in bytes) to set current read / write position to.
  */
-void hdaStreamTransferInc(PHDASTREAM pStream, uint32_t cbInc)
+void hdaStreamSetPosition(PHDASTREAM pStream, uint32_t u32LPIB)
 {
     AssertPtrReturnVoid(pStream);
 
-    if (!cbInc)
-        return;
+    Assert(u32LPIB % HDA_FRAME_SIZE == 0);
 
-    const PHDASTATE pThis  = pStream->pHDAState;
+    Log3Func(("[SD%RU8] LPIB=%RU32 (DMA Position Buffer Enabled: %RTbool)\n",
+              pStream->u8SD, u32LPIB, pStream->pHDAState->fDMAPosition));
 
-    const uint32_t u32LPIB = HDA_STREAM_REG(pThis, LPIB, pStream->u8SD);
-
-    Log3Func(("[SD%RU8] %RU32 + %RU32 -> %RU32, CBL=%RU32\n",
-              pStream->u8SD, u32LPIB, cbInc, u32LPIB + cbInc, pStream->u32CBL));
+    /* Update LPIB in any case. */
+    HDA_STREAM_REG(pStream->pHDAState, LPIB, pStream->u8SD) = u32LPIB;
 
-    hdaStreamUpdateLPIB(pStream, u32LPIB + cbInc);
+    /* Do we need to tell the current DMA position? */
+    if (pStream->pHDAState->fDMAPosition)
+    {
+        int rc2 = PDMDevHlpPCIPhysWrite(pStream->pHDAState->CTX_SUFF(pDevIns),
+                                        pStream->pHDAState->u64DPBase + (pStream->u8SD * 2 * sizeof(uint32_t)),
+                                        (void *)&u32LPIB, sizeof(uint32_t));
+        AssertRC(rc2);
+    }
 }
 
 /**
@@ -396,74 +535,94 @@ uint32_t hdaStreamGetFree(PHDASTREAM pStream)
     return (uint32_t)RTCircBufFree(pStream->State.pCircBuf);
 }
 
+/**
+ * Returns whether a next transfer for a given stream is scheduled or not.
+ *
+ * @returns True if a next transfer is scheduled, false if not.
+ * @param   pStream             HDA stream to retrieve schedule status for.
+ */
+bool hdaStreamTransferIsScheduled(PHDASTREAM pStream)
+{
+    AssertPtrReturn(pStream,            false);
+    AssertPtrReturn(pStream->pHDAState, false);
+
+    const bool fScheduled = pStream->State.tsTransferNext > TMTimerGet(pStream->pHDAState->pTimer);
+
+    Log3Func(("[SD%RU8] %RU64 -> %RTbool\n", pStream->u8SD, pStream->State.tsTransferNext, fScheduled));
+
+    return fScheduled;
+}
+
+/**
+ * Returns the (virtual) clock timestamp of the next transfer, if any.
+ * Will return 0 if no new transfer is scheduled.
+ *
+ * @returns The (virtual) clock timestamp of the next transfer.
+ * @param   pStream             HDA stream to retrieve timestamp for.
+ */
+uint64_t hdaStreamTransferGetNext(PHDASTREAM pStream)
+{
+    return pStream->State.tsTransferNext;
+}
 
 /**
  * Writes audio data from a mixer sink into an HDA stream's DMA buffer.
  *
  * @returns IPRT status code.
  * @param   pStream             HDA stream to write to.
- * @param   cbToWrite           Number of bytes to write.
+ * @param   pvBuf               Data buffer to write.
+ *                              If NULL, silence will be written.
+ * @param   cbBuf               Number of bytes of data buffer to write.
  * @param   pcbWritten          Number of bytes written. Optional.
  */
-int hdaStreamWrite(PHDASTREAM pStream, uint32_t cbToWrite, uint32_t *pcbWritten)
+int hdaStreamWrite(PHDASTREAM pStream, const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten)
 {
     AssertPtrReturn(pStream, VERR_INVALID_POINTER);
-    AssertReturn(cbToWrite,  VERR_INVALID_PARAMETER);
+    /* pvBuf is optional. */
+    AssertReturn(cbBuf,      VERR_INVALID_PARAMETER);
     /* pcbWritten is optional. */
 
-    PHDAMIXERSINK pSink = pStream->pMixSink;
-    if (!pSink)
-    {
-        AssertMsgFailed(("[SD%RU8]: Can't write to a stream with no sink attached\n", pStream->u8SD));
-
-        if (pcbWritten)
-            *pcbWritten = 0;
-        return VINF_SUCCESS;
-    }
-
     PRTCIRCBUF pCircBuf = pStream->State.pCircBuf;
     AssertPtr(pCircBuf);
 
     int rc = VINF_SUCCESS;
 
     uint32_t cbWrittenTotal = 0;
-    uint32_t cbLeft         = RT_MIN(cbToWrite, (uint32_t)RTCircBufFree(pCircBuf));
+    uint32_t cbLeft         = RT_MIN(cbBuf, (uint32_t)RTCircBufFree(pCircBuf));
 
     while (cbLeft)
     {
         void *pvDst;
         size_t cbDst;
 
-        uint32_t cbRead = 0;
-
         RTCircBufAcquireWriteBlock(pCircBuf, cbLeft, &pvDst, &cbDst);
 
         if (cbDst)
         {
-            rc = AudioMixerSinkRead(pSink->pMixSink, AUDMIXOP_COPY, pvDst, (uint32_t)cbDst, &cbRead);
-            AssertRC(rc);
-
-            Assert(cbDst >= cbRead);
-            Log2Func(("[SD%RU8]: %RU32/%zu bytes read\n", pStream->u8SD, cbRead, cbDst));
+            if (pvBuf)
+            {
+                memcpy(pvDst, (uint8_t *)pvBuf + cbWrittenTotal, cbDst);
+            }
+            else /* Send silence. */
+            {
+                /** @todo Use a sample spec for "silence" based on the PCM parameters.
+                 *        For now we ASSUME that silence equals NULLing the data. */
+                RT_BZERO(pvDst, cbDst);
+            }
 
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-            RTFILE fh;
-            RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamWrite.pcm",
-                       RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
-            RTFileWrite(fh, pvDst, cbRead, NULL);
-            RTFileClose(fh);
-#endif
+            if (pStream->Dbg.Runtime.fEnabled)
+                DrvAudioHlpFileWrite(pStream->Dbg.Runtime.pFileStream, pvDst, cbDst, 0 /* fFlags */);
         }
 
-        RTCircBufReleaseWriteBlock(pCircBuf, cbRead);
+        RTCircBufReleaseWriteBlock(pCircBuf, cbDst);
 
         if (RT_FAILURE(rc))
             break;
 
-        Assert(cbLeft  >= cbRead);
-        cbLeft         -= cbRead;
+        Assert(cbLeft  >= (uint32_t)cbDst);
+        cbLeft         -= (uint32_t)cbDst;
 
-        cbWrittenTotal += cbRead;
+        cbWrittenTotal += (uint32_t)cbDst;
     }
 
     if (pcbWritten)
@@ -516,13 +675,9 @@ int hdaStreamRead(PHDASTREAM pStream, uint32_t cbToRead, uint32_t *pcbRead)
 
         if (cbSrc)
         {
-#ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
-            RTFILE fh;
-            RTFileOpen(&fh, VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH "hdaStreamRead.pcm",
-                       RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND | RTFILE_O_WRITE | RTFILE_O_DENY_NONE);
-            RTFileWrite(fh, pvSrc, cbSrc, NULL);
-            RTFileClose(fh);
-#endif
+            if (pStream->Dbg.Runtime.fEnabled)
+                DrvAudioHlpFileWrite(pStream->Dbg.Runtime.pFileStream, pvSrc, cbSrc, 0 /* fFlags */);
+
             rc = AudioMixerSinkWrite(pSink->pMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbWritten);
             AssertRC(rc);
 
@@ -547,30 +702,6 @@ int hdaStreamRead(PHDASTREAM pStream, uint32_t cbToRead, uint32_t *pcbRead)
     return rc;
 }
 
-uint32_t hdaStreamTransferGetElapsed(PHDASTREAM pStream)
-{
-    AssertPtr(pStream->pHDAState->pTimer);
-    const uint64_t cTicksNow     = TMTimerGet(pStream->pHDAState->pTimer);
-    const uint64_t cTicksPerSec  = TMTimerGetFreq(pStream->pHDAState->pTimer);
-
-    const uint64_t cTicksElapsed = cTicksNow - pStream->State.uTimerTS;
-#ifdef DEBUG
-    const uint64_t cMsElapsed    = cTicksElapsed / (cTicksPerSec / 1000);
-#endif
-
-    AssertPtr(pStream->pHDAState->pCodec);
-
-    PPDMAUDIOSTREAMCFG pCfg = &pStream->State.Cfg;
-
-    /* A stream *always* runs with 48 kHz device-wise, regardless of the actual stream input/output format (Hz) being set. */
-    uint32_t csPerPeriod = (int)((pCfg->Props.cChannels * cTicksElapsed * 48000 /* Hz */ + cTicksPerSec) / cTicksPerSec / 2);
-    uint32_t cbPerPeriod = csPerPeriod << pCfg->Props.cShift;
-
-    Log3Func(("[SD%RU8] %RU64ms (%zu samples, %zu bytes) elapsed\n", pStream->u8SD, cMsElapsed, csPerPeriod, cbPerPeriod));
-
-    return cbPerPeriod;
-}
-
 /**
  * Transfers data of an HDA stream according to its usage (input / output).
  *
@@ -582,12 +713,11 @@ uint32_t hdaStreamTransferGetElapsed(PHDASTREAM pStream)
  *
  * @returns IPRT status code.
  * @param   pStream             HDA stream to update.
- * @param   cbToProcessMax      Maximum of data (in bytes) to process.
+ * @param   cbToProcessMax      How much data (in bytes) to process as maximum.
  */
 int hdaStreamTransfer(PHDASTREAM pStream, uint32_t cbToProcessMax)
 {
-    AssertPtrReturn(pStream,        VERR_INVALID_POINTER);
-    AssertReturn(cbToProcessMax,    VERR_INVALID_PARAMETER);
+    AssertPtrReturn(pStream, VERR_INVALID_POINTER);
 
     hdaStreamLock(pStream);
 
@@ -606,10 +736,9 @@ int hdaStreamTransfer(PHDASTREAM pStream, uint32_t cbToProcessMax)
         Log3Func(("[SD%RU8] RUN bit not set\n", pStream->u8SD));
         fProceed = false;
     }
-    /* Period complete? */
-    else if (hdaStreamPeriodIsComplete(pPeriod))
+    else if (HDA_STREAM_REG(pThis, STS, pStream->u8SD) & HDA_SDSTS_BCIS)
     {
-        Log3Func(("[SD%RU8] Period is complete, nothing to do\n", pStream->u8SD));
+        Log3Func(("[SD%RU8] BCIS bit set\n", pStream->u8SD));
         fProceed = false;
     }
 
@@ -620,10 +749,24 @@ int hdaStreamTransfer(PHDASTREAM pStream, uint32_t cbToProcessMax)
         return VINF_SUCCESS;
     }
 
+    const uint64_t tsNow = TMTimerGet(pThis->pTimer);
+
+    if (!pStream->State.tsTransferLast)
+        pStream->State.tsTransferLast = tsNow;
+
+#ifdef DEBUG
+    const int64_t iTimerDelta = tsNow - pStream->State.tsTransferLast;
+    Log3Func(("[SD%RU8] Time now=%RU64, last=%RU64 -> %RI64 ticks delta\n",
+              pStream->u8SD, tsNow, pStream->State.tsTransferLast, iTimerDelta));
+#endif
+
+    pStream->State.tsTransferLast = tsNow;
+
     /* Sanity checks. */
     Assert(pStream->u8SD < HDA_MAX_STREAMS);
     Assert(pStream->u64BDLBase);
     Assert(pStream->u32CBL);
+    Assert(pStream->u16FIFOS);
 
     /* State sanity checks. */
     Assert(ASMAtomicReadBool(&pStream->State.fInReset) == false);
@@ -636,49 +779,122 @@ int hdaStreamTransfer(PHDASTREAM pStream, uint32_t cbToProcessMax)
         AssertRC(rc);
     }
 
-    const uint32_t cbPeriodRemaining = hdaStreamPeriodGetRemainingFrames(pPeriod) * HDA_FRAME_SIZE;
-    Assert(cbPeriodRemaining); /* Paranoia. */
+    uint32_t cbToProcess = RT_MIN(pStream->State.cbTransferSize - pStream->State.cbTransferProcessed,
+                                  pStream->State.cbTransferChunk);
+    uint32_t cbProcessed = 0;
+    uint32_t cbLeft      = cbToProcess;
+    Assert(cbLeft % HDA_FRAME_SIZE == 0);
 
-    const uint32_t cbElapsed         = hdaStreamTransferGetElapsed(pStream);
-    Assert(cbElapsed);         /* Paranoia. */
+    if (cbToProcess > cbToProcessMax)
+        LogRel2(("HDA: More data to process\n"));
 
-    /* Limit the data to read, as this routine could be delayed and therefore
-     * report wrong (e.g. too much) cbElapsed bytes. */
-    uint32_t cbLeft                  = RT_MIN(RT_MIN(cbPeriodRemaining, cbElapsed), cbToProcessMax);
-
-    Log3Func(("[SD%RU8] cbPeriodRemaining=%RU32, cbElapsed=%RU32, cbToProcessMax=%RU32 -> cbLeft=%RU32\n",
-              pStream->u8SD, cbPeriodRemaining, cbElapsed, cbToProcessMax, cbLeft));
-
-    Assert(cbLeft % HDA_FRAME_SIZE == 0); /* Paranoia. */
+    Log3Func(("[SD%RU8] cbToProcess=%RU32\n", pStream->u8SD, cbToProcess));
 
+    uint8_t abChunk[HDA_FIFO_MAX + 1];
     while (cbLeft)
     {
-        uint32_t cbChunk = RT_MIN(hdaStreamGetTransferSize(pThis, pStream), cbLeft);
+        /* Limit the chunk to the stream's FIFO size and what's left to process. */
+        uint32_t cbChunk = RT_MIN(cbLeft, pStream->u16FIFOS);
+
+        /* Limit the chunk to the remaining data of the current BDLE. */
+        cbChunk = RT_MIN(cbChunk, pBDLE->Desc.u32BufSize - pBDLE->State.u32BufOff);
+
+        /* If there are position adjustment frames left to be processed,
+         * make sure that we process them first as a whole. */
+        if (pStream->State.cPosAdjustFramesLeft)
+            cbChunk = RT_MIN(cbChunk, uint32_t(pStream->State.cPosAdjustFramesLeft * HDA_FRAME_SIZE));
+
+        Log3Func(("[SD%RU8] cbChunk=%RU32, cPosAdjustFramesLeft=%RU16\n",
+                  pStream->u8SD, cbChunk, pStream->State.cPosAdjustFramesLeft));
+
         if (!cbChunk)
             break;
 
-        uint32_t cbDMA   = 0;
+        uint32_t   cbDMA    = 0;
+        PRTCIRCBUF pCircBuf = pStream->State.pCircBuf;
 
-        if (hdaGetDirFromSD(pStream->u8SD) == PDMAUDIODIR_OUT) /* Output (SDO). */
+        if (hdaGetDirFromSD(pStream->u8SD) == PDMAUDIODIR_IN) /* Input (SDI). */
         {
-            STAM_PROFILE_START(&pThis->StatOut, a);
+            STAM_PROFILE_START(&pThis->StatIn, a);
 
-            rc = hdaDMARead(pThis, pStream, cbChunk, &cbDMA /* pcbRead */);
-            if (RT_FAILURE(rc))
-                LogRel(("HDA: Reading from stream #%RU8 DMA failed with %Rrc\n", pStream->u8SD, rc));
+            uint32_t cbDMAWritten = 0;
+            uint32_t cbDMAToWrite = cbChunk;
 
-            STAM_PROFILE_STOP(&pThis->StatOut, a);
-        }
-        else if (hdaGetDirFromSD(pStream->u8SD) == PDMAUDIODIR_IN) /* Input (SDI). */
-        {
-            STAM_PROFILE_START(&pThis->StatIn, a);
+            while (cbDMAToWrite)
+            {
+                void *pvBuf; size_t cbBuf;
+                RTCircBufAcquireReadBlock(pCircBuf, cbDMAToWrite, &pvBuf, &cbBuf);
+
+                if (   !cbBuf
+                    && !RTCircBufUsed(pCircBuf))
+                    break;
+
+                memcpy(abChunk + cbDMAWritten, pvBuf, cbBuf);
 
-            rc = hdaDMAWrite(pThis, pStream, cbChunk, &cbDMA /* pcbWritten */);
+                RTCircBufReleaseReadBlock(pCircBuf, cbBuf);
+
+                Assert(cbDMAToWrite >= cbBuf);
+                cbDMAToWrite -= (uint32_t)cbBuf;
+                cbDMAWritten += (uint32_t)cbBuf;
+                Assert(cbDMAWritten <= cbChunk);
+            }
+
+            if (cbDMAToWrite)
+            {
+                LogRel2(("HDA: FIFO underflow for stream #%RU8 (%RU32 bytes outstanding)\n", pStream->u8SD, cbDMAToWrite));
+
+                Assert(cbChunk == cbDMAWritten + cbDMAToWrite);
+                memset((uint8_t *)abChunk + cbDMAWritten, 0, cbDMAToWrite);
+                cbDMAWritten = cbChunk;
+            }
+
+            rc = hdaDMAWrite(pThis, pStream, abChunk, cbDMAWritten, &cbDMA /* pcbWritten */);
             if (RT_FAILURE(rc))
                 LogRel(("HDA: Writing to stream #%RU8 DMA failed with %Rrc\n", pStream->u8SD, rc));
 
             STAM_PROFILE_STOP(&pThis->StatIn, a);
         }
+        else if (hdaGetDirFromSD(pStream->u8SD) == PDMAUDIODIR_OUT) /* Output (SDO). */
+        {
+            STAM_PROFILE_START(&pThis->StatOut, a);
+
+            rc = hdaDMARead(pThis, pStream, abChunk, cbChunk, &cbDMA /* pcbRead */);
+            if (RT_SUCCESS(rc))
+            {
+                uint32_t cbDMAWritten = 0;
+                uint32_t cbDMALeft    = cbDMA;
+
+                if (cbDMALeft > RTCircBufFree(pCircBuf))
+                {
+                    LogRel2(("HDA: FIFO overflow for stream #%RU8 (%RU32 bytes outstanding)\n",
+                             pStream->u8SD, cbDMALeft - RTCircBufFree(pCircBuf)));
+
+                    /* Try to read as much as possible. */
+                    cbDMALeft = (uint32_t)RTCircBufFree(pCircBuf);
+
+                    rc = VERR_BUFFER_OVERFLOW;
+                }
+
+                while (cbDMALeft)
+                {
+                    void *pvBuf; size_t cbBuf;
+                    RTCircBufAcquireWriteBlock(pCircBuf, cbDMALeft, &pvBuf, &cbBuf);
+
+                    if (cbBuf)
+                        memcpy(pvBuf, abChunk + cbDMAWritten, cbBuf);
+
+                    RTCircBufReleaseWriteBlock(pCircBuf, cbBuf);
+
+                    cbDMALeft    -= (uint32_t)cbBuf;
+                    cbDMAWritten += (uint32_t)cbBuf;
+                }
+            }
+            else
+                LogRel(("HDA: Reading from stream #%RU8 DMA failed with %Rrc\n", pStream->u8SD, rc));
+
+            STAM_PROFILE_STOP(&pThis->StatOut, a);
+        }
+
         else /** @todo Handle duplex streams? */
             AssertFailed();
 
@@ -691,57 +907,125 @@ int hdaStreamTransfer(PHDASTREAM pStream, uint32_t cbToProcessMax)
             pBDLE->State.u32BufOff += (uint32_t)cbDMA;
             Assert(pBDLE->State.u32BufOff <= pBDLE->Desc.u32BufSize);
 
-            hdaStreamTransferInc(pStream, cbDMA);
-
-            uint32_t framesDMA = cbDMA / HDA_FRAME_SIZE;
+            /* Are we done doing the position adjustment?
+             * Only then do the transfer accounting .*/
+            if (pStream->State.cPosAdjustFramesLeft == 0)
+            {
+                Assert(cbLeft >= cbDMA);
+                cbLeft        -= cbDMA;
 
-            /* Add the transferred frames to the period. */
-            hdaStreamPeriodInc(pPeriod, framesDMA);
+                cbProcessed   += cbDMA;
+            }
 
-            /* Save the timestamp of when the last successful DMA transfer has been for this stream. */
-            pStream->State.uTimerTS = TMTimerGet(pThis->pTimer);
+            /**
+             * Update the stream's current position.
+             * Do this as accurate and close to the actual data transfer as possible.
+             * All guetsts rely on this, depending on the mechanism they use (LPIB register or DMA counters).
+             */
+            uint32_t cbStreamPos = hdaStreamGetPosition(pThis, pStream);
+            if (cbStreamPos == pStream->u32CBL)
+                cbStreamPos = 0;
 
-            Assert(cbLeft >= cbDMA);
-            cbLeft        -= cbDMA;
+            hdaStreamSetPosition(pStream, cbStreamPos + cbDMA);
         }
 
         if (hdaBDLEIsComplete(pBDLE))
         {
             Log3Func(("[SD%RU8] Complete: %R[bdle]\n", pStream->u8SD, pBDLE));
 
-            if (hdaBDLENeedsInterrupt(pBDLE))
+                /* Does the current BDLE require an interrupt to be sent? */
+            if (   hdaBDLENeedsInterrupt(pBDLE)
+                /* Are we done doing the position adjustment?
+                 * It can happen that a BDLE which is handled while doing the
+                 * position adjustment requires an interrupt on completion (IOC) being set.
+                 *
+                 * In such a case we need to skip such an interrupt and just move on. */
+                && pStream->State.cPosAdjustFramesLeft == 0)
             {
                 /* If the IOCE ("Interrupt On Completion Enable") bit of the SDCTL register is set
                  * we need to generate an interrupt.
                  */
                 if (HDA_STREAM_REG(pThis, CTL, pStream->u8SD) & HDA_SDCTL_IOCE)
-                    hdaStreamPeriodAcquireInterrupt(pPeriod);
+                {
+                    pStream->State.cTransferPendingInterrupts++;
+
+                    AssertMsg(pStream->State.cTransferPendingInterrupts <= 32,
+                              ("Too many pending interrupts (%RU8) for stream #%RU8\n",
+                               pStream->State.cTransferPendingInterrupts, pStream->u8SD));
+                }
             }
 
             if (pStream->State.uCurBDLE == pStream->u16LVI)
             {
-                Assert(pStream->u32CBL == HDA_STREAM_REG(pThis, LPIB, pStream->u8SD));
-
                 pStream->State.uCurBDLE = 0;
-                hdaStreamUpdateLPIB(pStream, 0 /* LPIB */);
             }
             else
                 pStream->State.uCurBDLE++;
 
+            /* Fetch the next BDLE entry. */
             hdaBDLEFetch(pThis, pBDLE, pStream->u64BDLBase, pStream->State.uCurBDLE);
-
-            Log3Func(("[SD%RU8] Fetching: %R[bdle]\n", pStream->u8SD, pBDLE));
         }
 
+        /* Do the position adjustment accounting. */
+        pStream->State.cPosAdjustFramesLeft -= RT_MIN(pStream->State.cPosAdjustFramesLeft, cbDMA / HDA_FRAME_SIZE);
+
         if (RT_FAILURE(rc))
             break;
     }
 
-    if (hdaStreamPeriodIsComplete(pPeriod))
+    Log3Func(("[SD%RU8] cbToProcess=%RU32, cbProcessed=%RU32, cbLeft=%RU32, %R[bdle], rc=%Rrc\n",
+              pStream->u8SD, cbToProcess, cbProcessed, cbLeft, pBDLE, rc));
+
+    /* Sanity. */
+    Assert(cbProcessed % HDA_FRAME_SIZE == 0);
+    Assert(cbProcessed == cbToProcess);
+    Assert(cbLeft      == 0);
+
+    /* Only do the data accounting if we don't have to do any position
+     * adjustment anymore. */
+    if (pStream->State.cPosAdjustFramesLeft == 0)
     {
-        Log3Func(("[SD%RU8] Period complete -- Current: %R[bdle]\n", pStream->u8SD, &pStream->State.BDLE));
+        hdaStreamPeriodInc(pPeriod, RT_MIN(cbProcessed / HDA_FRAME_SIZE, hdaStreamPeriodGetRemainingFrames(pPeriod)));
+
+        pStream->State.cbTransferProcessed += cbProcessed;
+    }
 
-        /* Set the stream's BCIS bit.
+    /* Make sure that we never report more stuff processed than initially announced. */
+    if (pStream->State.cbTransferProcessed > pStream->State.cbTransferSize)
+        pStream->State.cbTransferProcessed = pStream->State.cbTransferSize;
+
+    uint32_t cbTransferLeft     = pStream->State.cbTransferSize - pStream->State.cbTransferProcessed;
+    bool     fTransferComplete  = !cbTransferLeft;
+    uint64_t tsTransferNext     = 0;
+
+    if (fTransferComplete)
+    {
+        /**
+         * Try updating the wall clock.
+         *
+         * Note 1) Only certain guests (like Linux' snd_hda_intel) rely on the WALCLK register
+         *         in order to determine the correct timing of the sound device. Other guests
+         *         like Windows 7 + 10 (or even more exotic ones like Haiku) will completely
+         *         ignore this.
+         *
+         * Note 2) When updating the WALCLK register too often / early (or even in a non-monotonic
+         *         fashion) this *will* upset guest device drivers and will completely fuck up the
+         *         sound output. Running VLC on the guest will tell!
+         */
+        const bool fWalClkSet = hdaWalClkSet(pThis,
+                                               hdaWalClkGetCurrent(pThis)
+                                             + hdaStreamPeriodFramesToWalClk(pPeriod, pStream->State.cbTransferProcessed / HDA_FRAME_SIZE),
+                                             false /* fForce */);
+        RT_NOREF(fWalClkSet);
+    }
+
+    /* Does the period have any interrupts outstanding? */
+    if (pStream->State.cTransferPendingInterrupts)
+    {
+        Log3Func(("[SD%RU8] Scheduling interrupt\n", pStream->u8SD));
+
+        /**
+         * Set the stream's BCIS bit.
          *
          * Note: This only must be done if the whole period is complete, and not if only
          * one specific BDL entry is complete (if it has the IOC bit set).
@@ -749,46 +1033,58 @@ int hdaStreamTransfer(PHDASTREAM pStream, uint32_t cbToProcessMax)
          * This will otherwise confuses the guest when it 1) deasserts the interrupt,
          * 2) reads SDSTS (with BCIS set) and then 3) too early reads a (wrong) WALCLK value.
          *
-         * snd_hda_intel on Linux will tell. */
+         * snd_hda_intel on Linux will tell.
+         */
         HDA_STREAM_REG(pThis, STS, pStream->u8SD) |= HDA_SDSTS_BCIS;
 
-        /* Try updating the wall clock. */
-        const uint64_t u64WalClk  = hdaStreamPeriodGetAbsElapsedWalClk(pPeriod);
-        const bool     fWalClkSet = hdaWalClkSet(pThis, u64WalClk, false /* fForce */);
-
-        /* Does the period have any interrupts outstanding? */
-        if (hdaStreamPeriodNeedsInterrupt(pPeriod))
-        {
-            if (fWalClkSet)
-            {
-                Log3Func(("[SD%RU8] Set WALCLK to %RU64, triggering interrupt\n", pStream->u8SD, u64WalClk));
-
-                /* Trigger an interrupt first and let hdaRegWriteSDSTS() deal with
-                 * ending / beginning a period. */
+        /* Trigger an interrupt first and let hdaRegWriteSDSTS() deal with
+         * ending / beginning a period. */
 #ifndef DEBUG
-                hdaProcessInterrupt(pThis);
+        hdaProcessInterrupt(pThis);
 #else
-                hdaProcessInterrupt(pThis, __FUNCTION__);
+        hdaProcessInterrupt(pThis, __FUNCTION__);
 #endif
-            }
-        }
-        else
-        {
-            /* End the period first ... */
-            hdaStreamPeriodEnd(pPeriod);
+        pStream->State.cTransferPendingInterrupts--;
+    }
+    else /* Transfer still in-flight -- schedule the next timing slot. */
+    {
+        uint32_t cbTransferNext = cbTransferLeft;
 
-            /* ... and immediately begin the next one. */
-            hdaStreamPeriodBegin(pPeriod, hdaWalClkGetCurrent(pThis));
+        /* No data left to transfer anymore or do we have more data left
+         * than we can transfer per timing slot? Clamp. */
+        if (   !cbTransferNext
+            || cbTransferNext > pStream->State.cbTransferChunk)
+        {
+            cbTransferNext = pStream->State.cbTransferChunk;
         }
+
+        tsTransferNext = tsNow + (cbTransferNext * pStream->State.cTicksPerByte);
     }
 
-    hdaStreamPeriodUnlock(pPeriod);
+    /* If we need to do another transfer, (re-)arm the device timer.  */
+    if (tsTransferNext) /* Can be 0 if no next transfer is needed. */
+    {
+        Log3Func(("[SD%RU8] Scheduling timer\n", pStream->u8SD));
 
-    Log3Func(("[SD%RU8] Returning %Rrc ==========================================\n", pStream->u8SD, rc));
+        TMTimerUnlock(pThis->pTimer);
 
-    if (RT_FAILURE(rc))
-        LogFunc(("[SD%RU8] Failed with rc=%Rrcc\n", pStream->u8SD, rc));
+        hdaTimerSet(pThis, tsTransferNext, false /* fForce */);
+
+        TMTimerLock(pThis->pTimer, VINF_SUCCESS);
+
+        pStream->State.tsTransferNext = tsTransferNext;
+    }
+
+    pStream->State.tsTransferLast = tsNow;
 
+    Log3Func(("[SD%RU8] cbTransferLeft=%RU32 -- %RU64/%RU64\n",
+              pStream->u8SD, cbTransferLeft, pStream->State.cbTransferProcessed, pStream->State.cbTransferSize));
+    Log3Func(("[SD%RU8] fTransferComplete=%RTbool, cTransferPendingInterrupts=%RU8\n",
+              pStream->u8SD, fTransferComplete, pStream->State.cTransferPendingInterrupts));
+    Log3Func(("[SD%RU8] tsNow=%RU64, tsTransferNext=%RU64 (in %RU64 ticks)\n",
+              pStream->u8SD, tsNow, tsTransferNext, tsTransferNext - tsNow));
+
+    hdaStreamPeriodUnlock(pPeriod);
     hdaStreamUnlock(pStream);
 
     return VINF_SUCCESS;
@@ -861,7 +1157,7 @@ void hdaStreamUpdate(PHDASTREAM pStream, bool fInTimer)
             }
 
             /* When running synchronously, update the associated sink here.
-             * Otherwise this will be done in the device timer. */
+             * Otherwise this will be done in the stream's dedicated async I/O thread. */
             rc2 = AudioMixerSinkUpdate(pSink);
             AssertRC(rc2);
 
@@ -874,52 +1170,56 @@ void hdaStreamUpdate(PHDASTREAM pStream, bool fInTimer)
 #ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
         if (fInTimer)
         {
-            rc2 = hdaStreamAsyncIONotify(pStream);
-            AssertRC(rc2);
-        }
-        else
-        {
 #endif
             rc2 = AudioMixerSinkUpdate(pSink);
             AssertRC(rc2);
 
             /* Is the sink ready to be read (host input data) from? If so, by how much? */
-            const uint32_t cbReadable = AudioMixerSinkGetReadable(pSink);
+            uint32_t cbReadable = AudioMixerSinkGetReadable(pSink);
 
-            /* How much (guest input) data is free at the moment? */
-            uint32_t cbFree = hdaStreamGetFree(pStream);
+            Log3Func(("[SD%RU8] cbReadable=%RU32\n", pStream->u8SD, cbReadable));
 
-            Log3Func(("[SD%RU8] cbReadable=%RU32, cbFree=%RU32\n", pStream->u8SD, cbReadable, cbFree));
+            if (cbReadable)
+            {
+                uint8_t abFIFO[HDA_FIFO_MAX + 1];
+                while (cbReadable)
+                {
+                    uint32_t cbRead;
+                    rc2 = AudioMixerSinkRead(pSink, AUDMIXOP_COPY,
+                                             abFIFO, RT_MIN(cbReadable, (uint32_t)sizeof(abFIFO)), &cbRead);
+                    AssertRCBreak(rc2);
+
+                    /* Write (guest input) data to the stream which was read from stream's sink before. */
+                    rc2 = hdaStreamWrite(pStream, abFIFO, cbRead, NULL /* pcbWritten */);
+                    AssertRCBreak(rc2);
+
+                    Assert(cbReadable >= cbRead);
+                    cbReadable -= cbRead;
+                }
+            }
+        #if 0
+            else /* Send silence as input. */
+            {
+                cbReadable = pStream->State.cbTransferSize - pStream->State.cbTransferProcessed;
 
-            /* Do not read more than the sink can provide at the moment.
-             * The host sets the overall pace. */
-            if (cbFree > cbReadable)
-                cbFree = cbReadable;
+                Log3Func(("[SD%RU8] Sending silence (%RU32 bytes)\n", pStream->u8SD, cbReadable));
 
-            if (cbFree)
-            {
-                /* Write (guest input) data to the stream which was read from stream's sink before. */
-                rc2 = hdaStreamWrite(pStream, cbFree, NULL /* pcbWritten */);
-                AssertRC(rc2);
+                if (cbReadable)
+                {
+                    rc2 = hdaStreamWrite(pStream, NULL /* Silence */, cbReadable, NULL /* pcbWritten */);
+                    AssertRC(rc2);
+                }
             }
-#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-        }
-#endif
+        #endif
 
-#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-        if (fInTimer)
-        {
-#endif
             const uint32_t cbToTransfer = hdaStreamGetUsed(pStream);
             if (cbToTransfer)
             {
-                /* When running synchronously, do the DMA data transfers here.
-                 * Otherwise this will be done in the stream's async I/O thread. */
                 rc2 = hdaStreamTransfer(pStream, cbToTransfer);
                 AssertRC(rc2);
             }
 #ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
-        }
+        } /* fInTimer */
 #endif
     }
 }
diff --git a/src/VBox/Devices/Audio/HDAStream.h b/src/VBox/Devices/Audio/HDAStream.h
index 204c148..2f0115a 100644
--- a/src/VBox/Devices/Audio/HDAStream.h
+++ b/src/VBox/Devices/Audio/HDAStream.h
@@ -51,12 +51,33 @@ typedef struct HDASTREAMSTATEAIO
 } HDASTREAMSTATEAIO, *PHDASTREAMSTATEAIO;
 #endif
 
-#if defined (DEBUG) || defined(HDA_USE_DMA_ACCESS_HANDLER)
+/**
+ * Structure containing HDA stream debug stuff, configurable at runtime.
+ */
+typedef struct HDASTREAMDBGINFORT
+{
+    /** Whether debugging is enabled or not. */
+    bool                     fEnabled;
+    uint8_t                  Padding[7];
+    /** File for dumping stream reads / writes.
+     *  For input streams, this dumps data being written to the device FIFO,
+     *  whereas for output streams this dumps data being read from the device FIFO. */
+    R3PTRTYPE(PPDMAUDIOFILE) pFileStream;
+    /** File for dumping DMA reads / writes.
+     *  For input streams, this dumps data being written to the device DMA,
+     *  whereas for output streams this dumps data being read from the device DMA. */
+    R3PTRTYPE(PPDMAUDIOFILE) pFileDMA;
+} HDASTREAMDBGINFORT, *PHDASTREAMDBGINFORT;
+
+/**
+ * Structure containing HDA stream debug information.
+ */
 typedef struct HDASTREAMDBGINFO
 {
+#ifdef DEBUG
     /** Critical section to serialize access if needed. */
     RTCRITSECT              CritSect;
-    uint32_t                Padding1[2];
+    uint32_t                Padding0[2];
     /** Number of total read accesses. */
     uint64_t                cReadsTotal;
     /** Number of total DMA bytes read. */
@@ -80,8 +101,10 @@ typedef struct HDASTREAMDBGINFO
     /** How many bytes to skip in an audio stream before detecting silence.
      *  (useful for intros and silence at the beginning of a song). */
     uint64_t                cbSilenceReadMin;
+#endif
+    /** Runtime debug info. */
+    HDASTREAMDBGINFORT      Runtime;
 } HDASTREAMDBGINFO ,*PHDASTREAMDBGINFO;
-#endif /* defined (DEBUG) || defined(HDA_USE_DMA_ACCESS_HANDLER) */
 
 /**
  * Internal state of a HDA stream.
@@ -108,9 +131,33 @@ typedef struct HDASTREAMSTATE
     HDABDLE                 BDLE;
     /** Circular buffer (FIFO) for holding DMA'ed data. */
     R3PTRTYPE(PRTCIRCBUF)   pCircBuf;
-    /** Timestamp of the last success DMA data transfer.
-     *  Used to calculate the time actually elapsed between two transfers. */
-    uint64_t                uTimerTS;
+    /** Timestamp of the last DMA data transfer. */
+    uint64_t                tsTransferLast;
+    /** Timestamp of the next DMA data transfer.
+     *  Next for determining the next scheduling window.
+     *  Can be 0 if no next transfer is scheduled. */
+    uint64_t                tsTransferNext;
+    /** Total transfer size (in bytes) of a transfer period. */
+    uint32_t                cbTransferSize;
+    /** Transfer chunk size (in bytes) of a transfer period. */
+    uint32_t                cbTransferChunk;
+    /** How many bytes already have been processed in within
+     *  the current transfer period. */
+    uint32_t                cbTransferProcessed;
+    /** How many interrupts are pending due to
+     *  BDLE interrupt-on-completion (IOC) bits set. */
+    uint8_t                 cTransferPendingInterrupts;
+    uint8_t                 Padding1[4];
+    /** How many audio data frames are left to be processed
+     *  for the position adjustment handling.
+     *
+     *  0 if position adjustment handling is done or inactive. */
+    uint16_t                cPosAdjustFramesLeft;
+    uint8_t                 Padding2[2];
+    /** (Virtual) clock ticks per byte. */
+    uint64_t                cTicksPerByte;
+    /** (Virtual) clock ticks per transfer. */
+    uint64_t                cTransferTicks;
     /** The stream's period. Need for timing. */
     HDASTREAMPERIOD         Period;
     /** The stream's current configuration.
@@ -121,7 +168,7 @@ typedef struct HDASTREAMSTATE
     RTLISTANCHORR3          lstDMAHandlers;
 #endif
     /** Unused, padding. */
-    uint8_t                 Padding1[3];
+    uint8_t                 Padding3[3];
 } HDASTREAMSTATE, *PHDASTREAMSTATE;
 
 /**
@@ -165,10 +212,8 @@ typedef struct HDASTREAM
     R3PTRTYPE(PHDAMIXERSINK) pMixSink;
     /** Internal state of this stream. */
     HDASTREAMSTATE           State;
-#ifdef DEBUG
     /** Debug information. */
     HDASTREAMDBGINFO         Dbg;
-#endif
 } HDASTREAM, *PHDASTREAM;
 
 #ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
@@ -187,19 +232,22 @@ typedef struct HDASTREAMTHREADCTX
 /** @name Stream functions.
  * @{
  */
-int               hdaStreamCreate(PHDASTREAM pStream, PHDASTATE pThis);
+int               hdaStreamCreate(PHDASTREAM pStream, PHDASTATE pThis, uint8_t u8SD);
 void              hdaStreamDestroy(PHDASTREAM pStream);
 int               hdaStreamInit(PHDASTREAM pStream, uint8_t uSD);
 void              hdaStreamReset(PHDASTATE pThis, PHDASTREAM pStream, uint8_t uSD);
 int               hdaStreamEnable(PHDASTREAM pStream, bool fEnable);
-uint32_t          hdaStreamGetUsed(PHDASTREAM pStream);
+uint32_t          hdaStreamGetPosition(PHDASTATE pThis, PHDASTREAM pStream);
+void              hdaStreamSetPosition(PHDASTREAM pStream, uint32_t u32LPIB);
 uint32_t          hdaStreamGetFree(PHDASTREAM pStream);
+uint32_t          hdaStreamGetUsed(PHDASTREAM pStream);
+bool              hdaStreamTransferIsScheduled(PHDASTREAM pStream);
+uint64_t          hdaStreamTransferGetNext(PHDASTREAM pStream);
 int               hdaStreamTransfer(PHDASTREAM pStream, uint32_t cbToProcessMax);
-uint32_t          hdaStreamUpdateLPIB(PHDASTREAM pStream, uint32_t u32LPIB);
 void              hdaStreamLock(PHDASTREAM pStream);
 void              hdaStreamUnlock(PHDASTREAM pStream);
 int               hdaStreamRead(PHDASTREAM pStream, uint32_t cbToRead, uint32_t *pcbRead);
-int               hdaStreamWrite(PHDASTREAM pStream, uint32_t cbToWrite, uint32_t *pcbWritten);
+int               hdaStreamWrite(PHDASTREAM pStream, const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten);
 void              hdaStreamUpdate(PHDASTREAM pStream, bool fAsync);
 # ifdef HDA_USE_DMA_ACCESS_HANDLER
 bool              hdaStreamRegisterDMAHandlers(PHDASTREAM pStream);
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd
index e8b03fc..1d7af53 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 0914b33..d77f48b 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/VBoxVgaBiosAlternative286.asm b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.asm
index e74bf7c..a368ebc 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.asm
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.asm
@@ -7395,7 +7395,7 @@ vesa_pm_end:                                 ; 0xc4514 LB 0x1
 
 section _DATA progbits vstart=0x4600 align=1 ; size=0x3726 class=DATA group=DGROUP
 _msg_vga_init:                               ; 0xc4600 LB 0x2e
-    db  'Oracle VM VirtualBox Version 5.2.1 VGA BIOS', 00dh, 00ah, 000h
+    db  'Oracle VM VirtualBox Version 5.2.4 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
@@ -8292,7 +8292,7 @@ _vbebios_vendor_name:                        ; 0xc7c7b LB 0x13
 _vbebios_product_name:                       ; 0xc7c8e LB 0x21
     db  'Oracle VM VirtualBox VBE Adapter', 000h
 _vbebios_product_revision:                   ; 0xc7caf LB 0x23
-    db  'Oracle VM VirtualBox Version 5.2.1', 000h
+    db  'Oracle VM VirtualBox Version 5.2.4', 000h
 _vbebios_info_string:                        ; 0xc7cd2 LB 0x2b
     db  'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h
 _no_vbebios_info_string:                     ; 0xc7cfd LB 0x29
@@ -8304,7 +8304,8 @@ section CONST2 progbits vstart=0x7d26 align=1 ; size=0x0 class=DATA group=DGROUP
 
   ; Padding 0x2da bytes at 0xc7d26
     db  001h, 000h, 000h, 000h, 000h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 02fh, 068h, 06fh, 06dh
-    db  065h, 02fh, 076h, 062h, 06fh, 078h, 02fh, 076h, 062h, 06fh, 078h, 02dh, 048h, 045h, 041h, 044h
+    db  065h, 02fh, 06dh, 069h, 063h, 068h, 061h, 065h, 06ch, 02fh, 076h, 062h, 06fh, 078h, 02fh, 062h
+    db  072h, 061h, 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h, 06fh, 078h, 02dh, 035h, 02eh, 032h
     db  02fh, 06fh, 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h, 02eh, 061h, 06dh, 064h, 036h, 034h
     db  02fh, 072h, 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh, 062h, 06ah, 02fh, 056h, 042h, 06fh
     db  078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 032h, 038h, 036h, 02fh, 056h, 042h, 06fh, 078h
@@ -8347,5 +8348,4 @@ section CONST2 progbits vstart=0x7d26 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, 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, 0b8h
+    db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum
index b1c353a..2e6db6a 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative286.md5sum
@@ -1 +1 @@
-0a8ed06db12a4cce4466ea0a587c9594 *VBoxVgaBios286.rom
+0c7b34d9ae7de4eec867b5fb6bf8fcb8 *VBoxVgaBios286.rom
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm
index 9de48f8..3d875bf 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.asm
@@ -6867,7 +6867,7 @@ vesa_pm_end:                                 ; 0xc4514 LB 0x1
 
 section _DATA progbits vstart=0x4600 align=1 ; size=0x3726 class=DATA group=DGROUP
 _msg_vga_init:                               ; 0xc4600 LB 0x2e
-    db  'Oracle VM VirtualBox Version 5.2.1 VGA BIOS', 00dh, 00ah, 000h
+    db  'Oracle VM VirtualBox Version 5.2.4 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
@@ -7764,7 +7764,7 @@ _vbebios_vendor_name:                        ; 0xc7c7b LB 0x13
 _vbebios_product_name:                       ; 0xc7c8e LB 0x21
     db  'Oracle VM VirtualBox VBE Adapter', 000h
 _vbebios_product_revision:                   ; 0xc7caf LB 0x23
-    db  'Oracle VM VirtualBox Version 5.2.1', 000h
+    db  'Oracle VM VirtualBox Version 5.2.4', 000h
 _vbebios_info_string:                        ; 0xc7cd2 LB 0x2b
     db  'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h
 _no_vbebios_info_string:                     ; 0xc7cfd LB 0x29
@@ -7776,7 +7776,8 @@ section CONST2 progbits vstart=0x7d26 align=1 ; size=0x0 class=DATA group=DGROUP
 
   ; Padding 0x2da bytes at 0xc7d26
     db  001h, 000h, 000h, 000h, 000h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 02fh, 068h, 06fh, 06dh
-    db  065h, 02fh, 076h, 062h, 06fh, 078h, 02fh, 076h, 062h, 06fh, 078h, 02dh, 048h, 045h, 041h, 044h
+    db  065h, 02fh, 06dh, 069h, 063h, 068h, 061h, 065h, 06ch, 02fh, 076h, 062h, 06fh, 078h, 02fh, 062h
+    db  072h, 061h, 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h, 06fh, 078h, 02dh, 035h, 02eh, 032h
     db  02fh, 06fh, 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h, 02eh, 061h, 06dh, 064h, 036h, 034h
     db  02fh, 072h, 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh, 062h, 06ah, 02fh, 056h, 042h, 06fh
     db  078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 033h, 038h, 036h, 02fh, 056h, 042h, 06fh, 078h
@@ -7819,5 +7820,4 @@ section CONST2 progbits vstart=0x7d26 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, 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, 02dh
+    db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 06dh
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum
index 2ed0b2a..2c6f2ed 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative386.md5sum
@@ -1 +1 @@
-fe9b994ac5d3fc8e32e1c55bcd1507f0 *VBoxVgaBios386.rom
+f49e4a20056fe0d6fde5b047a81304c7 *VBoxVgaBios386.rom
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm
index 7a8eccd..db833e7 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.asm
@@ -7514,7 +7514,7 @@ vesa_pm_end:                                 ; 0xc4514 LB 0x1
 
 section _DATA progbits vstart=0x4600 align=1 ; size=0x3726 class=DATA group=DGROUP
 _msg_vga_init:                               ; 0xc4600 LB 0x2e
-    db  'Oracle VM VirtualBox Version 5.2.1 VGA BIOS', 00dh, 00ah, 000h
+    db  'Oracle VM VirtualBox Version 5.2.4 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
@@ -8411,7 +8411,7 @@ _vbebios_vendor_name:                        ; 0xc7c7b LB 0x13
 _vbebios_product_name:                       ; 0xc7c8e LB 0x21
     db  'Oracle VM VirtualBox VBE Adapter', 000h
 _vbebios_product_revision:                   ; 0xc7caf LB 0x23
-    db  'Oracle VM VirtualBox Version 5.2.1', 000h
+    db  'Oracle VM VirtualBox Version 5.2.4', 000h
 _vbebios_info_string:                        ; 0xc7cd2 LB 0x2b
     db  'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h
 _no_vbebios_info_string:                     ; 0xc7cfd LB 0x29
@@ -8423,7 +8423,8 @@ section CONST2 progbits vstart=0x7d26 align=1 ; size=0x0 class=DATA group=DGROUP
 
   ; Padding 0x2da bytes at 0xc7d26
     db  001h, 000h, 000h, 000h, 000h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 02fh, 068h, 06fh, 06dh
-    db  065h, 02fh, 076h, 062h, 06fh, 078h, 02fh, 076h, 062h, 06fh, 078h, 02dh, 048h, 045h, 041h, 044h
+    db  065h, 02fh, 06dh, 069h, 063h, 068h, 061h, 065h, 06ch, 02fh, 076h, 062h, 06fh, 078h, 02fh, 062h
+    db  072h, 061h, 06eh, 063h, 068h, 065h, 073h, 02fh, 056h, 042h, 06fh, 078h, 02dh, 035h, 02eh, 032h
     db  02fh, 06fh, 075h, 074h, 02fh, 06ch, 069h, 06eh, 075h, 078h, 02eh, 061h, 06dh, 064h, 036h, 034h
     db  02fh, 072h, 065h, 06ch, 065h, 061h, 073h, 065h, 02fh, 06fh, 062h, 06ah, 02fh, 056h, 042h, 06fh
     db  078h, 056h, 067h, 061h, 042h, 069h, 06fh, 073h, 038h, 030h, 038h, 036h, 02fh, 056h, 042h, 06fh
@@ -8466,5 +8467,4 @@ section CONST2 progbits vstart=0x7d26 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, 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, 01ch
+    db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 05ch
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum
index 89f14a2..a39afa5 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative8086.md5sum
@@ -1 +1 @@
-2215881c29ab66c90cf34cfb24feca14 *VBoxVgaBios8086.rom
+d6d1139ff4c4f2d11a8ac13decdfe052 *VBoxVgaBios8086.rom
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm
index 98d5b37..ad4cf79 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.asm
@@ -1172,7 +1172,7 @@ section CONST progbits vstart=0xb0 align=1 ; size=0xcde class=DATA group=DGROUP
 
 section CONST2 progbits vstart=0xd8e align=1 ; size=0x3fa class=DATA group=DGROUP
 _bios_cvs_version_string:                    ; 0xf0d8e LB 0x12
-    db  'VirtualBox 5.2.1', 000h, 000h
+    db  'VirtualBox 5.2.4', 000h, 000h
 _bios_prefix_string:                         ; 0xf0da0 LB 0x8
     db  'BIOS: ', 000h, 000h
 _isotag:                                     ; 0xf0da8 LB 0x6
@@ -17873,4 +17873,4 @@ biosorg_check_before_or_at_0FFEEh:           ; 0xfff80 LB 0x70
     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, 0e2h
+    db  030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 0dfh
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum
index 227f052..95640cf 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative286.md5sum
@@ -1 +1 @@
-c261b97dc1abd60dfc55069d7e88f4d4 *VBoxPcBios286.rom
+8557df9ac70db63a31d484fb3df58f5f *VBoxPcBios286.rom
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm
index bff4fa2..63b8fe7 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.asm
@@ -1136,7 +1136,7 @@ section CONST progbits vstart=0xb0 align=1 ; size=0xcf0 class=DATA group=DGROUP
 
 section CONST2 progbits vstart=0xda0 align=1 ; size=0x3fa class=DATA group=DGROUP
 _bios_cvs_version_string:                    ; 0xf0da0 LB 0x12
-    db  'VirtualBox 5.2.1', 000h, 000h
+    db  'VirtualBox 5.2.4', 000h, 000h
 _bios_prefix_string:                         ; 0xf0db2 LB 0x8
     db  'BIOS: ', 000h, 000h
 _isotag:                                     ; 0xf0dba LB 0x6
@@ -17367,4 +17367,4 @@ biosorg_check_before_or_at_0FFEEh:           ; 0xfff80 LB 0x70
     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, 00dh
+    db  030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 00ah
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum
index abee6ca..5137fa3 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative386.md5sum
@@ -1 +1 @@
-57e78d26806ffff3c47bd4a6c904409d *VBoxPcBios386.rom
+06158dec218592a330940d18297f3fef *VBoxPcBios386.rom
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm
index a2dc9dc..691902b 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.asm
@@ -1172,7 +1172,7 @@ section CONST progbits vstart=0xb0 align=1 ; size=0xcde class=DATA group=DGROUP
 
 section CONST2 progbits vstart=0xd8e align=1 ; size=0x3fa class=DATA group=DGROUP
 _bios_cvs_version_string:                    ; 0xf0d8e LB 0x12
-    db  'VirtualBox 5.2.1', 000h, 000h
+    db  'VirtualBox 5.2.4', 000h, 000h
 _bios_prefix_string:                         ; 0xf0da0 LB 0x8
     db  'BIOS: ', 000h, 000h
 _isotag:                                     ; 0xf0da8 LB 0x6
@@ -18294,4 +18294,4 @@ biosorg_check_before_or_at_0FFEEh:           ; 0xfff80 LB 0x70
     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, 0fbh, 03bh
+    db  030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fbh, 038h
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum
index ef79f1c..5ee3bb2 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative8086.md5sum
@@ -1 +1 @@
-207716e29c72bfe4132e99cbcdb86960 *VBoxPcBios8086.rom
+7a8334c6ccb6240d6ce6088907947b15 *VBoxPcBios8086.rom
diff --git a/src/VBox/Devices/Serial/DrvHostSerial.cpp b/src/VBox/Devices/Serial/DrvHostSerial.cpp
index d6eb10a..f04f514 100644
--- a/src/VBox/Devices/Serial/DrvHostSerial.cpp
+++ b/src/VBox/Devices/Serial/DrvHostSerial.cpp
@@ -336,7 +336,8 @@ static DECLCALLBACK(int) drvHostSerialSetParameters(PPDMICHARCONNECTOR pInterfac
      * modem irqs and so the monitor thread never gets released. The workaround
      * is to send a signal after each tcsetattr.
      */
-    RTThreadPoke(pThis->pMonitorThread->Thread);
+    if (RT_LIKELY(pThis->pMonitorThread != NULL))
+        RTThreadPoke(pThis->pMonitorThread->Thread);
 #endif
 
 #elif defined(RT_OS_WINDOWS)
diff --git a/src/VBox/Devices/USB/DevOHCI.cpp b/src/VBox/Devices/USB/DevOHCI.cpp
index fcef963..f9d8aeb 100644
--- a/src/VBox/Devices/USB/DevOHCI.cpp
+++ b/src/VBox/Devices/USB/DevOHCI.cpp
@@ -1356,7 +1356,7 @@ static void physReadStatsUpdateDesc(POHCIDESCREADSTATS p, uint32_t u32Addr)
     }
 }
 
-static void physReadStatsPrint(PCOHCIPHYSREADSTATS p)
+static void physReadStatsPrint(POHCIPHYSREADSTATS p)
 {
     p->ed.cMinReadsPerPage = RT_MIN(p->ed.cMinReadsPerPage, p->ed.cReadsLastPage);
     p->ed.cMaxReadsPerPage = RT_MAX(p->ed.cMaxReadsPerPage, p->ed.cReadsLastPage);;
@@ -1452,17 +1452,6 @@ static void ohciPhysCacheUpdate(POHCIPAGECACHE pPageCache, RTGCPHYS GCPhys, cons
     }
 }
 
-static void ohciReadEdCached(POHCI pThis, uint32_t EdAddr, POHCIED pEd)
-{
-    ohciPhysReadCacheRead(pThis, pThis->pCacheED, EdAddr, pEd, sizeof(*pEd));
-}
-
-static void ohciReadTdCached(POHCI pThis, uint32_t TdAddr, POHCITD pTd)
-{
-    ohciPhysReadCacheRead(pThis, pThis->pCacheTD, TdAddr, pTd, sizeof(*pTd));
-}
-
-
 /**
  * Update any cached ED data with the given endpoint descriptor at the given address.
  *
@@ -1473,7 +1462,7 @@ static void ohciReadTdCached(POHCI pThis, uint32_t TdAddr, POHCITD pTd)
  */
 DECLINLINE(void) ohciCacheEdUpdate(POHCI pThis, RTGCPHYS32 EdAddr, PCOHCIED pEd)
 {
-    ohciPhysCacheUpdate(pThis->pCacheED, EdAddr, pEd, sizeof(*pEd));
+    ohciPhysCacheUpdate(pThis->pCacheED, EdAddr + RT_OFFSETOF(OHCIED, HeadP), &pEd->HeadP, sizeof(uint32_t));
 }
 
 
@@ -1501,7 +1490,11 @@ DECLINLINE(void) ohciReadEd(POHCI pThis, uint32_t EdAddr, POHCIED pEd)
     physReadStatsUpdateDesc(&g_PhysReadState.ed, EdAddr);
     physReadStatsUpdateDesc(&g_PhysReadState.all, EdAddr);
 # endif
+#ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
+    ohciPhysReadCacheRead(pThis, pThis->pCacheED, EdAddr, pEd, sizeof(*pEd));
+#else
     ohciGetDWords(pThis, EdAddr, (uint32_t *)pEd, sizeof(*pEd) >> 2);
+#endif
 }
 
 /**
@@ -1513,7 +1506,11 @@ DECLINLINE(void) ohciReadTd(POHCI pThis, uint32_t TdAddr, POHCITD pTd)
     physReadStatsUpdateDesc(&g_PhysReadState.td, TdAddr);
     physReadStatsUpdateDesc(&g_PhysReadState.all, TdAddr);
 # endif
+#ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
+    ohciPhysReadCacheRead(pThis, pThis->pCacheTD, TdAddr, pTd, sizeof(*pTd));
+#else
     ohciGetDWords(pThis, TdAddr, (uint32_t *)pTd, sizeof(*pTd) >> 2);
+#endif
 # ifdef LOG_ENABLED
     if (LogIs3Enabled())
     {
@@ -1623,7 +1620,7 @@ DECLINLINE(void) ohciWriteEd(POHCI pThis, uint32_t EdAddr, PCOHCIED pEd)
     }
 # endif
 
-    ohciPutDWords(pThis, EdAddr, (uint32_t *)pEd, sizeof(*pEd) >> 2);
+    ohciPutDWords(pThis, EdAddr + RT_OFFSETOF(OHCIED, HeadP), &pEd->HeadP, 1);
 #ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
     ohciCacheEdUpdate(pThis, EdAddr, pEd);
 #endif
@@ -2469,8 +2466,48 @@ static uint32_t ohciVUsbStatus2OhciStatus(VUSBSTATUS enmStatus)
     }
 }
 
+
 /**
- * Worker for ohciRhXferCompletion that handles the completion of
+ * Lock the given OHCI controller instance.
+ *
+ * @returns nothing.
+ * @param   pThis               The OHCI controller instance to lock.
+ */
+DECLINLINE(void) ohciR3Lock(POHCI pThis)
+{
+    RTCritSectEnter(&pThis->CritSect);
+
+# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
+    /* Clear all caches here to avoid reading stale data from previous lock holders. */
+    ohciPhysReadCacheClear(pThis->pCacheED);
+    ohciPhysReadCacheClear(pThis->pCacheTD);
+# endif
+}
+
+
+/**
+ * Unlocks the given OHCI controller instance.
+ *
+ * @returns nothing.
+ * @param   pThis               The OHCI controller instance to unlock.
+ */
+DECLINLINE(void) ohciR3Unlock(POHCI pThis)
+{
+# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
+    /*
+     * Clear all caches here to avoid leaving stale data behind (paranoia^2,
+     * already done in ohciR3Lock).
+     */
+    ohciPhysReadCacheClear(pThis->pCacheED);
+    ohciPhysReadCacheClear(pThis->pCacheTD);
+# endif
+
+    RTCritSectLeave(&pThis->CritSect);
+}
+
+
+/**
+ * Worker for ohciR3RhXferCompletion that handles the completion of
  * a URB made up of isochronous TDs.
  *
  * In general, all URBs should have status OK.
@@ -2775,7 +2812,7 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
     LogFlow(("%s: ohciRhXferCompletion: EdAddr=%#010RX32 cTds=%d TdAddr0=%#010RX32\n",
              pUrb->pszDesc, pUrb->pHci->EdAddr, pUrb->pHci->cTds, pUrb->paTds[0].TdAddr));
 
-    RTCritSectEnter(&pThis->CritSect);
+    ohciR3Lock(pThis);
     pThis->fIdle = false;   /* Mark as active */
 
     /* get the current end point descriptor. */
@@ -2799,7 +2836,7 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
         Log(("%s: ohciRhXferCompletion: CANCELED {ED=%#010x cTds=%d TD0=%#010x age %d}\n",
              pUrb->pszDesc, pUrb->pHci->EdAddr, pUrb->pHci->cTds, pUrb->paTds[0].TdAddr, cFmAge));
         STAM_COUNTER_INC(&pThis->StatDroppedUrbs);
-        RTCritSectLeave(&pThis->CritSect);
+        ohciR3Unlock(pThis);
         return;
     }
     bool fHasBeenCanceled = false;
@@ -2819,7 +2856,7 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
              fHasBeenCanceled                                       ? " td canceled" : ""));
         NOREF(fHasBeenCanceled);
         STAM_COUNTER_INC(&pThis->StatDroppedUrbs);
-        RTCritSectLeave(&pThis->CritSect);
+        ohciR3Unlock(pThis);
         return;
     }
 
@@ -2834,8 +2871,7 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
 
     /* finally write back the endpoint descriptor. */
     ohciWriteEd(pThis, pUrb->pHci->EdAddr, &Ed);
-
-    RTCritSectLeave(&pThis->CritSect);
+    ohciR3Unlock(pThis);
 }
 
 
@@ -2869,8 +2905,7 @@ static DECLCALLBACK(bool) ohciRhXferError(PVUSBIROOTHUBPORT pInterface, PVUSBURB
         return true;
     }
 
-    RTCritSectEnter(&pThis->CritSect);
-
+    ohciR3Lock(pThis);
     bool fRetire = false;
     /*
      * Check if the TDs still are valid.
@@ -2904,7 +2939,7 @@ static DECLCALLBACK(bool) ohciRhXferError(PVUSBIROOTHUBPORT pInterface, PVUSBURB
             Log2(("%s: ohciRhXferError: cErrs=%d: retrying...\n", pUrb->pszDesc, cErrs));
     }
 
-    RTCritSectLeave(&pThis->CritSect);
+    ohciR3Unlock(pThis);
     return fRetire;
 }
 
@@ -2988,9 +3023,9 @@ static bool ohciServiceTd(POHCI pThis, VUSBXFERTYPE enmType, PCOHCIED pEd, uint3
     Log(("%s: ohciServiceTd: submitting TdAddr=%#010x EdAddr=%#010x cbData=%#x\n",
          pUrb->pszDesc, TdAddr, EdAddr, pUrb->cbData));
 
-    RTCritSectLeave(&pThis->CritSect);
+    ohciR3Unlock(pThis);
     int rc = VUSBIRhSubmitUrb(pThis->RootHub.pIRhConn, pUrb, &pThis->RootHub.Led);
-    RTCritSectEnter(&pThis->CritSect);
+    ohciR3Lock(pThis);
     if (RT_SUCCESS(rc))
         return true;
 
@@ -3048,11 +3083,7 @@ static bool ohciServiceTdMultiple(POHCI pThis, VUSBXFERTYPE enmType, PCOHCIED pE
 # endif
 
     /* read the head */
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-    ohciReadTdCached(pThis, TdAddr, &Head.Td);
-# else
     ohciReadTd(pThis, TdAddr, &Head.Td);
-# endif
     ohciBufInit(&Head.Buf, Head.Td.cbp, Head.Td.be);
     Head.TdAddr = TdAddr;
     Head.pNext = NULL;
@@ -3070,11 +3101,7 @@ static bool ohciServiceTdMultiple(POHCI pThis, VUSBXFERTYPE enmType, PCOHCIED pE
 
         pCur->pNext = NULL;
         pCur->TdAddr = pTail->Td.NextTD & ED_PTR_MASK;
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-        ohciReadTdCached(pThis, pCur->TdAddr, &pCur->Td);
-# else
         ohciReadTd(pThis, pCur->TdAddr, &pCur->Td);
-# endif
         ohciBufInit(&pCur->Buf, pCur->Td.cbp, pCur->Td.be);
 
         /* Don't combine if the direction doesn't match up. There can't actually be
@@ -3165,9 +3192,9 @@ static bool ohciServiceTdMultiple(POHCI pThis, VUSBXFERTYPE enmType, PCOHCIED pE
     ohci_in_flight_add_urb(pThis, pUrb);
     Log(("%s: ohciServiceTdMultiple: submitting cbData=%#x EdAddr=%#010x cTds=%d TdAddr0=%#010x\n",
          pUrb->pszDesc, pUrb->cbData, EdAddr, cTds, TdAddr));
-    RTCritSectLeave(&pThis->CritSect);
+    ohciR3Unlock(pThis);
     int rc = VUSBIRhSubmitUrb(pThis->RootHub.pIRhConn, pUrb, &pThis->RootHub.Led);
-    RTCritSectEnter(&pThis->CritSect);
+    ohciR3Lock(pThis);
     if (RT_SUCCESS(rc))
         return true;
 
@@ -3391,9 +3418,9 @@ static bool ohciServiceIsochronousTd(POHCI pThis, POHCIITD pITd, uint32_t ITdAdd
     ohci_in_flight_add_urb(pThis, pUrb);
     Log(("%s: ohciServiceIsochronousTd: submitting cbData=%#x cIsocPkts=%d EdAddr=%#010x TdAddr=%#010x SF=%#x (%#x)\n",
          pUrb->pszDesc, pUrb->cbData, pUrb->cIsocPkts, EdAddr, ITdAddr, pITd->HwInfo & ITD_HWINFO_SF, pThis->HcFmNumber));
-    RTCritSectLeave(&pThis->CritSect);
+    ohciR3Unlock(pThis);
     int rc = VUSBIRhSubmitUrb(pThis->RootHub.pIRhConn, pUrb, &pThis->RootHub.Led);
-    RTCritSectEnter(&pThis->CritSect);
+    ohciR3Lock(pThis);
     if (RT_SUCCESS(rc))
         return true;
 
@@ -3579,11 +3606,7 @@ static void ohciServiceBulkList(POHCI pThis)
     while (EdAddr)
     {
         OHCIED Ed;
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-        ohciReadEdCached(pThis, EdAddr, &Ed);
-# else
         ohciReadEd(pThis, EdAddr, &Ed);
-# endif
         Assert(!(Ed.hwinfo & ED_HWINFO_ISO)); /* the guest is screwing us */
         if (ohciIsEdReady(&Ed))
         {
@@ -3677,11 +3700,8 @@ static void ohciUndoBulkList(POHCI pThis)
     while (EdAddr)
     {
         OHCIED Ed;
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-        ohciReadEdCached(pThis, EdAddr, &Ed);
-# else
+
         ohciReadEd(pThis, EdAddr, &Ed);
-# endif
         Assert(!(Ed.hwinfo & ED_HWINFO_ISO)); /* the guest is screwing us */
         if (ohciIsEdPresent(&Ed))
         {
@@ -3798,12 +3818,8 @@ static void ohciServicePeriodicList(POHCI pThis)
     while (EdAddr)
     {
         OHCIED Ed;
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-        ohciReadEdCached(pThis, EdAddr, &Ed);
-# else
-        ohciReadEd(pThis, EdAddr, &Ed);
-# endif
 
+        ohciReadEd(pThis, EdAddr, &Ed);
         if (ohciIsEdReady(&Ed))
         {
             /*
@@ -3966,11 +3982,8 @@ static void ohciCancelOrphanedURBs(POHCI pThis)
         {
             OHCIED Ed;
             OHCITD Td;
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-            ohciReadEdCached(pThis, EdAddr, &Ed);
-# else
+
             ohciReadEd(pThis, EdAddr, &Ed);
-# endif
             uint32_t TdAddr = Ed.HeadP & ED_PTR_MASK;
             uint32_t TailP  = Ed.TailP & ED_PTR_MASK;
             unsigned k = 0;
@@ -3982,11 +3995,7 @@ static void ohciCancelOrphanedURBs(POHCI pThis)
 # endif
                 do
                 {
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-                    ohciReadTdCached(pThis, TdAddr, &Td);
-# else
                     ohciReadTd(pThis, TdAddr, &Td);
-# endif
                     j = ohci_in_flight_find(pThis, TdAddr);
                     if (j > -1)
                         pThis->aInFlight[j].fInactive = false;
@@ -4149,7 +4158,7 @@ static DECLCALLBACK(bool) ohciR3StartFrame(PVUSBIROOTHUBPORT pInterface, uint32_
     RT_NOREF(u32FrameNo);
     POHCI pThis = VUSBIROOTHUBPORT_2_OHCI(pInterface);
 
-    RTCritSectEnter(&pThis->CritSect);
+    ohciR3Lock(pThis);
 
     /* Reset idle detection flag */
     pThis->fIdle = true;
@@ -4158,11 +4167,6 @@ static DECLCALLBACK(bool) ohciR3StartFrame(PVUSBIROOTHUBPORT pInterface, uint32_
     physReadStatsReset(&g_PhysReadState);
 # endif
 
-# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
-    ohciPhysReadCacheClear(pThis->pCacheED);
-    ohciPhysReadCacheClear(pThis->pCacheTD);
-# endif
-
     /* Frame boundary, so do EOF stuff here. */
     bump_frame_number(pThis);
     if ( (pThis->dqic != 0x7) && (pThis->dqic != 0))
@@ -4178,8 +4182,7 @@ static DECLCALLBACK(bool) ohciR3StartFrame(PVUSBIROOTHUBPORT pInterface, uint32_
     physReadStatsPrint(&g_PhysReadState);
 # endif
 
-    RTCritSectLeave(&pThis->CritSect);
-
+    ohciR3Unlock(pThis);
     return pThis->fIdle;
 }
 
diff --git a/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp b/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
index 1afeb1b..92a6bcf 100644
--- a/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
+++ b/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
@@ -1846,6 +1846,11 @@ int main()
     GEN_CHECK_OFF(HDASTREAMSTATE, BDLE);
     GEN_CHECK_OFF(HDASTREAMSTATE, pCircBuf);
 
+    GEN_CHECK_SIZE(HDASTREAMDBGINFORT);
+
+    GEN_CHECK_SIZE(HDASTREAMDBGINFO);
+    GEN_CHECK_OFF(HDASTREAMDBGINFO, Runtime);
+
     GEN_CHECK_SIZE(HDASTREAM);
     GEN_CHECK_OFF(HDASTREAM, u8SD);
     GEN_CHECK_OFF(HDASTREAM, u64BDLBase);
@@ -1853,6 +1858,7 @@ int main()
     GEN_CHECK_OFF(HDASTREAM, u16FIFOS);
     GEN_CHECK_OFF(HDASTREAM, u16LVI);
     GEN_CHECK_OFF(HDASTREAM, State);
+    GEN_CHECK_OFF(HDASTREAM, Dbg);
 
     GEN_CHECK_SIZE(HDASTATE);
     GEN_CHECK_OFF(HDASTATE, PciDev);
@@ -1876,7 +1882,6 @@ int main()
     GEN_CHECK_OFF(HDASTATE, fRCEnabled);
 #ifndef VBOX_WITH_AUDIO_CALLBACKS
     GEN_CHECK_OFF(HDASTATE, pTimer);
-    GEN_CHECK_OFF(HDASTATE, cTimerTicks);
 #endif
 #ifdef VBOX_WITH_STATISTICS
 # ifndef VBOX_WITH_AUDIO_CALLBACKS
@@ -1899,6 +1904,7 @@ int main()
 #endif
     GEN_CHECK_OFF(HDASTATE, u64WalClk);
     GEN_CHECK_OFF(HDASTATE, u16RespIntCnt);
+    GEN_CHECK_OFF(HDASTATE, cPosAdjustFrames);
     GEN_CHECK_OFF(HDASTATE, u8IRQL);
 
 #ifdef VBOX_WITH_NVME_IMPL
diff --git a/src/VBox/Frontends/VirtualBox/Makefile.kmk b/src/VBox/Frontends/VirtualBox/Makefile.kmk
index c715cd5..533ac90 100644
--- a/src/VBox/Frontends/VirtualBox/Makefile.kmk
+++ b/src/VBox/Frontends/VirtualBox/Makefile.kmk
@@ -135,7 +135,6 @@ VirtualBox_DEFS           += \
 	$(if $(VBOX_WITH_VIRTIO),VBOX_WITH_VIRTIO) \
 	$(if $(VBOX_WITH_WDDM),VBOX_WITH_WDDM) \
 	$(if $(VBOX_WITH_CROGL),VBOX_WITH_CROGL) \
-	$(if $(VBOX_GUI_WITH_HIDPI),VBOX_GUI_WITH_HIDPI) \
 	$(if $(VBOX_GUI_WITH_PIDFILE),VBOX_GUI_WITH_PIDFILE) \
 	$(if $(VBOX_GUI_WITH_KEYS_RESET_HANDLER),VBOX_GUI_WITH_KEYS_RESET_HANDLER) \
 	$(if $(VBOX_GUI_WITH_CUSTOMIZATIONS1),VBOX_GUI_WITH_CUSTOMIZATIONS1) \
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
index 4adc6c5..41cde38 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
@@ -171,7 +171,7 @@
 <context>
     <name>QIMessageBox</name>
     <message>
-        <location filename="../src/extensions/QIMessageBox.cpp" line="+302"/>
+        <location filename="../src/extensions/QIMessageBox.cpp" line="+299"/>
         <location filename="../src/globals/UIMessageCenter.cpp" line="+1887"/>
         <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="+180"/>
         <source>OK</source>
@@ -1680,7 +1680,7 @@
         <translation>Aurreikuspen Monitorea %1</translation>
     </message>
     <message>
-        <location line="+1605"/>
+        <location line="+1608"/>
         <source>&Connect Network Adapter</source>
         <translation>&Elkarketatu Sare Egokitzailea</translation>
     </message>
@@ -3242,7 +3242,7 @@
 <context>
     <name>UIGMachinePreview</name>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="+356"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="+365"/>
         <source>Every 0.5 s</source>
         <translation>0.5 seg-tik behin</translation>
     </message>
@@ -7074,7 +7074,7 @@
         <translation type="obsolete">Hautaturiko agiritegi elkarbanatu adiera kentzen du.</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsSF.cpp" line="+623"/>
+        <location filename="../src/settings/machine/UIMachineSettingsSF.cpp" line="+625"/>
         <source> Machine Folders</source>
         <translation> Makina Agiritegiak</translation>
     </message>
@@ -7084,12 +7084,12 @@
         <translation> Aldaketa agiritegiak</translation>
     </message>
     <message>
-        <location line="-643"/>
+        <location line="-645"/>
         <source>Full</source>
         <translation>Osoa</translation>
     </message>
     <message>
-        <location line="+247"/>
+        <location line="+249"/>
         <source>Add Shared Folder</source>
         <translation>Gehitu Elkarbanatutako Agiritegia</translation>
     </message>
@@ -7119,7 +7119,7 @@
         <translation>Elkarbanatutako agiritegi berria kentzen du.</translation>
     </message>
     <message>
-        <location line="-253"/>
+        <location line="-255"/>
         <source>Read-only</source>
         <translation>Irakurri-bakarrik</translation>
     </message>
@@ -8654,7 +8654,7 @@
 <context>
     <name>UIMachineWindow</name>
     <message>
-        <location filename="../src/runtime/UIMachineWindow.cpp" line="+245"/>
+        <location filename="../src/runtime/UIMachineWindow.cpp" line="+250"/>
         <source> EXPERIMENTAL build %1r%2 - %3</source>
         <translation> ESPERIMENTALA eraiketa %1r%2 - %3</translation>
     </message>
@@ -8755,7 +8755,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+637"/>
+        <location line="+636"/>
         <source>Location can not be empty.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -9060,7 +9060,7 @@
         <translation type="obsolete">It&xi</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumDetailsWidget.cpp" line="-666"/>
+        <location filename="../src/medium/UIMediumDetailsWidget.cpp" line="-665"/>
         <location filename="../src/medium/UIMediumManager.cpp" line="-2128"/>
         <source>Current extension (*.%1)</source>
         <translation type="unfinished"></translation>
@@ -10953,7 +10953,7 @@
 <context>
     <name>UINetworkManagerDialog</name>
     <message>
-        <location filename="../src/net/UINetworkManagerDialog.cpp" line="+160"/>
+        <location filename="../src/net/UINetworkManagerDialog.cpp" line="+159"/>
         <source>Network Operations Manager</source>
         <translation>Sare Eragiketa Kudeatzailea</translation>
     </message>
@@ -10977,7 +10977,7 @@
         <translation type="obsolete">Akatsa: %1.</translation>
     </message>
     <message>
-        <location filename="../src/net/UINetworkRequestWidget.cpp" line="+230"/>
+        <location filename="../src/net/UINetworkRequestWidget.cpp" line="+235"/>
         <source>The network operation failed with the following error: %1.</source>
         <translation>Sare eragiketak huts egin du hurrengo akatsarekin: %1.</translation>
     </message>
@@ -11983,7 +11983,7 @@
 <context>
     <name>UIVMCloseDialog</name>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="+401"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="+410"/>
         <source>Close Virtual Machine</source>
         <translation>Itxi Makina Birtuala</translation>
     </message>
@@ -12200,19 +12200,19 @@
 <context>
     <name>UIVMLogViewer</name>
     <message>
-        <location filename="../src/UIVMLogViewer.cpp" line="+274"/>
-        <location line="+393"/>
+        <location filename="../src/UIVMLogViewer.cpp" line="+272"/>
+        <location line="+391"/>
         <source>Close the search panel</source>
         <translation>Itxi bilaketa panela</translation>
     </message>
     <message>
-        <location line="-391"/>
-        <location line="+808"/>
+        <location line="-389"/>
+        <location line="+806"/>
         <source>&Find</source>
         <translation>&Bilatu</translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-805"/>
         <source>Enter a search string here</source>
         <translation>Sartu bilaketa kate bat hemen</translation>
     </message>
@@ -12252,7 +12252,7 @@
         <translation>Katea ez da aurkitu</translation>
     </message>
     <message>
-        <location line="+381"/>
+        <location line="+379"/>
         <source>Filter</source>
         <translation type="unfinished"></translation>
     </message>
@@ -12339,7 +12339,7 @@
         <translation type="obsolete">Erakutsi Azalpena</translation>
     </message>
     <message>
-        <location filename="../src/wizards/UIWizard.cpp" line="+109"/>
+        <location filename="../src/wizards/UIWizard.cpp" line="+110"/>
         <source>&Expert Mode</source>
         <translation>&Aditu Modua</translation>
     </message>
@@ -12421,7 +12421,7 @@
     </message>
     <message>
         <location filename="../src/wizards/clonevd/UIWizardCloneVDPageBasic3.cpp" line="+133"/>
-        <location filename="../src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp" line="+264"/>
+        <location filename="../src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp" line="+262"/>
         <source>Storage on physical hard disk</source>
         <translation>Biltegiratu diska gogor fisikoan</translation>
     </message>
@@ -12649,7 +12649,7 @@
     </message>
     <message>
         <location filename="../src/wizards/clonevm/UIWizardCloneVMPageBasic1.cpp" line="+64"/>
-        <location filename="../src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp" line="+53"/>
+        <location filename="../src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp" line="+51"/>
         <source>%1 Clone</source>
         <translation>%1 Klona</translation>
     </message>
@@ -12826,7 +12826,7 @@
     </message>
     <message>
         <location line="+1"/>
-        <location filename="../src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp" line="+237"/>
+        <location filename="../src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp" line="+235"/>
         <source>Sun &Cloud</source>
         <translation>Sun &Cloud</translation>
     </message>
@@ -13067,7 +13067,7 @@
         <translation>Hasi</translation>
     </message>
     <message>
-        <location filename="../src/wizards/firstrun/UIWizardFirstRunPageBasic.cpp" line="+113"/>
+        <location filename="../src/wizards/firstrun/UIWizardFirstRunPageBasic.cpp" line="+111"/>
         <source><p>Please select a virtual optical disk file or a physical optical drive containing a disk to start your new virtual machine from.</p><p>The disk should be suitable for starting a computer from and should contain the operating system you wish to install on the virtual machine if you want to do that now. The disk will be ejected from the virtual drive automatically next time you switch the virtual machine off, but you can also do this yourself if needed u [...]
         <translation><p>Mesedez hautatu zure makina birtual berria bertatik abiarazteko diska optiko birtual agiri bat edo diska duen gidagailu optiko fisiko bat.</p><p>Diska bertatik ordenagailu bat abiarazteko bezala egon behar da eta makina birtualean ezartzea nahi duzun sistema eragilea eduki behar du orain egitea nahi baduzu. Diska gidagailu birtualetik berezgaitasunez aterako da makina birtuala itzaltzen duzun hurrengoan, baina hau zeuk ere egin dezakezu beharrezk [...]
     </message>
@@ -13096,7 +13096,7 @@
     </message>
     <message>
         <location filename="../src/wizards/importappliance/UIWizardImportAppPageBasic1.cpp" line="+66"/>
-        <location filename="../src/wizards/importappliance/UIWizardImportAppPageExpert.cpp" line="+101"/>
+        <location filename="../src/wizards/importappliance/UIWizardImportAppPageExpert.cpp" line="+99"/>
         <source>Appliance to import</source>
         <translation>Inportatzeko gailua</translation>
     </message>
@@ -13229,7 +13229,7 @@
     </message>
     <message>
         <location filename="../src/wizards/newvd/UIWizardNewVDPageBasic2.cpp" line="+126"/>
-        <location filename="../src/wizards/newvd/UIWizardNewVDPageExpert.cpp" line="+229"/>
+        <location filename="../src/wizards/newvd/UIWizardNewVDPageExpert.cpp" line="+227"/>
         <source>Storage on physical hard disk</source>
         <translation>Biltegiratu diska gogor fisikoan</translation>
     </message>
@@ -13352,7 +13352,7 @@
     </message>
     <message>
         <location filename="../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp" line="+311"/>
-        <location filename="../src/wizards/newvm/UIWizardNewVMPageExpert.cpp" line="+227"/>
+        <location filename="../src/wizards/newvm/UIWizardNewVMPageExpert.cpp" line="+225"/>
         <source>Name and operating system</source>
         <translation>Izena eta sistema eragilea</translation>
     </message>
@@ -15614,7 +15614,7 @@
 <context>
     <name>VBoxLicenseViewer</name>
     <message>
-        <location filename="../src/VBoxLicenseViewer.cpp" line="+96"/>
+        <location filename="../src/VBoxLicenseViewer.cpp" line="+94"/>
         <source>VirtualBox License</source>
         <translation>VirtualBox Baimena</translation>
     </message>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
index 25476d4..b02b742 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
@@ -2031,28 +2031,28 @@
     </message>
     <message>
         <source>True</source>
-        <translation>Emissor:               %1</translation>
+        <translation>Verdadeiro</translation>
     </message>
     <message>
         <source>False</source>
-        <translation>Entidade:              %1</translation>
+        <translation>Falso</translation>
     </message>
     <message>
         <source><tr><td>%1:</td><td>%2</td></tr></source>
         <comment>key: value</comment>
-        <translation>Não Válido Antes De:     %1</translation>
+        <translation><tr><td>%1:</td><td>%2</td></tr></translation>
     </message>
     <message>
         <source>Issuer</source>
-        <translation>Não Válido Depois De:     %1</translation>
+        <translation>Emissor</translation>
     </message>
     <message>
         <source>Subject</source>
-        <translation>Número de Série:        %1</translation>
+        <translation>Descrição</translation>
     </message>
     <message>
         <source>Not Valid Before</source>
-        <translation>Auto-Assinado:          %1</translation>
+        <translation>Não Válido Antes De</translation>
     </message>
     <message>
         <source>Not Valid After</source>
@@ -2064,20 +2064,20 @@
     </message>
     <message>
         <source>Self-Signed</source>
-        <translation>Autoridade (CA):       %1</translation>
+        <translation>Auto-Assinado</translation>
     </message>
     <message>
         <source>Authority (CA)</source>
-        <translation>Algoritmo Público:     %1 (%2)</translation>
+        <translation>Autoridade (CA)</translation>
     </message>
     <message>
         <source>Public Algorithm</source>
-        <translation>Algoritmo de Assinatura:  %1 (%2)</translation>
+        <translation>Algoritmo Público</translation>
     </message>
     <message>
         <source>%1 (%2)</source>
         <comment>value (clarification)</comment>
-        <translation>Número de Versão X.509: %1</translation>
+        <translation>%1 (%2)</translation>
     </message>
     <message>
         <source>Signature Algorithm</source>
@@ -2942,27 +2942,27 @@
     <message>
         <source>Result&nbsp;Code: </source>
         <comment>error info</comment>
-        <translation type="unfinished">Código&nbsp;de&nbsp;Resultado: </translation>
+        <translation>Código&nbsp;de&nbsp;Resultado: </translation>
     </message>
     <message>
         <source>Component: </source>
         <comment>error info</comment>
-        <translation type="unfinished">Componente: </translation>
+        <translation>Componente: </translation>
     </message>
     <message>
         <source>Interface: </source>
         <comment>error info</comment>
-        <translation type="unfinished">Interface: </translation>
+        <translation>Interface: </translation>
     </message>
     <message>
         <source>Callee: </source>
         <comment>error info</comment>
-        <translation type="unfinished">Chamador: </translation>
+        <translation>Chamador: </translation>
     </message>
     <message>
         <source>Callee&nbsp;RC: </source>
         <comment>error info</comment>
-        <translation type="unfinished">RC&nbsp;do&nbsp;Chamador: </translation>
+        <translation>RC&nbsp;do&nbsp;Chamador: </translation>
     </message>
 </context>
 <context>
@@ -6071,11 +6071,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Adding network...</source>
-        <translation type="unfinished"></translation>
+        <translation>Adicionando rede...</translation>
     </message>
     <message>
         <source>Removing network...</source>
-        <translation type="unfinished"></translation>
+        <translation>Removendo rede...</translation>
     </message>
 </context>
 <context>
@@ -7694,11 +7694,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>When checked, VirtualBox will record the audio stream to video file as well.</source>
-        <translation type="unfinished"></translation>
+        <translation>Quando selecionado, permite que o VirtualBox grave o áudio no arquivo de vídeo.</translation>
     </message>
     <message>
         <source>&Record Audio</source>
-        <translation type="unfinished"></translation>
+        <translation>G&ravar Áudio</translation>
     </message>
 </context>
 <context>
@@ -10321,35 +10321,35 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Choose Medium Location</source>
-        <translation type="unfinished"></translation>
+        <translation>Escolher Localização da Mídia</translation>
     </message>
     <message>
         <source>Location can not be empty.</source>
-        <translation type="unfinished"></translation>
+        <translation>A localização não pode ser vazia.</translation>
     </message>
     <message>
         <source>This type of medium is attached directly or indirectly, preserved when taking snapshots.</source>
-        <translation type="unfinished">Este tipo de mídia é conectada direta ou indiretamente, e é preservada quando são feitos snapshots.</translation>
+        <translation>Este tipo de mídia é conectada direta ou indiretamente, e é preservada quando são feitos snapshots.</translation>
     </message>
     <message>
         <source>This type of medium is attached indirectly, changes are wiped out the next time the virtual machine is started.</source>
-        <translation type="unfinished">Este tipo de mídia é conectado indiretamente, e as mudanças são perdidas na próxima vez que a máquina virtual for iniciada.</translation>
+        <translation>Este tipo de mídia é conectado indiretamente, e as mudanças são perdidas na próxima vez que a máquina virtual for iniciada.</translation>
     </message>
     <message>
         <source>This type of medium is attached directly, ignored when taking snapshots.</source>
-        <translation type="unfinished">Este tipo de mídia é conectada diretamente, e é ignorada quando são feitos snapshots.</translation>
+        <translation>Este tipo de mídia é conectada diretamente, e é ignorada quando são feitos snapshots.</translation>
     </message>
     <message>
         <source>This type of medium is attached directly, allowed to be used concurrently by several machines.</source>
-        <translation type="unfinished">Este tipo de mídia é conectada diretamente, e pode ser utilizada concorrentemente por várias máquinas.</translation>
+        <translation>Este tipo de mídia é conectada diretamente, e pode ser utilizada concorrentemente por várias máquinas.</translation>
     </message>
     <message>
         <source>This type of medium is attached directly, and can be used by several machines.</source>
-        <translation type="unfinished">Este tipo de mídia é conectada diretamente, e pode ser utilizada por várias máquinas.</translation>
+        <translation>Este tipo de mídia é conectada diretamente, e pode ser utilizada por várias máquinas.</translation>
     </message>
     <message>
         <source>This type of medium is attached indirectly, so that one base medium can be used for several VMs which have their own differencing medium to store their modifications.</source>
-        <translation type="unfinished">Este tipo de mídia é conectado indiretamente, de tal forma que uma mídia-base possa ser utilizada por várias VMs e cada uma delas possui uma mídia diferencial para armazenar suas modificações.</translation>
+        <translation>Este tipo de mídia é conectado indiretamente, de tal forma que uma mídia-base possa ser utilizada por várias VMs e cada uma delas possui uma mídia diferencial para armazenar suas modificações.</translation>
     </message>
 </context>
 <context>
@@ -10530,43 +10530,43 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Copy Disk Image File (%1)</source>
-        <translation type="unfinished">Copiar Arquivo de Imagem de Disco (%1)</translation>
+        <translation>Copiar Arquivo de Imagem de Disco (%1)</translation>
     </message>
     <message>
         <source>Remove Disk Image File (%1)</source>
-        <translation type="unfinished">Remover Arquivo de Imagem de Disco (%1)</translation>
+        <translation>Remover Arquivo de Imagem de Disco (%1)</translation>
     </message>
     <message>
         <source>Release Disk Image File (%1)</source>
-        <translation type="unfinished">Liberar Arquivo de Imagem de Disco (%1)</translation>
+        <translation>Liberar Arquivo de Imagem de Disco (%1)</translation>
     </message>
     <message>
         <source>Open Disk Image File Properties (%1)</source>
-        <translation type="unfinished">Abrir Propriedades do Arquivo de Imagem de Disco (%1)</translation>
+        <translation>Abrir Propriedades do Arquivo de Imagem de Disco (%1)</translation>
     </message>
     <message>
         <source>Refresh Disk Image Files (%1)</source>
-        <translation type="unfinished">Atualizar Arquivos de Imagem de Disco (%1)</translation>
+        <translation>Atualizar Arquivos de Imagem de Disco (%1)</translation>
     </message>
     <message>
         <source>Current extension (*.%1)</source>
-        <translation type="unfinished"></translation>
+        <translation>Extensão atual (*.%1)</translation>
     </message>
     <message>
         <source>Choose the location of this medium</source>
-        <translation type="unfinished"></translation>
+        <translation>Escolha a localização desta mídia</translation>
     </message>
     <message>
         <source>&Move...</source>
-        <translation type="unfinished"></translation>
+        <translation>&Mover...</translation>
     </message>
     <message>
         <source>Move Disk Image File (%1)</source>
-        <translation type="unfinished"></translation>
+        <translation>Mover Arquivo de Imagem de Disco (%1)</translation>
     </message>
     <message>
         <source>Move selected disk image file</source>
-        <translation type="unfinished"></translation>
+        <translation>Mover o arquivo de imagem de disco selecionado</translation>
     </message>
 </context>
 <context>
@@ -12796,19 +12796,19 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><p>Could not insert the <b>%1</b> disk image file into the virtual machine <b>%2</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Não foi possível inserir o arquivo de imagem de disco <b>%1</b> na máquina virtual <b>%2</b>, pois a máquina não possui drives de disco ótico. Acrescente um drive através da página de configuração da máquina virtual.</p></translation>
     </message>
     <message>
         <source>Failed to change the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Falha ao alterar o snapshot <b>%1</b> da máquina virtual <b>%2</b>.</translation>
     </message>
     <message>
         <source>Failed to create the virtual disk image storage <nobr><b>%1</b>.</nobr></source>
-        <translation type="unfinished"></translation>
+        <translation>Falha ao criar a imagem de disco de armazenamento virtual <nobr><b>%1</b>.</nobr></translation>
     </message>
     <message>
         <source><p>The changes you requested require this disk to be released from the machines it is attached to.</p><p>Are you sure you want to release the disk image file <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>As mudanças que você solicitou exigem que este disco seja liberado das máquinas às quais estão conectadas.</p><p>Você tem certeza de que quer liberar o arquivo de imagem de disco <nobr><b>%1</b></nobr>?</p><p>Isto fará com que o disco seja desconectado das seguintes máquinas virtuais: <b>%2</b>.</p></translation>
     </message>
 </context>
 <context>
@@ -14013,11 +14013,11 @@ utilizando o diálogo de Configurações da MV.</p></translation>
     <name>UIPopupPane</name>
     <message>
         <source><p><b>Details:</b></source>
-        <translation type="unfinished"></translation>
+        <translation><p><b>Detalhes:</b></translation>
     </message>
     <message>
         <source><p><b>Details:</b> (%1 of %2)</source>
-        <translation type="unfinished"></translation>
+        <translation><p><b>Detalhes:</b> (%1 de %2)</translation>
     </message>
 </context>
 <context>
@@ -14501,23 +14501,23 @@ utilizando o diálogo de Configurações da MV.</p></translation>
     </message>
     <message>
         <source>Enter a name for the new snapshot...</source>
-        <translation type="unfinished"></translation>
+        <translation>Entre com o nome para o novo snapshot...</translation>
     </message>
     <message>
         <source>Enter a name for this snapshot...</source>
-        <translation type="unfinished"></translation>
+        <translation>Entre com um nome para este snapshot...</translation>
     </message>
     <message>
         <source>Take</source>
-        <translation type="unfinished"></translation>
+        <translation>Criar</translation>
     </message>
     <message>
         <source>Take snapshot on the basis of current machine state</source>
-        <translation type="unfinished"></translation>
+        <translation>Criar snapshot com base no estado atual da máquina</translation>
     </message>
     <message>
         <source>Take Snapshot (%1)</source>
-        <translation type="unfinished">Criar Snapshot (%1)</translation>
+        <translation>Criar Snapshot (%1)</translation>
     </message>
 </context>
 <context>
@@ -15574,76 +15574,76 @@ utilizando o diálogo de Configurações da MV.</p></translation>
     </message>
     <message>
         <source>Copy Virtual Disk Image</source>
-        <translation type="unfinished"></translation>
+        <translation>Copiar Imagem de Disco Virtual</translation>
     </message>
     <message>
         <source>Disk image to copy</source>
-        <translation type="unfinished"></translation>
+        <translation>Imagem de disco a copiar</translation>
     </message>
     <message>
         <source><p>Please select the virtual disk image file that you would like to copy if it is not already selected. You can either choose one from the list or use the folder icon beside the list to select one.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Selecione o arquivo de imagem de disco virtual que você gostaria de copiar, caso já não esteja selecionada. Você pode escolher da lista, ou utilizar o ícone de pasta ao lado da lista para selecionar um arquivo.</p></translation>
     </message>
     <message>
         <source>Choose a virtual disk image file to copy...</source>
-        <translation type="unfinished"></translation>
+        <translation>Escolha um arquivo de imagem de disco virtual para copiar...</translation>
     </message>
     <message>
         <source>Disk image file type</source>
-        <translation type="unfinished"></translation>
+        <translation>Tipo do arquivo de imagem de disco</translation>
     </message>
     <message>
         <source>Please choose the type of file that you would like to use for the new virtual disk image. If you do not need to use it with other virtualization software you can leave this setting unchanged.</source>
-        <translation type="unfinished"></translation>
+        <translation>Escolha o tipo de arquivo que você deseja utilizar para a nova imagem de disco virtual. Caso não seja necessário utilizá-la com outros virtualizadores, você pode deixar esta configuração como está.</translation>
     </message>
     <message>
         <source>Please choose whether the new virtual disk image file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
-        <translation type="unfinished"></translation>
+        <translation>Escolha se o nome arquivo de imagem de disco deverá crescer à medida em que for sendo utilizado (alocado dinamicamente), ou se ele deverá ser criado já com o tamanho máximo escolhido (tamanho fixo).</translation>
     </message>
     <message>
         <source><p>A <b>dynamically allocated</b> disk image file will only use space on your physical hard disk as it fills up (up to a maximum <b>fixed size</b>), although it will not shrink again automatically when space on it is freed.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Um arquivo de imagem de disco virtual <b>dinamicamente alocado</b> irá utilizar espaço em seu disco rígido físico à medida em que for sendo utilizado (até um <b>tamanho máximo pré-definido</b>), mas não irá encolher caso seja liberado espaço nele.</p></translation>
     </message>
     <message>
         <source><p>A <b>fixed size</b> disk image file may take longer to create on some systems but is often faster to use.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Um arquivo de imagem de disco virtual de <b>tamanho fixo</b> pode levar mais tempo para ser criado em alguns sistemas, mas geralmente possui acesso mais rápido.</p></translation>
     </message>
     <message>
         <source><p>You can also choose to <b>split</b> the disk image file into several files of up to two gigabytes each. This is mainly useful if you wish to store the virtual machine on removable USB devices or old systems, some of which cannot handle very large files.</source>
-        <translation type="unfinished"></translation>
+        <translation><p>Você também pode optar por <b>dividir</b> o arquivo de imagem de disco em diversos arquivos de até dois gigabytes cada. Isto é útil para situações em que você precisa armazenar a máquina virtual em dispositivos USB removíveis ou em sistemas mais antigos que não saibam lidar com arquivos grandes.</translation>
     </message>
     <message>
         <source>Please choose a location for new virtual disk image file</source>
-        <translation type="unfinished"></translation>
+        <translation>Escolha a localização para a nova imagem de disco virtual</translation>
     </message>
     <message>
         <source>New disk image to create</source>
-        <translation type="unfinished"></translation>
+        <translation>Nova imagem de disco virtual a criar</translation>
     </message>
     <message>
         <source>Please type the name of the new virtual disk image file into the box below or click on the folder icon to select a different folder to create the file in.</source>
-        <translation type="unfinished"></translation>
+        <translation>Informe o nome do arquivo de imagem de disco virtual no campo abaixo ou clique no ícone da pasta para selecionar uma localização diferente para o arquivo.</translation>
     </message>
     <message>
         <source>Choose a location for new virtual disk image file...</source>
-        <translation type="unfinished"></translation>
+        <translation>Escolha a localização para o arquivo contendo o novo arquivo de imagem de disco virtual...</translation>
     </message>
     <message>
         <source>%1_copy</source>
         <comment>copied virtual disk image name</comment>
-        <translation type="unfinished">cópia_%1</translation>
+        <translation>%1_copia</translation>
     </message>
     <message>
         <source>Disk image to &copy</source>
-        <translation type="unfinished"></translation>
+        <translation>Arquivo de imagem a &copiar</translation>
     </message>
     <message>
         <source>&New disk image to create</source>
-        <translation type="unfinished"></translation>
+        <translation>&Nova imagem de disco virtual a criar</translation>
     </message>
     <message>
         <source>Disk image file &type</source>
-        <translation type="unfinished"></translation>
+        <translation>&Tipo do arquivo de imagem de disco</translation>
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts
index 04f2b93..92fd45c 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sl.ts
@@ -167,7 +167,7 @@
 <context>
     <name>QIMessageBox</name>
     <message>
-        <location filename="../src/extensions/QIMessageBox.cpp" line="+302"/>
+        <location filename="../src/extensions/QIMessageBox.cpp" line="+299"/>
         <location filename="../src/globals/UIMessageCenter.cpp" line="+1887"/>
         <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="+180"/>
         <source>OK</source>
@@ -1022,7 +1022,7 @@
         <translation>Predogled zaslona %1</translation>
     </message>
     <message>
-        <location line="+1605"/>
+        <location line="+1608"/>
         <source>&Connect Network Adapter</source>
         <translation>&Poveži omrežni vmesnik</translation>
     </message>
@@ -2575,7 +2575,7 @@
 <context>
     <name>UIGMachinePreview</name>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="+356"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="+365"/>
         <source>Every 0.5 s</source>
         <translation>Vsakih 0,5 s</translation>
     </message>
@@ -5759,7 +5759,7 @@
 <context>
     <name>UIMachineSettingsSF</name>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsSF.cpp" line="+623"/>
+        <location filename="../src/settings/machine/UIMachineSettingsSF.cpp" line="+625"/>
         <source> Machine Folders</source>
         <translation>Mape računalnika</translation>
     </message>
@@ -5769,7 +5769,7 @@
         <translation>Prehodne mape</translation>
     </message>
     <message>
-        <location line="-643"/>
+        <location line="-645"/>
         <source>Full</source>
         <translation>Poln</translation>
     </message>
@@ -5818,7 +5818,7 @@
         <translation>Da</translation>
     </message>
     <message>
-        <location line="+248"/>
+        <location line="+250"/>
         <source>Add Shared Folder</source>
         <translation>Dodaj deljeno mapo</translation>
     </message>
@@ -6976,7 +6976,7 @@
 <context>
     <name>UIMachineWindow</name>
     <message>
-        <location filename="../src/runtime/UIMachineWindow.cpp" line="+245"/>
+        <location filename="../src/runtime/UIMachineWindow.cpp" line="+250"/>
         <source> EXPERIMENTAL build %1r%2 - %3</source>
         <translation>PREIZKUSNA izgradnja %1r%2 - %3</translation>
     </message>
@@ -7077,7 +7077,7 @@
         <translation>Uveljavi spremembe (%1)</translation>
     </message>
     <message>
-        <location line="+637"/>
+        <location line="+636"/>
         <source>Location can not be empty.</source>
         <translation>Mesto ne sme biti prazno.</translation>
     </message>
@@ -7370,7 +7370,7 @@
         <translation>Zapri okno (%1)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumDetailsWidget.cpp" line="-666"/>
+        <location filename="../src/medium/UIMediumDetailsWidget.cpp" line="-665"/>
         <location filename="../src/medium/UIMediumManager.cpp" line="-2128"/>
         <source>Current extension (*.%1)</source>
         <translation>Trenutna pripona (*.%1)</translation>
@@ -9064,7 +9064,7 @@
 <context>
     <name>UINetworkManagerDialog</name>
     <message>
-        <location filename="../src/net/UINetworkManagerDialog.cpp" line="+160"/>
+        <location filename="../src/net/UINetworkManagerDialog.cpp" line="+159"/>
         <source>Network Operations Manager</source>
         <translation>Upravljalnik omrežnih opravil</translation>
     </message>
@@ -9084,7 +9084,7 @@
         <translation>Prekliči vsa dejavna omrežna opravila</translation>
     </message>
     <message>
-        <location filename="../src/net/UINetworkRequestWidget.cpp" line="+191"/>
+        <location filename="../src/net/UINetworkRequestWidget.cpp" line="+196"/>
         <source>Network Operation</source>
         <translation>Omrežno opravilo</translation>
     </message>
@@ -10049,7 +10049,7 @@
 <context>
     <name>UIVMCloseDialog</name>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="+401"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="+410"/>
         <source>Close Virtual Machine</source>
         <translation>Zapri navidezni računalnik</translation>
     </message>
@@ -10266,19 +10266,19 @@
 <context>
     <name>UIVMLogViewer</name>
     <message>
-        <location filename="../src/UIVMLogViewer.cpp" line="+274"/>
-        <location line="+393"/>
+        <location filename="../src/UIVMLogViewer.cpp" line="+272"/>
+        <location line="+391"/>
         <source>Close the search panel</source>
         <translation>Zapri iskalno ploščo</translation>
     </message>
     <message>
-        <location line="-391"/>
-        <location line="+808"/>
+        <location line="-389"/>
+        <location line="+806"/>
         <source>&Find</source>
         <translation>&Poišči</translation>
     </message>
     <message>
-        <location line="-807"/>
+        <location line="-805"/>
         <source>Enter a search string here</source>
         <translation>Sem vnesite iskalni niz</translation>
     </message>
@@ -10318,7 +10318,7 @@
         <translation>Niz ni bil najden</translation>
     </message>
     <message>
-        <location line="+572"/>
+        <location line="+570"/>
         <source><p>No log files found. Press the <b>Refresh</b> button to rescan the log folder <nobr><b>%1</b></nobr>.</p></source>
         <translation><p>Nobene datoteke dnevnika ni bilo mogoče najti. Pritisnite gumb <b>Osveži</b>, da ponovno preiščete mapo z dnevniki <nobr><b>%1</b></nobr>.</p></translation>
     </message>
@@ -10366,7 +10366,7 @@
 <context>
     <name>UIWizard</name>
     <message>
-        <location filename="../src/wizards/UIWizard.cpp" line="+109"/>
+        <location filename="../src/wizards/UIWizard.cpp" line="+110"/>
         <source>&Expert Mode</source>
         <translation>&Napredni način</translation>
     </message>
@@ -10420,7 +10420,7 @@
     </message>
     <message>
         <location line="+4"/>
-        <location filename="../src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp" line="+265"/>
+        <location filename="../src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp" line="+263"/>
         <source>&Dynamically allocated</source>
         <translation>&Dinamično dodeljeno</translation>
     </message>
@@ -10604,7 +10604,7 @@
     </message>
     <message>
         <location filename="../src/wizards/clonevm/UIWizardCloneVMPageBasic1.cpp" line="+64"/>
-        <location filename="../src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp" line="+53"/>
+        <location filename="../src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp" line="+51"/>
         <source>%1 Clone</source>
         <translation>Klon %1</translation>
     </message>
@@ -10781,7 +10781,7 @@
     </message>
     <message>
         <location line="+1"/>
-        <location filename="../src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp" line="+237"/>
+        <location filename="../src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp" line="+235"/>
         <source>Sun &Cloud</source>
         <translation>storitvi &Sun Cloud</translation>
     </message>
@@ -11014,7 +11014,7 @@
         <translation>Zaženi</translation>
     </message>
     <message>
-        <location filename="../src/wizards/firstrun/UIWizardFirstRunPageBasic.cpp" line="+113"/>
+        <location filename="../src/wizards/firstrun/UIWizardFirstRunPageBasic.cpp" line="+111"/>
         <source><p>Please select a virtual optical disk file or a physical optical drive containing a disk to start your new virtual machine from.</p><p>The disk should be suitable for starting a computer from and should contain the operating system you wish to install on the virtual machine if you want to do that now. The disk will be ejected from the virtual drive automatically next time you switch the virtual machine off, but you can also do this yourself if needed u [...]
         <translation><p>Izberite navidezni optični disk ali fizični pogon z diskom, iz katerega boste zagnali nov navidezni računalnik.</p><p>Disk mora biti primeren za zagon računalnika in mora vsebovati operacijski sistem, ki ga želite namestiti na navidezni računalnik, če želite to storiti zdaj. Disk bo samodejno izvržen on naslednjem izklopu navideznega računalnika, vendar to lahko po potrebi storite tudi sami z uporabo menija Naprave.</p></translation>
     </message>
@@ -11043,7 +11043,7 @@
     </message>
     <message>
         <location filename="../src/wizards/importappliance/UIWizardImportAppPageBasic1.cpp" line="+66"/>
-        <location filename="../src/wizards/importappliance/UIWizardImportAppPageExpert.cpp" line="+101"/>
+        <location filename="../src/wizards/importappliance/UIWizardImportAppPageExpert.cpp" line="+99"/>
         <source>Appliance to import</source>
         <translation>Namenska naprava za uvoz</translation>
     </message>
@@ -11131,7 +11131,7 @@
     </message>
     <message>
         <location filename="../src/wizards/newvd/UIWizardNewVDPageBasic2.cpp" line="+140"/>
-        <location filename="../src/wizards/newvd/UIWizardNewVDPageExpert.cpp" line="+230"/>
+        <location filename="../src/wizards/newvd/UIWizardNewVDPageExpert.cpp" line="+228"/>
         <source>&Dynamically allocated</source>
         <translation>&Dinamično dodeljeno</translation>
     </message>
@@ -11243,7 +11243,7 @@
     </message>
     <message>
         <location filename="../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp" line="+311"/>
-        <location filename="../src/wizards/newvm/UIWizardNewVMPageExpert.cpp" line="+227"/>
+        <location filename="../src/wizards/newvm/UIWizardNewVMPageExpert.cpp" line="+225"/>
         <source>Name and operating system</source>
         <translation>Ime in operacijski sistem</translation>
     </message>
@@ -13394,7 +13394,7 @@
 <context>
     <name>VBoxLicenseViewer</name>
     <message>
-        <location filename="../src/VBoxLicenseViewer.cpp" line="+96"/>
+        <location filename="../src/VBoxLicenseViewer.cpp" line="+94"/>
         <source>VirtualBox License</source>
         <translation>Dovoljenje za VirtualBox</translation>
     </message>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
index a2d9a7b..30c8e72 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
@@ -11250,7 +11250,7 @@
     </message>
     <message>
         <source><p>The changes you requested require this disk to be released from the machines it is attached to.</p><p>Are you sure you want to release the disk image file <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>İstediğiniz değişiklikler, bu diskin takılı olduğu makinelerden serbest bırakılmasını gerektirir.</p><p><nobr><b>%1</b></nobr> disk kalıbı dosyasını serbest bırakmak istediğinize emin misiniz?</p><p>Bu işlem kalıbı şurada belirtilen sanal makine(ler)den ayıracak: <b>%2</b>.</p></translation>
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/qt_pt_BR.ts
index ac2da19..1a84b17 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_pt_BR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_pt_BR.ts
@@ -1,28 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.1" language="pt_BR">
-<context>
-    <name>AudioOutput</name>
-    <message>
-        <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source>
-        <translation type="vanished"><html>O dispositivo de áudio <b>%1</b> não está funcionando.<br/>Voltando para o dispositivo <b>%2</b>.</html></translation>
-    </message>
-    <message>
-        <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source>
-        <translation type="vanished"><html>Trocando para o dispositivo de áudio <b>%1</b><br/>que acaba de ficar disponível e possui prioridade mais alta.</html></translation>
-    </message>
-    <message>
-        <source>Revert back to device '%1'</source>
-        <translation type="vanished">Voltar para o dispositivo '%1'</translation>
-    </message>
-</context>
-<context>
-    <name>CloseButton</name>
-    <message>
-        <source>Close Tab</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
+<TS version="2.0" language="pt">
 <context>
     <name>MAC_APPLICATION_MENU</name>
     <message>
@@ -55,41 +33,45 @@
     </message>
 </context>
 <context>
-    <name>PPDOptionsModel</name>
+    <name>AudioOutput</name>
     <message>
-        <source>Name</source>
-        <translation type="obsolete">Nome</translation>
+        <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source>
+        <translation><html>O dispositivo de áudio <b>%1</b> não está funcionando.<br/>Voltando para o dispositivo <b>%2</b>.</html></translation>
     </message>
     <message>
-        <source>Value</source>
-        <translation type="obsolete">Valor</translation>
+        <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source>
+        <translation><html>Trocando para o dispositivo de áudio <b>%1</b><br/>que acaba de ficar disponível e possui prioridade mais alta.</html></translation>
+    </message>
+    <message>
+        <source>Revert back to device '%1'</source>
+        <translation>Voltar para o dispositivo '%1'</translation>
     </message>
 </context>
 <context>
     <name>Phonon::</name>
     <message>
         <source>Notifications</source>
-        <translation type="vanished">Notificações</translation>
+        <translation>Notificações</translation>
     </message>
     <message>
         <source>Music</source>
-        <translation type="vanished">Música</translation>
+        <translation>Música</translation>
     </message>
     <message>
         <source>Video</source>
-        <translation type="vanished">Vídeo</translation>
+        <translation>Vídeo</translation>
     </message>
     <message>
         <source>Communication</source>
-        <translation type="vanished">Comunicação</translation>
+        <translation>Comunicação</translation>
     </message>
     <message>
         <source>Games</source>
-        <translation type="vanished">Jogos</translation>
+        <translation>Jogos</translation>
     </message>
     <message>
         <source>Accessibility</source>
-        <translation type="vanished">Acessibilidade</translation>
+        <translation>Acessibilidade</translation>
     </message>
 </context>
 <context>
@@ -97,13 +79,13 @@
     <message>
         <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
           Some video features have been disabled.</source>
-        <translation type="vanished">Aviso: Você não possui o pacote gstreamer0.10-plugins-good instalado.
+        <translation>Aviso: Você não possui o pacote gstreamer0.10-plugins-good instalado.
          Alguns recursos de vídeo foram desabilitados.</translation>
     </message>
     <message>
         <source>Warning: You do not seem to have the base GStreamer plugins installed.
           All audio and video support has been disabled</source>
-        <translation type="vanished">Aviso: Você não possui os plugins básicos do GStreamer instalados.
+        <translation>Aviso: Você não possui os plugins básicos do GStreamer instalados.
           Todo o suporte a áudio e vídeo foi desabilitado</translation>
     </message>
 </context>
@@ -114,7 +96,7 @@
 
 Check your Gstreamer installation and make sure you 
 have libgstreamer-plugins-base installed.</source>
-        <translation type="vanished">Não foi possível iniciar a reprodução. 
+        <translation>Não foi possível iniciar a reprodução. 
 
 Verifique sua instalação do GStreamer e certifique-se de que você 
 tenha o pacote libgstreamer-plugins-base instalado.</translation>
@@ -122,350 +104,338 @@ tenha o pacote libgstreamer-plugins-base instalado.</translation>
     <message numerus="yes">
         <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
         <translatorcomment>O marcador %n está faltando no texto original?</translatorcomment>
-        <translation type="vanished">
+        <translation>
             <numerusform>Um codec necessário está faltando. Você precisa instalar o seguinte codec para tocar este conteúdo: %0</numerusform>
             <numerusform>Alguns codecs necessários estão faltando. Você precisa instalar os seguintes codecs para tocar este conteúdo: %0</numerusform>
         </translation>
     </message>
     <message>
         <source>Could not open media source.</source>
-        <translation type="vanished">Não foi possível abrir a mídia de origem.</translation>
+        <translation>Não foi possível abrir a mídia de origem.</translation>
     </message>
     <message>
         <source>Invalid source type.</source>
-        <translation type="vanished">Tipo de origem inválida.</translation>
+        <translation>Tipo de origem inválida.</translation>
     </message>
     <message>
         <source>Could not locate media source.</source>
-        <translation type="vanished">Não foi possível localizar a origem da mídia.</translation>
+        <translation>Não foi possível localizar a origem da mídia.</translation>
     </message>
     <message>
         <source>Could not open audio device. The device is already in use.</source>
-        <translation type="vanished">Não foi possível abrir o dispositivo de áudio. O dispositivo já estava em uso.</translation>
+        <translation>Não foi possível abrir o dispositivo de áudio. O dispositivo já estava em uso.</translation>
     </message>
     <message>
         <source>Could not decode media source.</source>
-        <translation type="vanished">Não foi possível decodificar a origem da mídia.</translation>
+        <translation>Não foi possível decodificar a origem da mídia.</translation>
     </message>
 </context>
 <context>
     <name>Phonon::VolumeSlider</name>
     <message>
         <source>Volume: %1%</source>
-        <translation type="vanished">Volume: %1%</translation>
+        <translation>Volume: %1%</translation>
     </message>
     <message>
         <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
-        <translation type="vanished">Utilize este slider para ajustar o volume. A posição inicial é 0%, e a posição final é %1%</translation>
+        <translation>Utilize este slider para ajustar o volume. A posição inicial é 0%, e a posição final é %1%</translation>
     </message>
 </context>
 <context>
     <name>Q3Accel</name>
     <message>
         <source>%1, %2 not defined</source>
-        <translation type="vanished">%1, %2 não definido</translation>
+        <translation>%1, %2 não definido</translation>
     </message>
     <message>
         <source>Ambiguous %1 not handled</source>
-        <translation type="vanished">%1 ambíguo não tratado</translation>
+        <translation>%1 ambíguo não tratado</translation>
     </message>
 </context>
 <context>
     <name>Q3DataTable</name>
     <message>
         <source>True</source>
-        <translation type="vanished">Verdadeiro</translation>
+        <translation>Verdadeiro</translation>
     </message>
     <message>
         <source>False</source>
-        <translation type="vanished">Falso</translation>
+        <translation>Falso</translation>
     </message>
     <message>
         <source>Insert</source>
-        <translation type="vanished">Inserir</translation>
+        <translation>Inserir</translation>
     </message>
     <message>
         <source>Update</source>
-        <translation type="vanished">Atualizar</translation>
+        <translation>Atualizar</translation>
     </message>
     <message>
         <source>Delete</source>
-        <translation type="vanished">Apagar</translation>
+        <translation>Apagar</translation>
     </message>
 </context>
 <context>
     <name>Q3FileDialog</name>
     <message>
         <source>Copy or Move a File</source>
-        <translation type="vanished">Copiar ou Mover um Arquivo</translation>
+        <translation>Copiar ou Mover um Arquivo</translation>
     </message>
     <message>
         <source>Read: %1</source>
-        <translation type="vanished">Ler: %1</translation>
+        <translation>Ler: %1</translation>
     </message>
     <message>
         <source>Write: %1</source>
-        <translation type="vanished">Escrever: %1</translation>
+        <translation>Escrever: %1</translation>
     </message>
     <message>
         <source>Cancel</source>
-        <translation type="vanished">Cancelar</translation>
+        <translation>Cancelar</translation>
     </message>
     <message>
         <source>All Files (*)</source>
-        <translation type="vanished">Todos os Arquivos (*)</translation>
+        <translation>Todos os Arquivos (*)</translation>
     </message>
     <message>
         <source>Name</source>
-        <translation type="vanished">Nome</translation>
+        <translation>Nome</translation>
     </message>
     <message>
         <source>Size</source>
-        <translation type="vanished">Tamanho</translation>
+        <translation>Tamanho</translation>
     </message>
     <message>
         <source>Type</source>
-        <translation type="vanished">Tipo</translation>
+        <translation>Tipo</translation>
     </message>
     <message>
         <source>Date</source>
-        <translation type="vanished">Data</translation>
+        <translation>Data</translation>
     </message>
     <message>
         <source>Attributes</source>
-        <translation type="vanished">Atributos</translation>
+        <translation>Atributos</translation>
     </message>
     <message>
         <source>&OK</source>
-        <translation type="vanished">&OK</translation>
+        <translation>&OK</translation>
     </message>
     <message>
         <source>Look &in:</source>
-        <translation type="vanished">Procurar em(&i):</translation>
+        <translation>Procurar em(&i):</translation>
     </message>
     <message>
         <source>File &name:</source>
-        <translation type="vanished">&Nome do arquivo:</translation>
+        <translation>&Nome do arquivo:</translation>
     </message>
     <message>
         <source>File &type:</source>
-        <translation type="vanished">&Tipo do arquivo:</translation>
+        <translation>&Tipo do arquivo:</translation>
     </message>
     <message>
         <source>Back</source>
-        <translation type="vanished">Voltar</translation>
+        <translation>Voltar</translation>
     </message>
     <message>
         <source>One directory up</source>
-        <translation type="vanished">Subir um diretório</translation>
+        <translation>Subir um diretório</translation>
     </message>
     <message>
         <source>Create New Folder</source>
-        <translation type="vanished">Criar Nova Pasta</translation>
+        <translation>Criar Nova Pasta</translation>
     </message>
     <message>
         <source>List View</source>
-        <translation type="vanished">Visão de Lista</translation>
+        <translation>Visão de Lista</translation>
     </message>
     <message>
         <source>Detail View</source>
-        <translation type="vanished">Visão Detalhada</translation>
+        <translation>Visão Detalhada</translation>
     </message>
     <message>
         <source>Preview File Info</source>
-        <translation type="vanished">Visualizar Informações de Arquivo</translation>
+        <translation>Visualizar Informações de Arquivo</translation>
     </message>
     <message>
         <source>Preview File Contents</source>
-        <translation type="vanished">Visualizar Conteúdo do Arquivo</translation>
+        <translation>Visualizar Conteúdo do Arquivo</translation>
     </message>
     <message>
         <source>Read-write</source>
-        <translation type="vanished">Leitura e escrita</translation>
+        <translation>Leitura e escrita</translation>
     </message>
     <message>
         <source>Read-only</source>
-        <translation type="vanished">Apenas leitura</translation>
+        <translation>Apenas leitura</translation>
     </message>
     <message>
         <source>Write-only</source>
-        <translation type="vanished">Apenas escrita</translation>
+        <translation>Apenas escrita</translation>
     </message>
     <message>
         <source>Inaccessible</source>
-        <translation type="vanished">Inacessível</translation>
+        <translation>Inacessível</translation>
     </message>
     <message>
         <source>Symlink to File</source>
-        <translation type="vanished">Link simbólico para Arquivo</translation>
+        <translation>Link simbólico para Arquivo</translation>
     </message>
     <message>
         <source>Symlink to Directory</source>
-        <translation type="vanished">Link simbólico para Diretório</translation>
+        <translation>Link simbólico para Diretório</translation>
     </message>
     <message>
         <source>Symlink to Special</source>
-        <translation type="vanished">Link simbólico para Especial</translation>
+        <translation>Link simbólico para Especial</translation>
     </message>
     <message>
         <source>File</source>
-        <translation type="vanished">Arquivo</translation>
+        <translation>Arquivo</translation>
     </message>
     <message>
         <source>Dir</source>
-        <translation type="vanished">Dir</translation>
+        <translation>Dir</translation>
     </message>
     <message>
         <source>Special</source>
-        <translation type="vanished">Especial</translation>
+        <translation>Especial</translation>
     </message>
     <message>
         <source>Open</source>
-        <translation type="vanished">Abrir</translation>
+        <translation>Abrir</translation>
     </message>
     <message>
         <source>Save As</source>
-        <translation type="vanished">Salvar Como</translation>
+        <translation>Salvar Como</translation>
     </message>
     <message>
         <source>&Open</source>
-        <translation type="vanished">Abrir (&O)</translation>
+        <translation>Abrir (&O)</translation>
     </message>
     <message>
         <source>&Save</source>
-        <translation type="vanished">&Salvar</translation>
+        <translation>&Salvar</translation>
     </message>
     <message>
         <source>&Rename</source>
-        <translation type="vanished">&Renomear</translation>
+        <translation>&Renomear</translation>
     </message>
     <message>
         <source>&Delete</source>
-        <translation type="vanished">Apagar (&D)</translation>
+        <translation>Apagar (&D)</translation>
     </message>
     <message>
         <source>R&eload</source>
-        <translation type="vanished">R&ecarregar</translation>
+        <translation>R&ecarregar</translation>
     </message>
     <message>
         <source>Sort by &Name</source>
-        <translation type="vanished">Organizar por &Nome</translation>
+        <translation>Organizar por &Nome</translation>
     </message>
     <message>
         <source>Sort by &Size</source>
-        <translation type="vanished">Organizar por Tamanho (&S)</translation>
+        <translation>Organizar por Tamanho (&S)</translation>
     </message>
     <message>
         <source>Sort by &Date</source>
-        <translation type="vanished">Organizar por &Data</translation>
+        <translation>Organizar por &Data</translation>
     </message>
     <message>
         <source>&Unsorted</source>
-        <translation type="vanished">Não Organizar (&U)</translation>
+        <translation>Não Organizar (&U)</translation>
     </message>
     <message>
         <source>Sort</source>
-        <translation type="vanished">Organizar</translation>
+        <translation>Organizar</translation>
     </message>
     <message>
         <source>Show &hidden files</source>
-        <translation type="vanished">Exibir arquivos ocultos (&h)</translation>
+        <translation>Exibir arquivos ocultos (&h)</translation>
     </message>
     <message>
         <source>the file</source>
-        <translation type="vanished">o arquivo</translation>
+        <translation>o arquivo</translation>
     </message>
     <message>
         <source>the directory</source>
-        <translation type="vanished">o diretório</translation>
+        <translation>o diretório</translation>
     </message>
     <message>
         <source>the symlink</source>
-        <translation type="vanished">o link simbólico</translation>
+        <translation>o link simbólico</translation>
     </message>
     <message>
         <source>Delete %1</source>
-        <translation type="vanished">Apagar %1</translation>
+        <translation>Apagar %1</translation>
     </message>
     <message>
         <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source>
-        <translation type="vanished"><qt>Você tem certeza de que deseja apagar %1 "%2"?</qt></translation>
+        <translation><qt>Você tem certeza de que deseja apagar %1 "%2"?</qt></translation>
     </message>
     <message>
         <source>&Yes</source>
-        <translation type="vanished">Sim (&Y)</translation>
+        <translation>Sim (&Y)</translation>
     </message>
     <message>
         <source>&No</source>
-        <translation type="vanished">&Não</translation>
+        <translation>&Não</translation>
     </message>
     <message>
         <source>New Folder 1</source>
-        <translation type="vanished">Nova Pasta 1</translation>
+        <translation>Nova Pasta 1</translation>
     </message>
     <message>
         <source>New Folder</source>
-        <translation type="vanished">Nova Pasta</translation>
+        <translation>Nova Pasta</translation>
     </message>
     <message>
         <source>New Folder %1</source>
-        <translation type="vanished">Nova Pasta %1</translation>
+        <translation>Nova Pasta %1</translation>
     </message>
     <message>
         <source>Find Directory</source>
-        <translation type="vanished">Encontrar Diretório</translation>
+        <translation>Encontrar Diretório</translation>
     </message>
     <message>
         <source>Directories</source>
-        <translation type="vanished">Diretórios</translation>
+        <translation>Diretórios</translation>
     </message>
     <message>
         <source>Directory:</source>
-        <translation type="vanished">Diretório:</translation>
+        <translation>Diretório:</translation>
     </message>
     <message>
         <source>Error</source>
-        <translation type="vanished">Erro</translation>
+        <translation>Erro</translation>
     </message>
     <message>
         <source>%1
 File not found.
 Check path and filename.</source>
-        <translation type="vanished">%1
+        <translation>%1
 Arquivo não encontrado.
 Verifique o caminho e o nome do arquivo.</translation>
     </message>
-    <message>
-        <source>All Files (*.*)</source>
-        <translation type="obsolete">Todos os Ficheiros (*.*)</translation>
-    </message>
-    <message>
-        <source>Open </source>
-        <translation type="obsolete">Abrir </translation>
-    </message>
-    <message>
-        <source>Select a Directory</source>
-        <translation type="obsolete">Seleccione uma Pasta</translation>
-    </message>
 </context>
 <context>
     <name>Q3LocalFs</name>
     <message>
         <source>Could not read directory
 %1</source>
-        <translation type="vanished">Não foi possível ler o diretório
+        <translation>Não foi possível ler o diretório
 %1</translation>
     </message>
     <message>
         <source>Could not create directory
 %1</source>
-        <translation type="vanished">Não foi possível criar o diretório
+        <translation>Não foi possível criar o diretório
 %1</translation>
     </message>
     <message>
         <source>Could not remove file or directory
 %1</source>
-        <translation type="vanished">Não foi possível remover o arquivo ou diretório
+        <translation>Não foi possível remover o arquivo ou diretório
 %1</translation>
     </message>
     <message>
@@ -473,7 +443,7 @@ Verifique o caminho e o nome do arquivo.</translation>
 %1
 to
 %2</source>
-        <translation type="vanished">Não foi possível renomear
+        <translation>Não foi possível renomear
 %1
 para
 %2</translation>
@@ -481,13 +451,13 @@ para
     <message>
         <source>Could not open
 %1</source>
-        <translation type="vanished">Não foi possível abrir
+        <translation>Não foi possível abrir
 %1</translation>
     </message>
     <message>
         <source>Could not write
 %1</source>
-        <translation type="vanished">Não foi possível escrever
+        <translation>Não foi possível escrever
 %1</translation>
     </message>
 </context>
@@ -495,207 +465,203 @@ para
     <name>Q3MainWindow</name>
     <message>
         <source>Line up</source>
-        <translation type="vanished">Alinhar</translation>
+        <translation>Alinhar</translation>
     </message>
     <message>
         <source>Customize...</source>
-        <translation type="vanished">Customizar...</translation>
+        <translation>Customizar...</translation>
     </message>
 </context>
 <context>
     <name>Q3NetworkProtocol</name>
     <message>
         <source>Operation stopped by the user</source>
-        <translation type="vanished">Operação terminada pelo usuário</translation>
+        <translation>Operação terminada pelo usuário</translation>
     </message>
 </context>
 <context>
     <name>Q3ProgressDialog</name>
     <message>
         <source>Cancel</source>
-        <translation type="vanished">Cancelar</translation>
+        <translation>Cancelar</translation>
     </message>
 </context>
 <context>
     <name>Q3TabDialog</name>
     <message>
         <source>OK</source>
-        <translation type="vanished">OK</translation>
+        <translation>OK</translation>
     </message>
     <message>
         <source>Apply</source>
-        <translation type="vanished">Aplicar</translation>
+        <translation>Aplicar</translation>
     </message>
     <message>
         <source>Help</source>
-        <translation type="vanished">Ajuda</translation>
+        <translation>Ajuda</translation>
     </message>
     <message>
         <source>Defaults</source>
-        <translation type="vanished">Padrões</translation>
+        <translation>Padrões</translation>
     </message>
     <message>
         <source>Cancel</source>
-        <translation type="vanished">Cancelar</translation>
+        <translation>Cancelar</translation>
     </message>
 </context>
 <context>
     <name>Q3TextEdit</name>
     <message>
         <source>&Undo</source>
-        <translation type="vanished">Desfazer (&U)</translation>
+        <translation>Desfazer (&U)</translation>
     </message>
     <message>
         <source>&Redo</source>
-        <translation type="vanished">&Refazer</translation>
+        <translation>&Refazer</translation>
     </message>
     <message>
         <source>Cu&t</source>
-        <translation type="vanished">Cor&tar</translation>
+        <translation>Cor&tar</translation>
     </message>
     <message>
         <source>&Copy</source>
-        <translation type="vanished">&Copiar</translation>
+        <translation>&Copiar</translation>
     </message>
     <message>
         <source>&Paste</source>
-        <translation type="vanished">Colar (&P)</translation>
+        <translation>Colar (&P)</translation>
     </message>
     <message>
         <source>Clear</source>
-        <translation type="vanished">Limpar</translation>
+        <translation>Limpar</translation>
     </message>
     <message>
         <source>Select All</source>
-        <translation type="vanished">Selecionar Todos</translation>
+        <translation>Selecionar Todos</translation>
     </message>
 </context>
 <context>
     <name>Q3TitleBar</name>
     <message>
         <source>System</source>
-        <translation type="vanished">Sistema</translation>
+        <translation>Sistema</translation>
     </message>
     <message>
         <source>Restore up</source>
-        <translation type="vanished">Restaurar no topo</translation>
+        <translation>Restaurar no topo</translation>
     </message>
     <message>
         <source>Minimize</source>
-        <translation type="vanished">Minimizar</translation>
+        <translation>Minimizar</translation>
     </message>
     <message>
         <source>Restore down</source>
-        <translation type="vanished">Restaurar abaixo</translation>
+        <translation>Restaurar abaixo</translation>
     </message>
     <message>
         <source>Maximize</source>
-        <translation type="vanished">Maximizar</translation>
+        <translation>Maximizar</translation>
     </message>
     <message>
         <source>Close</source>
-        <translation type="vanished">Fechar</translation>
+        <translation>Fechar</translation>
     </message>
     <message>
         <source>Contains commands to manipulate the window</source>
-        <translation type="vanished">Contém comandos para manipular a janela</translation>
+        <translation>Contém comandos para manipular a janela</translation>
     </message>
     <message>
         <source>Puts a minimized back to normal</source>
-        <translation type="vanished">Restaura uma janela minimizada de volta ao normal</translation>
+        <translation>Restaura uma janela minimizada de volta ao normal</translation>
     </message>
     <message>
         <source>Moves the window out of the way</source>
-        <translation type="vanished">Move a janela para fora do campo de visão</translation>
+        <translation>Move a janela para fora do campo de visão</translation>
     </message>
     <message>
         <source>Puts a maximized window back to normal</source>
-        <translation type="vanished">Restaura uma janela maximizada de volta ao normal</translation>
+        <translation>Restaura uma janela maximizada de volta ao normal</translation>
     </message>
     <message>
         <source>Makes the window full screen</source>
-        <translation type="vanished">Torna a janela em tela cheia</translation>
+        <translation>Torna a janela em tela cheia</translation>
     </message>
     <message>
         <source>Closes the window</source>
-        <translation type="vanished">Fecha a janela</translation>
-    </message>
-    <message>
-        <source>Displays the name of the window and contains controls to manipulate it</source>
-        <translation type="obsolete">Mostra o nome da janela e contém controlos para a manipular</translation>
+        <translation>Fecha a janela</translation>
     </message>
     <message>
         <source>Holds the name of the window and contains controls to manipulate it</source>
-        <translation type="vanished">Mostra o nome da janela e contém controles para manipulá-la</translation>
+        <translation>Mostra o nome da janela e contém controles para manipulá-la</translation>
     </message>
 </context>
 <context>
     <name>Q3ToolBar</name>
     <message>
         <source>More...</source>
-        <translation type="vanished">Mais...</translation>
+        <translation>Mais...</translation>
     </message>
 </context>
 <context>
     <name>Q3UrlOperator</name>
     <message>
         <source>The protocol `%1' is not supported</source>
-        <translation type="vanished">O protocolo '%1' não é suportado</translation>
+        <translation>O protocolo '%1' não é suportado</translation>
     </message>
     <message>
         <source>The protocol `%1' does not support listing directories</source>
-        <translation type="vanished">O protocolo '%1' não suporta listagem de diretórios</translation>
+        <translation>O protocolo '%1' não suporta listagem de diretórios</translation>
     </message>
     <message>
         <source>The protocol `%1' does not support creating new directories</source>
-        <translation type="vanished">O protocolo '%1' não suporta criação de novos diretórios</translation>
+        <translation>O protocolo '%1' não suporta criação de novos diretórios</translation>
     </message>
     <message>
         <source>The protocol `%1' does not support removing files or directories</source>
-        <translation type="vanished">O protocolo '%1' não suporta remover arquivos ou diretórios</translation>
+        <translation>O protocolo '%1' não suporta remover arquivos ou diretórios</translation>
     </message>
     <message>
         <source>The protocol `%1' does not support renaming files or directories</source>
-        <translation type="vanished">O protocolo '%1' não suporta renomear arquivos ou diretórios</translation>
+        <translation>O protocolo '%1' não suporta renomear arquivos ou diretórios</translation>
     </message>
     <message>
         <source>The protocol `%1' does not support getting files</source>
-        <translation type="vanished">O protocolo '%1' não suporta baixar arquivos</translation>
+        <translation>O protocolo '%1' não suporta baixar arquivos</translation>
     </message>
     <message>
         <source>The protocol `%1' does not support putting files</source>
-        <translation type="vanished">O protocolo '%1' não suporta enviar arquivos</translation>
+        <translation>O protocolo '%1' não suporta enviar arquivos</translation>
     </message>
     <message>
         <source>The protocol `%1' does not support copying or moving files or directories</source>
-        <translation type="vanished">O protocolo '%1' não suporta copiar ou mover arquivos ou diretórios</translation>
+        <translation>O protocolo '%1' não suporta copiar ou mover arquivos ou diretórios</translation>
     </message>
     <message>
         <source>(unknown)</source>
-        <translation type="vanished">(desconhecido)</translation>
+        <translation>(desconhecido)</translation>
     </message>
 </context>
 <context>
     <name>Q3Wizard</name>
     <message>
         <source>&Cancel</source>
-        <translation type="vanished">&Cancelar</translation>
+        <translation>&Cancelar</translation>
     </message>
     <message>
         <source>< &Back</source>
-        <translation type="vanished">< Voltar (&B)</translation>
+        <translation>< Voltar (&B)</translation>
     </message>
     <message>
         <source>&Next ></source>
-        <translation type="vanished">Próximo (&N) ></translation>
+        <translation>Próximo (&N) ></translation>
     </message>
     <message>
         <source>&Finish</source>
-        <translation type="vanished">&Finalizar</translation>
+        <translation>&Finalizar</translation>
     </message>
     <message>
         <source>&Help</source>
-        <translation type="vanished">Ajuda (&H)</translation>
+        <translation>Ajuda (&H)</translation>
     </message>
 </context>
 <context>
@@ -709,14 +675,6 @@ para
         <translation>Conexão recusada</translation>
     </message>
     <message>
-        <source>Connection timed out</source>
-        <translation type="unfinished">Ligação expirada</translation>
-    </message>
-    <message>
-        <source>Operation on socket is not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Socket operation timed out</source>
         <translation>Tempo esgotado durante operação de socket</translation>
     </message>
@@ -724,14 +682,6 @@ para
         <source>Socket is not connected</source>
         <translation>Socket não está conectado</translation>
     </message>
-    <message>
-        <source>Network unreachable</source>
-        <translation type="unfinished">Rede inalcançável</translation>
-    </message>
-    <message>
-        <source>Trying to connect while connection is in progress</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QAbstractSpinBox</name>
@@ -749,128 +699,10 @@ para
     </message>
 </context>
 <context>
-    <name>QAccessibleActionInterface</name>
-    <message>
-        <source>Press</source>
-        <translation type="unfinished">Pressionar</translation>
-    </message>
-    <message>
-        <source>Increase</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Decrease</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>ShowMenu</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>SetFocus</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Toggle</source>
-        <translation type="unfinished">Alternar</translation>
-    </message>
-    <message>
-        <source>Scroll Left</source>
-        <translation type="unfinished">Rolar para Esquerda</translation>
-    </message>
-    <message>
-        <source>Scroll Right</source>
-        <translation type="unfinished">Rolar para Direita</translation>
-    </message>
-    <message>
-        <source>Scroll Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scroll Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Previous Page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Next Page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Triggers the action</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Increase the value</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Decrease the value</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Shows the menu</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Sets the focus</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Toggles the state</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scrolls to the left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scrolls to the right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scrolls up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scrolls down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Goes back a page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Goes to the next page</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QAndroidPlatformTheme</name>
-    <message>
-        <source>Yes</source>
-        <translation type="unfinished">Sim</translation>
-    </message>
-    <message>
-        <source>Yes to All</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>No</source>
-        <translation type="unfinished">Não</translation>
-    </message>
-    <message>
-        <source>No to All</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
     <name>QApplication</name>
     <message>
         <source>Activate</source>
-        <translation type="vanished">Ativar</translation>
+        <translation>Ativar</translation>
     </message>
     <message>
         <source>Executable '%1' requires Qt %2, found Qt %3.</source>
@@ -881,109 +713,28 @@ para
         <translation>Erro de Biblioteca Qt Incompativel</translation>
     </message>
     <message>
-        <source>Activates the program's main window</source>
-        <translation type="vanished">Ativa a janela principal do programa</translation>
-    </message>
-    <message>
         <source>QT_LAYOUT_DIRECTION</source>
         <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
-        <translation type="vanished">LTR</translation>
-    </message>
-</context>
-<context>
-    <name>QAxSelect</name>
-    <message>
-        <source>Select ActiveX Control</source>
-        <translation type="obsolete">Seleccionar Controlo ActiveX</translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation type="obsolete">OK</translation>
-    </message>
-    <message>
-        <source>&Cancel</source>
-        <translation type="obsolete">&Cancelar</translation>
+        <translation>LTR</translation>
     </message>
     <message>
-        <source>COM &Object:</source>
-        <translation type="obsolete">&Objecto COM:</translation>
+        <source>Activates the program's main window</source>
+        <translation>Ativa a janela principal do programa</translation>
     </message>
 </context>
 <context>
     <name>QCheckBox</name>
     <message>
         <source>Uncheck</source>
-        <translation type="vanished">Desmarcar</translation>
+        <translation>Desmarcar</translation>
     </message>
     <message>
         <source>Check</source>
-        <translation type="vanished">Marcar</translation>
+        <translation>Marcar</translation>
     </message>
     <message>
         <source>Toggle</source>
-        <translation type="vanished">Alternar</translation>
-    </message>
-</context>
-<context>
-    <name>QCocoaMenuItem</name>
-    <message>
-        <source>About Qt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>About</source>
-        <translation type="unfinished">Sobre</translation>
-    </message>
-    <message>
-        <source>Config</source>
-        <translation type="unfinished">Configurar</translation>
-    </message>
-    <message>
-        <source>Preference</source>
-        <translation type="unfinished">Preferências</translation>
-    </message>
-    <message>
-        <source>Options</source>
-        <translation type="unfinished">Opções</translation>
-    </message>
-    <message>
-        <source>Setting</source>
-        <translation type="unfinished">Alteração</translation>
-    </message>
-    <message>
-        <source>Setup</source>
-        <translation type="unfinished">Configuração</translation>
-    </message>
-    <message>
-        <source>Quit</source>
-        <translation type="unfinished">Sair</translation>
-    </message>
-    <message>
-        <source>Exit</source>
-        <translation type="unfinished">Sair</translation>
-    </message>
-    <message>
-        <source>Cut</source>
-        <translation type="unfinished">Cortar</translation>
-    </message>
-    <message>
-        <source>Copy</source>
-        <translation type="unfinished">Copiar</translation>
-    </message>
-    <message>
-        <source>Paste</source>
-        <translation type="unfinished">Colar</translation>
-    </message>
-    <message>
-        <source>Select All</source>
-        <translation type="unfinished">Selecionar Todos</translation>
-    </message>
-</context>
-<context>
-    <name>QCocoaTheme</name>
-    <message>
-        <source>Don't Save</source>
-        <translation type="unfinished">Não Salvar</translation>
+        <translation>Alternar</translation>
     </message>
 </context>
 <context>
@@ -1017,10 +768,6 @@ para
         <translation>Canal A&lfa:</translation>
     </message>
     <message>
-        <source>Select Color</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>&Basic colors</source>
         <translation>Cores &básicas</translation>
     </message>
@@ -1029,44 +776,19 @@ para
         <translation>Cores &customizadas</translation>
     </message>
     <message>
-        <source>&Define Custom Colors >></source>
-        <translation type="obsolete">&Definir Cores Customizadas >></translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation type="obsolete">OK</translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="obsolete">Cancelar</translation>
-    </message>
-    <message>
         <source>&Add to Custom Colors</source>
         <translation>&Adicionar às Cores Customizadas</translation>
     </message>
     <message>
         <source>Select color</source>
-        <translation type="vanished">Selecionar Cor</translation>
-    </message>
-    <message>
-        <source>&HTML:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cursor at %1, %2
-Press ESC to cancel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&Pick Screen Color</source>
-        <translation type="unfinished"></translation>
+        <translation>Selecionar Cor</translation>
     </message>
 </context>
 <context>
     <name>QComboBox</name>
     <message>
         <source>Open</source>
-        <translation type="vanished">Abrir</translation>
+        <translation>Abrir</translation>
     </message>
     <message>
         <source>False</source>
@@ -1078,58 +800,36 @@ Press ESC to cancel</source>
     </message>
     <message>
         <source>Close</source>
-        <translation type="vanished">Fechar</translation>
-    </message>
-    <message>
-        <source>Open the combo box selection popup</source>
-        <translation type="unfinished"></translation>
+        <translation>Fechar</translation>
     </message>
 </context>
 <context>
-    <name>QCommandLineParser</name>
-    <message>
-        <source>Displays version information.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Displays this help.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown option '%1'.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown options: %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Missing value after '%1'.</source>
-        <translation type="unfinished"></translation>
-    </message>
+    <name>QCoreApplication</name>
     <message>
-        <source>Unexpected value after '%1'.</source>
-        <translation type="unfinished"></translation>
+        <source>%1: permission denied</source>
+        <comment>QSystemSemaphore</comment>
+        <translation>%1: permissão negada</translation>
     </message>
     <message>
-        <source>[options]</source>
-        <translation type="unfinished"></translation>
+        <source>%1: already exists</source>
+        <comment>QSystemSemaphore</comment>
+        <translation>%1: já existe</translation>
     </message>
     <message>
-        <source>Usage: %1</source>
-        <translation type="unfinished"></translation>
+        <source>%1: doesn't exists</source>
+        <comment>QSystemSemaphore</comment>
+        <translation>%1: não existe</translation>
     </message>
     <message>
-        <source>Options:</source>
-        <translation type="unfinished"></translation>
+        <source>%1: out of resources</source>
+        <comment>QSystemSemaphore</comment>
+        <translation>%1: sem recursos</translation>
     </message>
     <message>
-        <source>Arguments:</source>
-        <translation type="unfinished"></translation>
+        <source>%1: unknown error %2</source>
+        <comment>QSystemSemaphore</comment>
+        <translation>%1: erro desconhecido %2</translation>
     </message>
-</context>
-<context>
-    <name>QCoreApplication</name>
     <message>
         <source>%1: key is empty</source>
         <comment>QSystemSemaphore</comment>
@@ -1145,135 +845,6 @@ Press ESC to cancel</source>
         <comment>QSystemSemaphore</comment>
         <translation>%1: ftok falhou</translation>
     </message>
-    <message>
-        <source>%1: permission denied</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="vanished">%1: permissão negada</translation>
-    </message>
-    <message>
-        <source>%1: already exists</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="vanished">%1: já existe</translation>
-    </message>
-    <message>
-        <source>%1: doesn't exists</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="vanished">%1: não existe</translation>
-    </message>
-    <message>
-        <source>%1: out of resources</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="vanished">%1: sem recursos</translation>
-    </message>
-    <message>
-        <source>%1: unknown error %2</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="vanished">%1: erro desconhecido %2</translation>
-    </message>
-</context>
-<context>
-    <name>QCupsJobWidget</name>
-    <message>
-        <source>Job</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Job Control</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Scheduled printing:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Billing information:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Job priority:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Banner Pages</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>End:</source>
-        <comment>Banner page at end</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Start:</source>
-        <comment>Banner page at start</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Print Immediately</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hold Indefinitely</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Day (06:00 to 17:59)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Night (18:00 to 05:59)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Second Shift (16:00 to 23:59)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Third Shift (00:00 to 07:59)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Weekend (Saturday to Sunday)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Specific Time</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>None</source>
-        <comment>CUPS Banner page</comment>
-        <translation type="unfinished">Nenhum</translation>
-    </message>
-    <message>
-        <source>Standard</source>
-        <comment>CUPS Banner page</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unclassified</source>
-        <comment>CUPS Banner page</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Confidential</source>
-        <comment>CUPS Banner page</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Classified</source>
-        <comment>CUPS Banner page</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Secret</source>
-        <comment>CUPS Banner page</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Top Secret</source>
-        <comment>CUPS Banner page</comment>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QDB2Driver</name>
@@ -1322,63 +893,37 @@ Press ESC to cancel</source>
     </message>
 </context>
 <context>
-    <name>QDBusTrayIcon</name>
-    <message>
-        <source>OK</source>
-        <translation type="unfinished">OK</translation>
-    </message>
-</context>
-<context>
     <name>QDateTimeEdit</name>
     <message>
         <source>AM</source>
-        <translation type="vanished">AM</translation>
-    </message>
-    <message>
-        <source>am</source>
-        <translation type="vanished">am</translation>
-    </message>
-    <message>
-        <source>PM</source>
-        <translation type="vanished">PM</translation>
-    </message>
-    <message>
-        <source>pm</source>
-        <translation type="vanished">pm</translation>
-    </message>
-</context>
-<context>
-    <name>QDateTimeParser</name>
-    <message>
-        <source>AM</source>
-        <translation type="unfinished">AM</translation>
+        <translation>AM</translation>
     </message>
     <message>
         <source>am</source>
-        <translation type="unfinished">am</translation>
+        <translation>am</translation>
     </message>
     <message>
         <source>PM</source>
-        <translation type="unfinished">PM</translation>
+        <translation>PM</translation>
     </message>
     <message>
         <source>pm</source>
-        <translation type="unfinished">pm</translation>
+        <translation>pm</translation>
     </message>
 </context>
 <context>
     <name>QDial</name>
     <message>
         <source>QDial</source>
-        <translation type="vanished">QDial</translation>
+        <translation>QDial</translation>
     </message>
     <message>
         <source>SpeedoMeter</source>
-        <translation type="vanished">Velocímetro</translation>
+        <translation>Velocímetro</translation>
     </message>
     <message>
         <source>SliderHandle</source>
-        <translation type="vanished">SliderHandle</translation>
+        <translation>SliderHandle</translation>
     </message>
 </context>
 <context>
@@ -1389,7 +934,7 @@ Press ESC to cancel</source>
     </message>
     <message>
         <source>Done</source>
-        <translation type="vanished">Pronto</translation>
+        <translation>Pronto</translation>
     </message>
 </context>
 <context>
@@ -1400,95 +945,83 @@ Press ESC to cancel</source>
     </message>
     <message>
         <source>Save</source>
-        <translation type="vanished">Salvar</translation>
-    </message>
-    <message>
-        <source>&Save</source>
-        <translation type="obsolete">&Gravar</translation>
+        <translation>Salvar</translation>
     </message>
     <message>
         <source>Open</source>
-        <translation type="vanished">Abrir</translation>
+        <translation>Abrir</translation>
     </message>
     <message>
         <source>Cancel</source>
-        <translation type="vanished">Cancelar</translation>
-    </message>
-    <message>
-        <source>&Cancel</source>
-        <translation type="obsolete">&Cancelar</translation>
+        <translation>Cancelar</translation>
     </message>
     <message>
         <source>Close</source>
-        <translation type="vanished">Fechar</translation>
-    </message>
-    <message>
-        <source>&Close</source>
-        <translation type="obsolete">&Fechar</translation>
+        <translation>Fechar</translation>
     </message>
     <message>
         <source>Apply</source>
-        <translation type="vanished">Aplicar</translation>
+        <translation>Aplicar</translation>
     </message>
     <message>
         <source>Reset</source>
-        <translation type="vanished">Redefinir</translation>
+        <translation>Redefinir</translation>
     </message>
     <message>
         <source>Help</source>
-        <translation type="vanished">Ajuda</translation>
+        <translation>Ajuda</translation>
     </message>
     <message>
         <source>Don't Save</source>
-        <translation type="vanished">Não Salvar</translation>
+        <translation>Não Salvar</translation>
     </message>
     <message>
         <source>Discard</source>
-        <translation type="vanished">Descartar</translation>
+        <translation>Descartar</translation>
     </message>
     <message>
         <source>&Yes</source>
-        <translation type="vanished">Sim (&Y)</translation>
+        <translation>Sim (&Y)</translation>
     </message>
     <message>
         <source>Yes to &All</source>
-        <translation type="vanished">Sim para Todos (&A)</translation>
+        <translation>Sim para Todos (&A)</translation>
     </message>
     <message>
         <source>&No</source>
-        <translation type="vanished">&Não</translation>
+        <translation>&Não</translation>
     </message>
     <message>
         <source>N&o to All</source>
-        <translation type="vanished">Nã&o para Todos</translation>
+        <translation>Nã&o para Todos</translation>
     </message>
     <message>
         <source>Save All</source>
-        <translation type="vanished">Salvar Todos</translation>
+        <translation>Salvar Todos</translation>
     </message>
     <message>
         <source>Abort</source>
-        <translation type="vanished">Abortar</translation>
+        <translation>Abortar</translation>
     </message>
     <message>
         <source>Retry</source>
-        <translation type="vanished">Tentar Novamente</translation>
+        <translation>Tentar Novamente</translation>
     </message>
     <message>
         <source>Ignore</source>
-        <translation type="vanished">Ignorar</translation>
+        <translation>Ignorar</translation>
     </message>
     <message>
         <source>Restore Defaults</source>
-        <translation type="vanished">Restaurar Padrões</translation>
+        <translation>Restaurar Padrões</translation>
     </message>
     <message>
         <source>Close without Saving</source>
-        <translation type="vanished">Fechar sem Salvar</translation>
+        <translation>Fechar sem Salvar</translation>
     </message>
     <message>
         <source>&OK</source>
-        <translation type="vanished">&OK</translation>
+        <translation>&OK</translation>
     </message>
 </context>
 <context>
@@ -1517,145 +1050,29 @@ Press ESC to cancel</source>
     </message>
 </context>
 <context>
-    <name>QDnsLookup</name>
-    <message>
-        <source>Operation cancelled</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDnsLookupRunnable</name>
-    <message>
-        <source>IPv6 addresses for nameservers are currently not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid domain name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Not yet supported on Android</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Resolver functions not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Resolver initialization failed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Server could not process query</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Server failure</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Non existent domain</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Server refused to answer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid reply received</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Could not expand domain name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid IPv4 address record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid IPv6 address record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid canonical name record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid name server record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid pointer record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid mail exchange record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid service record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid text record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Resolver library can't be loaded: No runtime library loading support</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>No hostname given</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid hostname</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Host %1 could not be found.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown error</source>
-        <translation type="unfinished">Erro desconhecido</translation>
-    </message>
-</context>
-<context>
     <name>QDockWidget</name>
     <message>
         <source>Close</source>
-        <extracomment>Accessible name for button closing a dock widget</extracomment>
         <translation>Fechar</translation>
     </message>
     <message>
         <source>Dock</source>
-        <translation type="vanished">Embutir</translation>
+        <translation>Embutir</translation>
     </message>
     <message>
         <source>Float</source>
-        <extracomment>Accessible name for button undocking a dock widget (floating state)</extracomment>
         <translation>Flutuar</translation>
     </message>
-    <message>
-        <source>Undocks and re-attaches the dock widget</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Closes the dock widget</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QDoubleSpinBox</name>
     <message>
         <source>More</source>
-        <translation type="vanished">Mais</translation>
+        <translation>Mais</translation>
     </message>
     <message>
         <source>Less</source>
-        <translation type="vanished">Menos</translation>
+        <translation>Menos</translation>
     </message>
 </context>
 <context>
@@ -1682,60 +1099,6 @@ Press ESC to cancel</source>
     </message>
 </context>
 <context>
-    <name>QFile</name>
-    <message>
-        <source>Destination file exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot remove source file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot open %1 for input</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot open for output</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Failure to write block</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot create %1 for output</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Destination file is the same file.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Source file does not exist.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Error while renaming.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unable to restore from %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Will not rename sequential file using block copy</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QFileDevice</name>
-    <message>
-        <source>No file engine available or engine does not support UnMapExtension</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
     <name>QFileDialog</name>
     <message>
         <source>All Files (*)</source>
@@ -1812,14 +1175,6 @@ Por favor verifique o nome do arquivo e tente novamente.</translation>
         <translation>Diretório:</translation>
     </message>
     <message>
-        <source>
-File not found.
-Please verify the correct file name was given</source>
-        <translation type="obsolete">
-Ficheiro não encontrado.
-Por favor verifique o nome do ficheiro</translation>
-    </message>
-    <message>
         <source>%1
 Directory not found.
 Please verify the correct directory name was given.</source>
@@ -1835,21 +1190,13 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source>Are sure you want to delete '%1'?</source>
-        <translation type="vanished">Você tem certeza de que deseja apagar '%1'?</translation>
+        <translation>Você tem certeza de que deseja apagar '%1'?</translation>
     </message>
     <message>
         <source>Could not delete directory.</source>
         <translation>Não foi possível apagar o diretório.</translation>
     </message>
     <message>
-        <source>Recent Places</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>All Files (*.*)</source>
-        <translation type="obsolete">Todos os Ficheiros (*.*)</translation>
-    </message>
-    <message>
         <source>Save As</source>
         <translation>Salvar Como</translation>
     </message>
@@ -1905,191 +1252,101 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>Create New Folder</source>
         <translation>Criar Nova Pasta</translation>
     </message>
+</context>
+<context>
+    <name>QFileSystemModel</name>
     <message>
-        <source>Go back</source>
-        <translation type="unfinished"></translation>
+        <source>Invalid filename</source>
+        <translation>Nome de arquivo inválido</translation>
     </message>
     <message>
-        <source>Alt+Left</source>
-        <translation type="unfinished"></translation>
+        <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source>
+        <translation><b>O nome "%1" não pode ser utilizado.</b><p>Tente utilizar outro nome, com menos caracteres e sem sinais de pontuação.</translation>
     </message>
     <message>
-        <source>Go forward</source>
-        <translation type="unfinished"></translation>
+        <source>Name</source>
+        <translation>Nome</translation>
     </message>
     <message>
-        <source>Alt+Right</source>
-        <translation type="unfinished"></translation>
+        <source>Size</source>
+        <translation>Tamanho</translation>
     </message>
     <message>
-        <source>Go to the parent directory</source>
-        <translation type="unfinished"></translation>
+        <source>Kind</source>
+        <comment>Match OS X Finder</comment>
+        <translation>Espécie</translation>
     </message>
     <message>
-        <source>Alt+Up</source>
-        <translation type="unfinished"></translation>
+        <source>Type</source>
+        <comment>All other platforms</comment>
+        <translation>Tipo</translation>
     </message>
     <message>
-        <source>Create a New Folder</source>
-        <translation type="unfinished"></translation>
+        <source>Date Modified</source>
+        <translation>Data de Modificação</translation>
     </message>
     <message>
-        <source>Change to list view mode</source>
-        <translation type="unfinished"></translation>
+        <source>My Computer</source>
+        <translation>Meu Computador</translation>
     </message>
     <message>
-        <source>Change to detail view mode</source>
-        <translation type="unfinished"></translation>
+        <source>Computer</source>
+        <translation>Computador</translation>
     </message>
     <message>
-        <source>Sidebar</source>
-        <translation type="unfinished"></translation>
+        <source>%1 TB</source>
+        <translation>%1 TB</translation>
     </message>
     <message>
-        <source>List of places and bookmarks</source>
-        <translation type="unfinished"></translation>
+        <source>%1 GB</source>
+        <translation>%1 GB</translation>
     </message>
     <message>
-        <source>Files</source>
-        <translation type="unfinished"></translation>
+        <source>%1 MB</source>
+        <translation>%1 MB</translation>
     </message>
     <message>
-        <source>All files (*)</source>
-        <translation type="unfinished"></translation>
+        <source>%1 KB</source>
+        <translation>%1 KB</translation>
     </message>
     <message>
-        <source>Delete</source>
-        <translation type="unfinished"></translation>
+        <source>%1 bytes</source>
+        <translation>%1 bytes</translation>
     </message>
+</context>
+<context>
+    <name>QFontDatabase</name>
     <message>
-        <source>Are you sure you want to delete '%1'?</source>
-        <translation type="unfinished"></translation>
+        <source>Normal</source>
+        <translation>Normal</translation>
     </message>
     <message>
-        <source>%1 File</source>
-        <extracomment>%1 is a file name suffix, for example txt</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Bold</source>
+        <translation>Negrito</translation>
     </message>
     <message>
-        <source>File Folder</source>
-        <comment>Match Windows Explorer</comment>
-        <translation type="unfinished"></translation>
+        <source>Demi Bold</source>
+        <translation>Semi-Negrito</translation>
     </message>
     <message>
-        <source>Folder</source>
-        <comment>All other platforms</comment>
-        <translation type="unfinished"></translation>
+        <source>Black</source>
+        <translation>Black</translation>
     </message>
     <message>
-        <source>Alias</source>
-        <comment>OS X Finder</comment>
-        <translation type="unfinished"></translation>
+        <source>Demi</source>
+        <translation>Semi</translation>
     </message>
     <message>
-        <source>Shortcut</source>
-        <comment>All other platforms</comment>
-        <translation type="unfinished"></translation>
+        <source>Light</source>
+        <translation>Light</translation>
     </message>
-</context>
-<context>
-    <name>QFileSystemModel</name>
     <message>
-        <source>%1 TB</source>
-        <translation>%1 TB</translation>
+        <source>Italic</source>
+        <translation>Itálico</translation>
     </message>
     <message>
-        <source>%1 GB</source>
-        <translation>%1 GB</translation>
-    </message>
-    <message>
-        <source>%1 MB</source>
-        <translation>%1 MB</translation>
-    </message>
-    <message>
-        <source>%1 KB</source>
-        <translation>%1 KB</translation>
-    </message>
-    <message>
-        <source>%1 bytes</source>
-        <translation>%1 bytes</translation>
-    </message>
-    <message>
-        <source>Invalid filename</source>
-        <translation>Nome de arquivo inválido</translation>
-    </message>
-    <message>
-        <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source>
-        <translation><b>O nome "%1" não pode ser utilizado.</b><p>Tente utilizar outro nome, com menos caracteres e sem sinais de pontuação.</translation>
-    </message>
-    <message>
-        <source>Name</source>
-        <translation>Nome</translation>
-    </message>
-    <message>
-        <source>Size</source>
-        <translation>Tamanho</translation>
-    </message>
-    <message>
-        <source>Kind</source>
-        <comment>Match OS X Finder</comment>
-        <translation>Espécie</translation>
-    </message>
-    <message>
-        <source>Type</source>
-        <comment>All other platforms</comment>
-        <translation>Tipo</translation>
-    </message>
-    <message>
-        <source>Date Modified</source>
-        <translation>Data de Modificação</translation>
-    </message>
-    <message>
-        <source>My Computer</source>
-        <translation>Meu Computador</translation>
-    </message>
-    <message>
-        <source>Computer</source>
-        <translation>Computador</translation>
-    </message>
-    <message>
-        <source>%1 byte(s)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QFontDatabase</name>
-    <message>
-        <source>Normal</source>
-        <translation type="vanished">Normal</translation>
-    </message>
-    <message>
-        <source>Bold</source>
-        <translation>Negrito</translation>
-    </message>
-    <message>
-        <source>Demi Bold</source>
-        <translation>Semi-Negrito</translation>
-    </message>
-    <message>
-        <source>Black</source>
-        <translation>Black</translation>
-    </message>
-    <message>
-        <source>Demi</source>
-        <extracomment>The word for "Demi" as in "Demi Bold" used as a pattern for string searches</extracomment>
-        <translation>Semi</translation>
-    </message>
-    <message>
-        <source>Light</source>
-        <translation>Light</translation>
-    </message>
-    <message>
-        <source>Italic</source>
-        <translation>Itálico</translation>
-    </message>
-    <message>
-        <source>Oblique</source>
-        <translation>Oblíquo</translation>
+        <source>Oblique</source>
+        <translation>Oblíquo</translation>
     </message>
     <message>
         <source>Any</source>
@@ -2223,37 +1480,6 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>Runic</source>
         <translation>Rúnico</translation>
     </message>
-    <message>
-        <source>Normal</source>
-        <comment>The Normal or Regular font weight</comment>
-        <translation type="unfinished">Normal</translation>
-    </message>
-    <message>
-        <source>Medium</source>
-        <comment>The Medium font weight</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Thin</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Extra Light</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Extra Bold</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Extra</source>
-        <extracomment>The word for "Extra" as in "Extra Bold, Extra Thin" used as a pattern for string searches</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>N'Ko</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QFontDialog</name>
@@ -2309,16 +1535,12 @@ Você deseja apagá-lo mesmo assim?</translation>
         <translation>Conexão recusada pelo servidor %1</translation>
     </message>
     <message>
-        <source>Connection timed out to host %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Connected to host %1</source>
         <translation>Conectado ao servidor %1</translation>
     </message>
     <message>
         <source>Connection refused for data connection</source>
-        <translation type="vanished">Conexão recusada para conexão de dados</translation>
+        <translation>Conexão recusada para conexão de dados</translation>
     </message>
     <message>
         <source>Unknown error</source>
@@ -2384,54 +1606,19 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source>Host %1 found</source>
-        <translation type="vanished">Servidor %1 encontrado</translation>
+        <translation>Servidor %1 encontrado</translation>
     </message>
     <message>
         <source>Connection to %1 closed</source>
-        <translation type="vanished">Conexão a %1 fechada</translation>
+        <translation>Conexão a %1 fechada</translation>
     </message>
     <message>
         <source>Host found</source>
-        <translation type="vanished">Servidor encontrado</translation>
+        <translation>Servidor encontrado</translation>
     </message>
     <message>
         <source>Connected to host</source>
-        <translation type="vanished">Conectado ao servidor</translation>
-    </message>
-    <message>
-        <source>Data Connection refused</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QGnomeTheme</name>
-    <message>
-        <source>&OK</source>
-        <translation type="unfinished">&OK</translation>
-    </message>
-    <message>
-        <source>&Save</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&Cancel</source>
-        <translation type="unfinished">&Cancelar</translation>
-    </message>
-    <message>
-        <source>&Close</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Close without Saving</source>
-        <translation type="unfinished">Fechar sem Salvar</translation>
-    </message>
-</context>
-<context>
-    <name>QGuiApplication</name>
-    <message>
-        <source>QT_LAYOUT_DIRECTION</source>
-        <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
-        <translation type="unfinished">LTR</translation>
+        <translation>Conectado ao servidor</translation>
     </message>
 </context>
 <context>
@@ -2440,10 +1627,6 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>Unknown error</source>
         <translation>Erro desconhecido</translation>
     </message>
-    <message>
-        <source>No host name given</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QHostInfoAgent</name>
@@ -2459,44 +1642,28 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>Unknown error</source>
         <translation>Erro desconhecido</translation>
     </message>
-    <message>
-        <source>No host name given</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Invalid hostname</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown error (%1)</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QHttp</name>
     <message>
-        <source>HTTPS connection requested but SSL support not compiled in</source>
-        <translation type="vanished">Conexão HTTPS solicitada mas o suporte a SSL não foi compilado</translation>
-    </message>
-    <message>
         <source>Unknown error</source>
-        <translation type="vanished">Erro desconhecido</translation>
+        <translation>Erro desconhecido</translation>
     </message>
     <message>
         <source>Request aborted</source>
-        <translation type="vanished">Solicitação cancelada</translation>
+        <translation>Solicitação cancelada</translation>
     </message>
     <message>
         <source>No server set to connect to</source>
-        <translation type="vanished">Sem servidor para conexão</translation>
+        <translation>Sem servidor para conexão</translation>
     </message>
     <message>
         <source>Wrong content length</source>
-        <translation type="vanished">Tamanho de conteúdo inválido</translation>
+        <translation>Tamanho de conteúdo inválido</translation>
     </message>
     <message>
         <source>Server closed connection unexpectedly</source>
-        <translation type="vanished">O servidor fechou a conexão de forma inesperada</translation>
+        <translation>O servidor fechou a conexão de forma inesperada</translation>
     </message>
     <message>
         <source>Connection refused</source>
@@ -2508,35 +1675,35 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source>HTTP request failed</source>
-        <translation type="vanished">Solicitação HTTP falhou</translation>
+        <translation>Solicitação HTTP falhou</translation>
     </message>
     <message>
         <source>Invalid HTTP response header</source>
-        <translation type="vanished">Cabeçalho de resposta HTTP inválido</translation>
+        <translation>Cabeçalho de resposta HTTP inválido</translation>
     </message>
     <message>
         <source>Invalid HTTP chunked body</source>
-        <translation type="vanished">Corpo de documento HTTP inválido</translation>
+        <translation>Corpo de documento HTTP inválido</translation>
     </message>
     <message>
         <source>Host %1 found</source>
-        <translation type="vanished">Servidor %1 encontrado</translation>
+        <translation>Servidor %1 encontrado</translation>
     </message>
     <message>
         <source>Connected to host %1</source>
-        <translation type="vanished">Conectado ao servidor %1</translation>
+        <translation>Conectado ao servidor %1</translation>
     </message>
     <message>
         <source>Connection to %1 closed</source>
-        <translation type="vanished">Conexão a %1 fechada</translation>
+        <translation>Conexão a %1 fechada</translation>
     </message>
     <message>
         <source>Host found</source>
-        <translation type="vanished">Servidor encontrado</translation>
+        <translation>Servidor encontrado</translation>
     </message>
     <message>
         <source>Connected to host</source>
-        <translation type="vanished">Conectado ao servidor</translation>
+        <translation>Conectado ao servidor</translation>
     </message>
     <message>
         <source>Connection closed</source>
@@ -2544,15 +1711,19 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source>Proxy authentication required</source>
-        <translation type="vanished">Autenticação de proxy necessária</translation>
+        <translation>Autenticação de proxy necessária</translation>
     </message>
     <message>
         <source>Authentication required</source>
-        <translation type="vanished">Autenticação necessária</translation>
+        <translation>Autenticação necessária</translation>
+    </message>
+    <message>
+        <source>HTTPS connection requested but SSL support not compiled in</source>
+        <translation>Conexão HTTPS solicitada mas o suporte a SSL não foi compilado</translation>
     </message>
     <message>
         <source>Connection refused (or timed out)</source>
-        <translation type="vanished">Conexão recusada (ou tempo excedido)</translation>
+        <translation>Conexão recusada (ou tempo excedido)</translation>
     </message>
     <message>
         <source>Proxy requires authentication</source>
@@ -2574,53 +1745,13 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>SSL handshake failed</source>
         <translation>Handshake SSL falhou</translation>
     </message>
-    <message>
-        <source>Too many redirects</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Insecure redirect</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QHttpSocketEngine</name>
     <message>
-        <source>Did not receive HTTP response from proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Error parsing authentication request from proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Authentication required</source>
         <translation>Authentication required</translation>
     </message>
-    <message>
-        <source>Proxy denied connection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Error communicating with HTTP proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy server not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy connection refused</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy server connection timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Proxy connection closed prematurely</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QIBaseDriver</name>
@@ -2734,179 +1865,51 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>Unknown error</source>
         <translation>Erro desconhecido</translation>
     </message>
-    <message>
-        <source>file to open is a directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QImageReader</name>
-    <message>
-        <source>Invalid device</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>File not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unsupported image format</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unable to read image data</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unknown error</source>
-        <translation type="unfinished">Erro desconhecido</translation>
-    </message>
-</context>
-<context>
-    <name>QImageWriter</name>
-    <message>
-        <source>Unknown error</source>
-        <translation type="unfinished">Erro desconhecido</translation>
-    </message>
-    <message>
-        <source>Device is not set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Device not writable</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unsupported image format</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QInputContext</name>
     <message>
         <source>XIM</source>
-        <translation type="vanished">XIM</translation>
+        <translation>XIM</translation>
     </message>
     <message>
         <source>XIM input method</source>
-        <translation type="vanished">Método de entrada XIM</translation>
+        <translation>Método de entrada XIM</translation>
     </message>
     <message>
         <source>Windows input method</source>
-        <translation type="vanished">Método de entrada Windows</translation>
+        <translation>Método de entrada Windows</translation>
     </message>
     <message>
         <source>Mac OS X input method</source>
-        <translation type="vanished">Método de entrada Mac OS X</translation>
-    </message>
-</context>
-<context>
-    <name>QInputDialog</name>
-    <message>
-        <source>Enter a value:</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QJsonParseError</name>
-    <message>
-        <source>no error occurred</source>
-        <translation type="unfinished">nenhum erro ocorreu</translation>
-    </message>
-    <message>
-        <source>unterminated object</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>missing name separator</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unterminated array</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>missing value separator</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>illegal value</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid termination by number</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>illegal number</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid escape sequence</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid UTF8 string</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unterminated string</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>object is missing after a comma</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>too deeply nested document</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>too large document</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>garbage at the end of the document</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QKeySequenceEdit</name>
-    <message>
-        <source>Press shortcut</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1, ...</source>
-        <extracomment>This text is an "unfinished" shortcut, expands like "Ctrl+A, ..."</extracomment>
-        <translation type="unfinished"></translation>
+        <translation>Método de entrada Mac OS X</translation>
     </message>
 </context>
 <context>
     <name>QLibrary</name>
     <message>
         <source>QLibrary::load_sys: Cannot load %1 (%2)</source>
-        <translation type="vanished">QLibrary::load_sys: Não foi possível carregar %1 (%2)</translation>
+        <translation>QLibrary::load_sys: Não foi possível carregar %1 (%2)</translation>
     </message>
     <message>
         <source>QLibrary::unload_sys: Cannot unload %1 (%2)</source>
-        <translation type="vanished">QLibrary::unload_sys: Não foi possível descarregar %1 (%2)</translation>
+        <translation>QLibrary::unload_sys: Não foi possível descarregar %1 (%2)</translation>
     </message>
     <message>
         <source>QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3)</source>
-        <translation type="vanished">QLibrary::resolve_sys: Símbolo "%1" não definido em %2 (%3)</translation>
+        <translation>QLibrary::resolve_sys: Símbolo "%1" não definido em %2 (%3)</translation>
     </message>
     <message>
         <source>Could not mmap '%1': %2</source>
-        <translation type="vanished">Não foi possível mapear '%1': %2 (mmap)</translation>
+        <translation>Não foi possível mapear '%1': %2 (mmap)</translation>
     </message>
     <message>
         <source>Plugin verification data mismatch in '%1'</source>
-        <translation type="vanished">Dados de verificação do plugin não coincidem em '%1'</translation>
+        <translation>Dados de verificação do plugin não coincidem em '%1'</translation>
     </message>
     <message>
         <source>Could not unmap '%1': %2</source>
-        <translation type="vanished">Não foi possível liberar mapeamento '%1': %2</translation>
+        <translation>Não foi possível liberar mapeamento '%1': %2</translation>
     </message>
     <message>
         <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source>
@@ -2914,7 +1917,7 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source>
-        <translation type="vanished">O plugin '%1' utiliza uma biblioteca Qt incompatível. Chave de build esperada: "%2", encontrei: "%3"</translation>
+        <translation>O plugin '%1' utiliza uma biblioteca Qt incompatível. Chave de build esperada: "%2", encontrei: "%3"</translation>
     </message>
     <message>
         <source>Unknown error</source>
@@ -2932,103 +1935,43 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
         <translation>O plugin '%1' utiliza uma biblioteca Qt incompatível. (Não é possível misturar bibliotecas de debug e release.)</translation>
     </message>
+</context>
+<context>
+    <name>QLineEdit</name>
     <message>
-        <source>Cannot load library %1: %2</source>
-        <translation type="unfinished"></translation>
+        <source>&Undo</source>
+        <translation>Desfazer (&U)</translation>
     </message>
     <message>
-        <source>Cannot unload library %1: %2</source>
-        <translation type="unfinished"></translation>
+        <source>&Redo</source>
+        <translation>&Refazer</translation>
     </message>
     <message>
-        <source>Cannot resolve symbol "%1" in %2: %3</source>
-        <translation type="unfinished"></translation>
+        <source>Cu&t</source>
+        <translation>Cor&tar</translation>
     </message>
     <message>
-        <source>'%1' is not an ELF object (%2)</source>
-        <translation type="unfinished"></translation>
+        <source>&Copy</source>
+        <translation>&Copiar</translation>
     </message>
     <message>
-        <source>'%1' is not an ELF object</source>
-        <translation type="unfinished"></translation>
+        <source>&Paste</source>
+        <translation>Colar (&P)</translation>
     </message>
     <message>
-        <source>'%1' is an invalid ELF object (%2)</source>
-        <translation type="unfinished"></translation>
+        <source>Delete</source>
+        <translation>Apagar</translation>
     </message>
     <message>
-        <source>Failed to extract plugin meta data from '%1'</source>
-        <translation type="unfinished"></translation>
+        <source>Select All</source>
+        <translation>Selecionar Todos</translation>
     </message>
+</context>
+<context>
+    <name>QLocalServer</name>
     <message>
-        <source>'%1' is not a valid Mach-O binary (%2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>file is corrupt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>file too small</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>no suitable architecture in fat binary</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid magic %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>wrong architecture</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>not a dynamic library</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>'%1' is not a Qt plugin</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QLineEdit</name>
-    <message>
-        <source>&Undo</source>
-        <translation>Desfazer (&U)</translation>
-    </message>
-    <message>
-        <source>&Redo</source>
-        <translation>&Refazer</translation>
-    </message>
-    <message>
-        <source>Cu&t</source>
-        <translation>Cor&tar</translation>
-    </message>
-    <message>
-        <source>&Copy</source>
-        <translation>&Copiar</translation>
-    </message>
-    <message>
-        <source>&Paste</source>
-        <translation>Colar (&P)</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>Apagar</translation>
-    </message>
-    <message>
-        <source>Select All</source>
-        <translation>Selecionar Todos</translation>
-    </message>
-</context>
-<context>
-    <name>QLocalServer</name>
-    <message>
-        <source>%1: Name error</source>
-        <translation>%1: Erro de nome</translation>
+        <source>%1: Name error</source>
+        <translation>%1: Erro de nome</translation>
     </message>
     <message>
         <source>%1: Permission denied</source>
@@ -3082,31 +2025,15 @@ Você deseja apagá-lo mesmo assim?</translation>
         <translation>%1: A operação de socket não é suportada</translation>
     </message>
     <message>
-        <source>%1: Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>%1: Unknown error %2</source>
         <translation>%1: Erro desconhecido %2</translation>
     </message>
-    <message>
-        <source>%1: Operation not permitted when socket is in this state</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Trying to connect while connection is in progress</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1: Access denied</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QMYSQLDriver</name>
     <message>
         <source>Unable to open database '</source>
-        <translation type="vanished">Não foi possível abrir banco de dados '</translation>
+        <translation>Não foi possível abrir banco de dados '</translation>
     </message>
     <message>
         <source>Unable to connect</source>
@@ -3124,14 +2051,6 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>Unable to rollback transaction</source>
         <translation>Não foi possível fazer rollback da transação</translation>
     </message>
-    <message>
-        <source>Unable to allocate a MYSQL object</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Unable to open database '%1'</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QMYSQLResult</name>
@@ -3266,66 +2185,15 @@ Você deseja apagá-lo mesmo assim?</translation>
     <name>QMenu</name>
     <message>
         <source>Close</source>
-        <translation type="vanished">Fechar</translation>
+        <translation>Fechar</translation>
     </message>
     <message>
         <source>Open</source>
-        <translation type="vanished">Abrir</translation>
+        <translation>Abrir</translation>
     </message>
     <message>
         <source>Execute</source>
-        <translation type="vanished">Executar</translation>
-    </message>
-</context>
-<context>
-    <name>QMenuBar</name>
-    <message>
-        <source>About</source>
-        <translation type="obsolete">Sobre</translation>
-    </message>
-    <message>
-        <source>Config</source>
-        <translation type="obsolete">Configurar</translation>
-    </message>
-    <message>
-        <source>Preference</source>
-        <translation type="obsolete">Preferências</translation>
-    </message>
-    <message>
-        <source>Options</source>
-        <translation type="obsolete">Opções</translation>
-    </message>
-    <message>
-        <source>Setting</source>
-        <translation type="obsolete">Alteração</translation>
-    </message>
-    <message>
-        <source>Setup</source>
-        <translation type="obsolete">Configuração</translation>
-    </message>
-    <message>
-        <source>Quit</source>
-        <translation type="obsolete">Sair</translation>
-    </message>
-    <message>
-        <source>Exit</source>
-        <translation type="obsolete">Sair</translation>
-    </message>
-    <message>
-        <source>About %1</source>
-        <translation type="obsolete">Sobre %1</translation>
-    </message>
-    <message>
-        <source>About Qt</source>
-        <translation type="obsolete">Acerca do Qt</translation>
-    </message>
-    <message>
-        <source>Preferences</source>
-        <translation type="obsolete">Preferências</translation>
-    </message>
-    <message>
-        <source>Quit %1</source>
-        <translation type="obsolete">Sair de %1</translation>
+        <translation>Executar</translation>
     </message>
 </context>
 <context>
@@ -3344,11 +2212,7 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source><p>This program uses Qt version %1.</p></source>
-        <translation type="vanished"><p>Este programa utiliza o Qt versão %1.</p></translation>
-    </message>
-    <message>
-        <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qtopia Core.</p><p>Qt is a Trolltech product. See <a href="http://qt.nokia.com/qt/">qt.nokia.com/qt/</a> for more information.</p&g [...]
-        <translation type="obsolete"><h3>Acerca do Qt</h3>%1<p>Qt é um conjunto de ferramentas para desenvolvimento de aplicações multiplataforma.</p>O Qt oferece portabilidade de código fonte único em MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux e todas as principais variantes comerciais de Unix. O Qt está igualmente disponível para dispositivos embebidos como Qtopia Core.</p><p>O Qt é um produto Trolltech. Veja <a href="http://qt.no [...]
+        <translation><p>Este programa utiliza o Qt versão %1.</p></translation>
     </message>
     <message>
         <source>Show Details...</source>
@@ -3359,42 +2223,30 @@ Você deseja apagá-lo mesmo assim?</translation>
         <translation>Ocultar Detalhes...</translation>
     </message>
     <message>
-        <source><p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a> for an overview of Qt licensing.</p></source>
-        <translation type="obsolete"><p>Este programa usa Qt Open Source Edition versão %1.</p><p>Qt Open Source Edition é indicado para o desenvolvimento de aplicações/programas open source. Se pretender desenvolver aplicações sem disponibilizar o codigo fonte, então precisará de obter uma licença comercial.</p><p>Por favor consulte <a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a>para obter mais informação a [...]
-    </message>
-    <message>
         <source><p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> for an overview of Qt licensing.</p></source>
-        <translation type="vanished"><p>Este programa utiliza a Edição Open Source do Qt versão %1.</p><p>A Edição Open Source do Qt é destinada ao desenvolvimento de aplicações de código aberto. Você precisa de uma licença comercial do Qt para desenvolvimento de aplicações proprietárias (de código fechado).</p><p>Por favor leia <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> para uma visão geral s [...]
+        <translation><p>Este programa utiliza a Edição Open Source do Qt versão %1.</p><p>A Edição Open Source do Qt é destinada ao desenvolvimento de aplicações de código aberto. Você precisa de uma licença comercial do Qt para desenvolvimento de aplicações proprietárias (de código fechado).</p><p>Por favor leia <a href="http://www.trolltech.com/company/model/">www.trolltech.com/company/model/</a> para uma visão geral sobre o licenciam [...]
     </message>
     <message>
         <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://www.trolltech.com/qt/">www.trolltech.com/qt/&l [...]
-        <translation type="vanished"><h3>Sobre o Qt</h3>%1<p>O Qt é um toolkit C++ para desenvolvimento de aplicativos multi-plataforma.</p><p>O Qt permite portabilidade de código entre  MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, e todas as principais variantes comerciais de Unix. O Qt também está disponível para dispositivos embarcados na forma do Qt for Embedded Linux e Qt for Windows CE.</p><p>O Qt é um produto da Nokia. Acesse o  [...]
-    </message>
-    <message>
-        <source><h3>About Qt</h3><p>This program uses Qt version %1.</p></source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate  [...]
-        <translation type="unfinished"></translation>
+        <translation><h3>Sobre o Qt</h3>%1<p>O Qt é um toolkit C++ para desenvolvimento de aplicativos multi-plataforma.</p><p>O Qt permite portabilidade de código entre  MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, e todas as principais variantes comerciais de Unix. O Qt também está disponível para dispositivos embarcados na forma do Qt for Embedded Linux e Qt for Windows CE.</p><p>O Qt é um produto da Nokia. Acesse o site <a href= [...]
     </message>
 </context>
 <context>
     <name>QMultiInputContext</name>
     <message>
         <source>Select IM</source>
-        <translation type="vanished">Selecionar Método de Entrada</translation>
+        <translation>Selecionar Método de Entrada</translation>
     </message>
 </context>
 <context>
     <name>QMultiInputContextPlugin</name>
     <message>
         <source>Multiple input method switcher</source>
-        <translation type="vanished">Alternador de múltiplos métodos de entrada</translation>
+        <translation>Alternador de múltiplos métodos de entrada</translation>
     </message>
     <message>
         <source>Multiple input method switcher that uses the context menu of the text widgets</source>
-        <translation type="vanished">Alternador de múltiplos métodos de entrada que utiliza o menu de contexto dos widgets de texto</translation>
+        <translation>Alternador de múltiplos métodos de entrada que utiliza o menu de contexto dos widgets de texto</translation>
     </message>
 </context>
 <context>
@@ -3503,47 +2355,6 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>The proxy type is invalid for this operation</source>
         <translation>O tipo de proxy é inválido para esta operação</translation>
     </message>
-    <message>
-        <source>Temporary error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Network dropped connection on reset</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Connection reset by peer</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkAccessCacheBackend</name>
-    <message>
-        <source>Error opening %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkAccessDataBackend</name>
-    <message>
-        <source>Invalid URI: %1</source>
-        <translation type="unfinished">URI inválida: %1</translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkAccessDebugPipeBackend</name>
-    <message>
-        <source>Write error writing to %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Socket error on %1: %2</source>
-        <translation type="unfinished">Erro de socket em %1: %2</translation>
-    </message>
-    <message>
-        <source>Remote host closed the connection prematurely on %1</source>
-        <translation type="unfinished">A máquina remota fechou a conexão prematuramente em %1</translation>
-    </message>
 </context>
 <context>
     <name>QNetworkAccessFileBackend</name>
@@ -3571,10 +2382,6 @@ Você deseja apagá-lo mesmo assim?</translation>
 <context>
     <name>QNetworkAccessFtpBackend</name>
     <message>
-        <source>No suitable proxy found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Cannot open %1: is a directory</source>
         <translation>Não foi possível abrir %1: é um diretório</translation>
     </message>
@@ -3592,53 +2399,15 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
 </context>
 <context>
-    <name>QNetworkAccessManager</name>
-    <message>
-        <source>Network access is disabled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
     <name>QNetworkReply</name>
     <message>
         <source>Error downloading %1 - server replied: %2</source>
-        <translation type="vanished">Erro ao baixar %1 - o servidor respondeu: %2</translation>
+        <translation>Erro ao baixar %1 - o servidor respondeu: %2</translation>
     </message>
     <message>
         <source>Protocol "%1" is unknown</source>
         <translation>O protocolo "%1" é desconhecido</translation>
     </message>
-    <message>
-        <source>Error transferring %1 - server replied: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Background request not allowed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Network session error.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>backend start error.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Temporary network failure.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkReplyHttpImpl</name>
-    <message>
-        <source>Operation canceled</source>
-        <translation type="unfinished">Operação cancelada</translation>
-    </message>
-    <message>
-        <source>No suitable proxy found</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QNetworkReplyImpl</name>
@@ -3648,36 +2417,6 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
 </context>
 <context>
-    <name>QNetworkSession</name>
-    <message>
-        <source>Invalid configuration.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkSessionPrivateImpl</name>
-    <message>
-        <source>Unknown session error.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The session was aborted by the user or system.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The requested operation is not supported by the system.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>The specified configuration cannot be used.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Roaming was aborted or is not possible.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
     <name>QOCIDriver</name>
     <message>
         <source>Unable to logon</source>
@@ -3729,16 +2468,12 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source>Unable to execute select statement</source>
-        <translation type="vanished">Não foi possível executar declaração de select</translation>
+        <translation>Não foi possível executar declaração de select</translation>
     </message>
     <message>
         <source>Unable to execute statement</source>
         <translation>Não foi possível executar declaração</translation>
     </message>
-    <message>
-        <source>Unable to get statement type</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QODBCDriver</name>
@@ -3748,7 +2483,7 @@ Você deseja apagá-lo mesmo assim?</translation>
     </message>
     <message>
         <source>Unable to connect - Driver doesn't support all needed functionality</source>
-        <translation type="vanished">Não foi possível conectar - O driver não suporta todas as funcionalidades necessárias</translation>
+        <translation>Não foi possível conectar - O driver não suporta todas as funcionalidades necessárias</translation>
     </message>
     <message>
         <source>Unable to disable autocommit</source>
@@ -3766,10 +2501,6 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>Unable to enable autocommit</source>
         <translation>Não foi possível habilitar autocommit</translation>
     </message>
-    <message>
-        <source>Unable to connect - Driver doesn't support all functionality required</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QODBCResult</name>
@@ -3813,47 +2544,43 @@ Você deseja apagá-lo mesmo assim?</translation>
 <context>
     <name>QObject</name>
     <message>
-        <source>Home</source>
-        <translation type="obsolete">Início</translation>
-    </message>
-    <message>
         <source>Operation not supported on %1</source>
-        <translation type="vanished">Operação não suportada em %1</translation>
+        <translation>Operação não suportada em %1</translation>
     </message>
     <message>
         <source>Invalid URI: %1</source>
-        <translation type="vanished">URI inválida: %1</translation>
+        <translation>URI inválida: %1</translation>
     </message>
     <message>
         <source>Write error writing to %1: %2</source>
-        <translation type="vanished">Erro ao escrever em %1: %2</translation>
+        <translation>Erro ao escrever em %1: %2</translation>
     </message>
     <message>
         <source>Read error reading from %1: %2</source>
-        <translation type="vanished">Erro ao ler de %1: %2</translation>
+        <translation>Erro ao ler de %1: %2</translation>
     </message>
     <message>
         <source>Socket error on %1: %2</source>
-        <translation type="vanished">Erro de socket em %1: %2</translation>
+        <translation>Erro de socket em %1: %2</translation>
     </message>
     <message>
         <source>Remote host closed the connection prematurely on %1</source>
-        <translation type="vanished">A máquina remota fechou a conexão prematuramente em %1</translation>
+        <translation>A máquina remota fechou a conexão prematuramente em %1</translation>
     </message>
     <message>
         <source>Protocol error: packet of size 0 received</source>
-        <translation type="vanished">Erro de protocolo: recebido tamanho de pacote zero</translation>
+        <translation>Erro de protocolo: recebido tamanho de pacote zero</translation>
     </message>
 </context>
 <context>
     <name>QPPDOptionsModel</name>
     <message>
         <source>Name</source>
-        <translation type="vanished">Nome</translation>
+        <translation>Nome</translation>
     </message>
     <message>
         <source>Value</source>
-        <translation type="vanished">Valor</translation>
+        <translation>Valor</translation>
     </message>
 </context>
 <context>
@@ -3898,7 +2625,7 @@ Você deseja apagá-lo mesmo assim?</translation>
     <name>QPageSetupWidget</name>
     <message>
         <source>Centimeters (cm)</source>
-        <translation type="vanished">Centímetros (cm)</translation>
+        <translation>Centímetros (cm)</translation>
     </message>
     <message>
         <source>Millimeters (mm)</source>
@@ -3976,3909 +2703,1188 @@ Você deseja apagá-lo mesmo assim?</translation>
         <source>bottom margin</source>
         <translation>margem inferior</translation>
     </message>
+</context>
+<context>
+    <name>QPluginLoader</name>
     <message>
-        <source>Page Layout</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page order:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pages per sheet:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pica (P̸)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Didot (DD)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cicero (CC)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Custom</source>
-        <translation type="unfinished">Customizado</translation>
-    </message>
-    <message>
-        <source>mm</source>
-        <extracomment>Unit 'Millimeter'</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>pt</source>
-        <extracomment>Unit 'Points'</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>in</source>
-        <extracomment>Unit 'Inch'</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>P̸</source>
-        <extracomment>Unit 'Pica'</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>DD</source>
-        <extracomment>Unit 'Didot'</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Unknown error</source>
+        <translation>Erro desconhecido</translation>
     </message>
     <message>
-        <source>CC</source>
-        <extracomment>Unit 'Cicero'</extracomment>
-        <translation type="unfinished"></translation>
+        <source>The plugin was not loaded.</source>
+        <translation>O plugin não foi carregado.</translation>
     </message>
 </context>
 <context>
-    <name>QPageSize</name>
+    <name>QPrintDialog</name>
     <message>
-        <source>Custom (%1mm x %2mm)</source>
-        <extracomment>Custom size name in millimeters</extracomment>
-        <translation type="unfinished"></translation>
+        <source>locally connected</source>
+        <translation>conectado localmente</translation>
     </message>
     <message>
-        <source>Custom (%1pt x %2pt)</source>
-        <extracomment>Custom size name in points</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Aliases: %1</source>
+        <translation>Aliases: %1</translation>
     </message>
     <message>
-        <source>Custom (%1in x %2in)</source>
-        <extracomment>Custom size name in inches</extracomment>
-        <translation type="unfinished"></translation>
+        <source>unknown</source>
+        <translation>desconhecido</translation>
     </message>
     <message>
-        <source>Custom (%1pc x %2pc)</source>
-        <extracomment>Custom size name in picas</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Print To File ...</source>
+        <translation>Imprimir Para Arquivo ...</translation>
     </message>
     <message>
-        <source>Custom (%1DD x %2DD)</source>
-        <extracomment>Custom size name in didots</extracomment>
-        <translation type="unfinished"></translation>
+        <source>File %1 is not writable.
+Please choose a different file name.</source>
+        <translation>O arquivo %1 não pode ser escrito.
+Por favor escolha um nome de arquivo diferente.</translation>
     </message>
     <message>
-        <source>Custom (%1CC x %2CC)</source>
-        <extracomment>Custom size name in ciceros</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1 already exists.
+Do you want to overwrite it?</source>
+        <translation>%1 já existe.Você deseja substituí-lo?</translation>
     </message>
     <message>
-        <source>%1 x %2 in</source>
-        <extracomment>Page size in 'Inch'.</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1 is a directory.
+Please choose a different file name.</source>
+        <translation>%1 é um diretório.
+Por favor escolha um nome de arquivo diferente.</translation>
     </message>
     <message>
         <source>A0</source>
-        <translation type="unfinished">A0</translation>
+        <translation>A0</translation>
     </message>
     <message>
         <source>A1</source>
-        <translation type="unfinished">A1</translation>
+        <translation>A1</translation>
     </message>
     <message>
         <source>A2</source>
-        <translation type="unfinished">A2</translation>
+        <translation>A2</translation>
     </message>
     <message>
         <source>A3</source>
-        <translation type="unfinished">A3</translation>
+        <translation>A3</translation>
     </message>
     <message>
         <source>A4</source>
-        <translation type="unfinished">A4</translation>
+        <translation>A4</translation>
     </message>
     <message>
         <source>A5</source>
-        <translation type="unfinished">A5</translation>
+        <translation>A5</translation>
     </message>
     <message>
         <source>A6</source>
-        <translation type="unfinished">A6</translation>
+        <translation>A6</translation>
     </message>
     <message>
         <source>A7</source>
-        <translation type="unfinished">A7</translation>
+        <translation>A7</translation>
     </message>
     <message>
         <source>A8</source>
-        <translation type="unfinished">A8</translation>
+        <translation>A8</translation>
     </message>
     <message>
         <source>A9</source>
-        <translation type="unfinished">A9</translation>
-    </message>
-    <message>
-        <source>A10</source>
-        <translation type="unfinished">A10</translation>
+        <translation>A9</translation>
     </message>
     <message>
         <source>B0</source>
-        <translation type="unfinished">B0</translation>
+        <translation>B0</translation>
     </message>
     <message>
         <source>B1</source>
-        <translation type="unfinished">B1</translation>
+        <translation>B1</translation>
     </message>
     <message>
         <source>B2</source>
-        <translation type="unfinished">B2</translation>
+        <translation>B2</translation>
     </message>
     <message>
         <source>B3</source>
-        <translation type="unfinished">B3</translation>
+        <translation>B3</translation>
     </message>
     <message>
         <source>B4</source>
-        <translation type="unfinished">B4</translation>
+        <translation>B4</translation>
     </message>
     <message>
         <source>B5</source>
-        <translation type="unfinished">B5</translation>
+        <translation>B5</translation>
     </message>
     <message>
         <source>B6</source>
-        <translation type="unfinished">B6</translation>
+        <translation>B6</translation>
     </message>
     <message>
         <source>B7</source>
-        <translation type="unfinished">B7</translation>
+        <translation>B7</translation>
     </message>
     <message>
         <source>B8</source>
-        <translation type="unfinished">B8</translation>
+        <translation>B8</translation>
     </message>
     <message>
         <source>B9</source>
-        <translation type="unfinished">B9</translation>
+        <translation>B9</translation>
     </message>
     <message>
         <source>B10</source>
-        <translation type="unfinished">B10</translation>
+        <translation>B10</translation>
     </message>
     <message>
-        <source>Executive (7.5 x 10 in)</source>
-        <translation type="unfinished"></translation>
+        <source>C5E</source>
+        <translation>C5E</translation>
     </message>
     <message>
-        <source>Executive (7.25 x 10.5 in)</source>
-        <translation type="unfinished"></translation>
+        <source>DLE</source>
+        <translation>DLE</translation>
     </message>
     <message>
-        <source>Folio (8.27 x 13 in)</source>
-        <translation type="unfinished"></translation>
+        <source>Executive</source>
+        <translation>Executivo</translation>
     </message>
     <message>
-        <source>Legal</source>
-        <translation type="unfinished">Legal</translation>
+        <source>Folio</source>
+        <translation>Folio</translation>
     </message>
     <message>
-        <source>Letter / ANSI A</source>
-        <translation type="unfinished"></translation>
+        <source>Ledger</source>
+        <translation>Livro</translation>
     </message>
     <message>
-        <source>Tabloid / ANSI B</source>
-        <translation type="unfinished"></translation>
+        <source>Legal</source>
+        <translation>Legal</translation>
     </message>
     <message>
-        <source>Ledger / ANSI B</source>
-        <translation type="unfinished"></translation>
+        <source>Letter</source>
+        <translation>Carta</translation>
     </message>
     <message>
-        <source>Custom</source>
-        <translation type="unfinished">Customizado</translation>
+        <source>Tabloid</source>
+        <translation>Tablóide</translation>
     </message>
     <message>
-        <source>A3 Extra</source>
-        <translation type="unfinished"></translation>
+        <source>US Common #10 Envelope</source>
+        <translation>Envelope Comum US #10</translation>
     </message>
     <message>
-        <source>A4 Extra</source>
-        <translation type="unfinished"></translation>
+        <source>Custom</source>
+        <translation>Customizado</translation>
     </message>
     <message>
-        <source>A4 Plus</source>
-        <translation type="unfinished"></translation>
+        <source>&Options >></source>
+        <translation>&Opções >></translation>
     </message>
     <message>
-        <source>A4 Small</source>
-        <translation type="unfinished"></translation>
+        <source>&Print</source>
+        <translation>Im&primir</translation>
     </message>
     <message>
-        <source>A5 Extra</source>
-        <translation type="unfinished"></translation>
+        <source>&Options <<</source>
+        <translation>&Opções <<</translation>
     </message>
     <message>
-        <source>B5 Extra</source>
-        <translation type="unfinished"></translation>
+        <source>Print to File (PDF)</source>
+        <translation>Imprimir para Arquivo (PDF)</translation>
     </message>
     <message>
-        <source>JIS B0</source>
-        <translation type="unfinished"></translation>
+        <source>Print to File (Postscript)</source>
+        <translation>Imprimir para Arquivo (Postscript)</translation>
     </message>
     <message>
-        <source>JIS B1</source>
-        <translation type="unfinished"></translation>
+        <source>Local file</source>
+        <translation>Arquivo local</translation>
     </message>
     <message>
-        <source>JIS B2</source>
-        <translation type="unfinished"></translation>
+        <source>Write %1 file</source>
+        <translation>Escrever para arquivo %1</translation>
     </message>
+</context>
+<context>
+    <name>QPrintPreviewDialog</name>
     <message>
-        <source>JIS B3</source>
-        <translation type="unfinished"></translation>
+        <source>Page Setup</source>
+        <translation>Configurações de Página</translation>
     </message>
     <message>
-        <source>JIS B4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>JIS B5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>JIS B6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>JIS B7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>JIS B8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>JIS B9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>JIS B10</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>ANSI C</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>ANSI D</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>ANSI E</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Legal Extra</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Letter Extra</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Letter Plus</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Letter Small</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Tabloid Extra</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Architect A</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Architect B</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Architect C</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Architect D</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Architect E</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Note</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Quarto</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Super A</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Super B</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Postcard</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Double Postcard</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>PRC 16K</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>PRC 32K</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>PRC 32K Big</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Fan-fold US (14.875 x 11 in)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Fan-fold German (8.5 x 12 in)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Fan-fold German Legal (8.5 x 13 in)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope B4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope B5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope B6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C65</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope C7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope DL</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope US 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope US 10</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope US 11</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope US 12</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope US 14</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Monarch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Personal</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Chou 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Chou 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Invite</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Italian</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Kaku 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope Kaku 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope PRC 10</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Envelope You 4</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPlatformTheme</name>
-    <message>
-        <source>OK</source>
-        <translation type="unfinished">OK</translation>
-    </message>
-    <message>
-        <source>Save</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Save All</source>
-        <translation type="unfinished">Salvar Todos</translation>
-    </message>
-    <message>
-        <source>Open</source>
-        <translation type="unfinished">Abrir</translation>
-    </message>
-    <message>
-        <source>&Yes</source>
-        <translation type="unfinished">Sim (&Y)</translation>
-    </message>
-    <message>
-        <source>Yes to &All</source>
-        <translation type="unfinished">Sim para Todos (&A)</translation>
-    </message>
-    <message>
-        <source>&No</source>
-        <translation type="unfinished">&Não</translation>
-    </message>
-    <message>
-        <source>N&o to All</source>
-        <translation type="unfinished">Nã&o para Todos</translation>
-    </message>
-    <message>
-        <source>Abort</source>
-        <translation type="unfinished">Abortar</translation>
-    </message>
-    <message>
-        <source>Retry</source>
-        <translation type="unfinished">Tentar Novamente</translation>
-    </message>
-    <message>
-        <source>Ignore</source>
-        <translation type="unfinished">Ignorar</translation>
-    </message>
-    <message>
-        <source>Close</source>
-        <translation type="unfinished">Fechar</translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="unfinished">Cancelar</translation>
-    </message>
-    <message>
-        <source>Discard</source>
-        <translation type="unfinished">Descartar</translation>
-    </message>
-    <message>
-        <source>Help</source>
-        <translation type="unfinished">Ajuda</translation>
-    </message>
-    <message>
-        <source>Apply</source>
-        <translation type="unfinished">Aplicar</translation>
-    </message>
-    <message>
-        <source>Reset</source>
-        <translation type="unfinished">Redefinir</translation>
-    </message>
-    <message>
-        <source>Restore Defaults</source>
-        <translation type="unfinished">Restaurar Padrões</translation>
-    </message>
-</context>
-<context>
-    <name>QPluginLoader</name>
-    <message>
-        <source>Unknown error</source>
-        <translation>Erro desconhecido</translation>
-    </message>
-    <message>
-        <source>The plugin was not loaded.</source>
-        <translation>O plugin não foi carregado.</translation>
-    </message>
-</context>
-<context>
-    <name>QPrintDialog</name>
-    <message>
-        <source>locally connected</source>
-        <translation type="vanished">conectado localmente</translation>
-    </message>
-    <message>
-        <source>Aliases: %1</source>
-        <translation type="vanished">Aliases: %1</translation>
-    </message>
-    <message>
-        <source>unknown</source>
-        <translation type="vanished">desconhecido</translation>
-    </message>
-    <message>
-        <source>Portrait</source>
-        <translation type="obsolete">Retrato</translation>
-    </message>
-    <message>
-        <source>Landscape</source>
-        <translation type="obsolete">Paisagem</translation>
-    </message>
-    <message>
-        <source>A0 (841 x 1189 mm)</source>
-        <translation type="obsolete">A0 (841 x 1189 mm)</translation>
-    </message>
-    <message>
-        <source>A1 (594 x 841 mm)</source>
-        <translation type="obsolete">A1 (594 x 841 mm)</translation>
-    </message>
-    <message>
-        <source>A2 (420 x 594 mm)</source>
-        <translation type="obsolete">A2 (420 x 594 mm)</translation>
-    </message>
-    <message>
-        <source>A3 (297 x 420 mm)</source>
-        <translation type="obsolete">A3 (297 x 420 mm)</translation>
-    </message>
-    <message>
-        <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
-        <translation type="obsolete">A4 (210 x 297 mm, 8.26 x 11.7 polegadas)</translation>
-    </message>
-    <message>
-        <source>A5 (148 x 210 mm)</source>
-        <translation type="obsolete">A5 (148 x 210 mm)</translation>
-    </message>
-    <message>
-        <source>A6 (105 x 148 mm)</source>
-        <translation type="obsolete">A6 (105 x 148 mm)</translation>
-    </message>
-    <message>
-        <source>A7 (74 x 105 mm)</source>
-        <translation type="obsolete">A7 (74 x 105 mm)</translation>
-    </message>
-    <message>
-        <source>A8 (52 x 74 mm)</source>
-        <translation type="obsolete">A8 (52 x 74 mm)</translation>
-    </message>
-    <message>
-        <source>A9 (37 x 52 mm)</source>
-        <translation type="obsolete">A9 (37 x 52 mm)</translation>
-    </message>
-    <message>
-        <source>B0 (1000 x 1414 mm)</source>
-        <translation type="obsolete">B0 (1000 x 1414 mm)</translation>
-    </message>
-    <message>
-        <source>B1 (707 x 1000 mm)</source>
-        <translation type="obsolete">B1 (707 x 1000 mm)</translation>
-    </message>
-    <message>
-        <source>B2 (500 x 707 mm)</source>
-        <translation type="obsolete">B2 (500 x 707 mm)</translation>
-    </message>
-    <message>
-        <source>B3 (353 x 500 mm)</source>
-        <translation type="obsolete">B3 (353 x 500 mm)</translation>
-    </message>
-    <message>
-        <source>B4 (250 x 353 mm)</source>
-        <translation type="obsolete">B4 (250 x 353 mm)</translation>
-    </message>
-    <message>
-        <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
-        <translation type="obsolete">B5 (176 x 250 mm, 6.93 x 9.84 polegadas)</translation>
-    </message>
-    <message>
-        <source>B6 (125 x 176 mm)</source>
-        <translation type="obsolete">B6 (125 x 176 mm)</translation>
-    </message>
-    <message>
-        <source>B7 (88 x 125 mm)</source>
-        <translation type="obsolete">B7 (88 x 125 mm)</translation>
-    </message>
-    <message>
-        <source>B8 (62 x 88 mm)</source>
-        <translation type="obsolete">B8 (62 x 88 mm)</translation>
-    </message>
-    <message>
-        <source>B9 (44 x 62 mm)</source>
-        <translation type="obsolete">B9 (44 x 62 mm)</translation>
-    </message>
-    <message>
-        <source>B10 (31 x 44 mm)</source>
-        <translation type="obsolete">B10 (31 x 44 mm)</translation>
-    </message>
-    <message>
-        <source>C5E (163 x 229 mm)</source>
-        <translation type="obsolete">C5E (163 x 229 mm)</translation>
-    </message>
-    <message>
-        <source>DLE (110 x 220 mm)</source>
-        <translation type="obsolete">DLE (110 x 220 mm)</translation>
-    </message>
-    <message>
-        <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
-        <translation type="obsolete">Executivo (7.5 x 10 polegadas, 191 x 254 mm)</translation>
-    </message>
-    <message>
-        <source>Folio (210 x 330 mm)</source>
-        <translation type="obsolete">Folio (210 x 330 mm)</translation>
-    </message>
-    <message>
-        <source>Ledger (432 x 279 mm)</source>
-        <translation type="obsolete">Ledger (432 x 279 mm)</translation>
-    </message>
-    <message>
-        <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
-        <translation type="obsolete">Legal (8.5 x 14 polegadas, 216 x 356 mm)</translation>
-    </message>
-    <message>
-        <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
-        <translation type="obsolete">Carta (8.5 x 11 polegadas, 216 x 279 mm)</translation>
-    </message>
-    <message>
-        <source>Tabloid (279 x 432 mm)</source>
-        <translation type="obsolete">Tablóide (279 x 432 mm)</translation>
-    </message>
-    <message>
-        <source>US Common #10 Envelope (105 x 241 mm)</source>
-        <translation type="obsolete">Envelope #10 Comum EUA (105 x 241 mm)</translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation type="unfinished">OK</translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="obsolete">Cancelar</translation>
-    </message>
-    <message>
-        <source>Page size:</source>
-        <translation type="obsolete">Tamanho página:</translation>
-    </message>
-    <message>
-        <source>Orientation:</source>
-        <translation type="obsolete">Orientação:</translation>
-    </message>
-    <message>
-        <source>Paper source:</source>
-        <translation type="obsolete">Fonte papel:</translation>
-    </message>
-    <message>
-        <source>Print</source>
-        <translation type="unfinished">Imprimir</translation>
-    </message>
-    <message>
-        <source>File</source>
-        <translation type="obsolete">Ficheiro</translation>
-    </message>
-    <message>
-        <source>Printer</source>
-        <translation type="obsolete">Impressora</translation>
-    </message>
-    <message>
-        <source>Print To File ...</source>
-        <translation>Imprimir Para Arquivo ...</translation>
-    </message>
-    <message>
-        <source>Print dialog</source>
-        <translation type="obsolete">Diálogo de impressão</translation>
-    </message>
-    <message>
-        <source>Paper format</source>
-        <translation type="obsolete">Formato do papel</translation>
-    </message>
-    <message>
-        <source>Size:</source>
-        <translation type="obsolete">Tamanho:</translation>
-    </message>
-    <message>
-        <source>Properties</source>
-        <translation type="obsolete">Propriedades</translation>
-    </message>
-    <message>
-        <source>Printer info:</source>
-        <translation type="obsolete">Informação da impressora:</translation>
-    </message>
-    <message>
-        <source>Browse</source>
-        <translation type="obsolete">Navegar</translation>
-    </message>
-    <message>
-        <source>Print to file</source>
-        <translation type="obsolete">Imprimir para um ficheiro</translation>
-    </message>
-    <message>
-        <source>Print range</source>
-        <translation type="obsolete">Selecção de páginas</translation>
-    </message>
-    <message>
-        <source>Print all</source>
-        <translation type="obsolete">Imprimir todas</translation>
-    </message>
-    <message>
-        <source>Pages from</source>
-        <translation type="obsolete">Páginas de</translation>
-    </message>
-    <message>
-        <source>to</source>
-        <translation type="obsolete">a</translation>
-    </message>
-    <message>
-        <source>Selection</source>
-        <translation type="obsolete">Selecção</translation>
-    </message>
-    <message>
-        <source>Copies</source>
-        <translation type="obsolete">Cópias</translation>
-    </message>
-    <message>
-        <source>Number of copies:</source>
-        <translation type="obsolete">Número de cópias:</translation>
-    </message>
-    <message>
-        <source>Collate</source>
-        <translation type="obsolete">Juntar</translation>
-    </message>
-    <message>
-        <source>Print last page first</source>
-        <translation type="obsolete">Imprimir a última página primeiro</translation>
-    </message>
-    <message>
-        <source>Other</source>
-        <translation type="obsolete">Outro</translation>
-    </message>
-    <message>
-        <source>Print in color if available</source>
-        <translation type="obsolete">Imprimir a cores se disponível</translation>
-    </message>
-    <message>
-        <source>Double side printing</source>
-        <translation type="obsolete">Imprimir nos dois lados do papel</translation>
-    </message>
-    <message>
-        <source>File %1 is not writable.
-Please choose a different file name.</source>
-        <translation>O arquivo %1 não pode ser escrito.
-Por favor escolha um nome de arquivo diferente.</translation>
-    </message>
-    <message>
-        <source>%1 already exists.
-Do you want to overwrite it?</source>
-        <translation>%1 já existe.Você deseja substituí-lo?</translation>
-    </message>
-    <message>
-        <source>File exists</source>
-        <translation type="obsolete">O ficheiro existe</translation>
-    </message>
-    <message>
-        <source><qt>Do you want to overwrite it?</qt></source>
-        <translation type="obsolete"><qt>Deseja gravar por cima?</qt></translation>
-    </message>
-    <message>
-        <source>Print selection</source>
-        <translation type="obsolete">Selecção de Impressão</translation>
-    </message>
-    <message>
-        <source>%1 is a directory.
-Please choose a different file name.</source>
-        <translation>%1 é um diretório.
-Por favor escolha um nome de arquivo diferente.</translation>
-    </message>
-    <message>
-        <source>A0</source>
-        <translation type="vanished">A0</translation>
-    </message>
-    <message>
-        <source>A1</source>
-        <translation type="vanished">A1</translation>
-    </message>
-    <message>
-        <source>A2</source>
-        <translation type="vanished">A2</translation>
-    </message>
-    <message>
-        <source>A3</source>
-        <translation type="vanished">A3</translation>
-    </message>
-    <message>
-        <source>A4</source>
-        <translation type="vanished">A4</translation>
-    </message>
-    <message>
-        <source>A5</source>
-        <translation type="vanished">A5</translation>
-    </message>
-    <message>
-        <source>A6</source>
-        <translation type="vanished">A6</translation>
-    </message>
-    <message>
-        <source>A7</source>
-        <translation type="vanished">A7</translation>
-    </message>
-    <message>
-        <source>A8</source>
-        <translation type="vanished">A8</translation>
-    </message>
-    <message>
-        <source>A9</source>
-        <translation type="vanished">A9</translation>
-    </message>
-    <message>
-        <source>B0</source>
-        <translation type="vanished">B0</translation>
-    </message>
-    <message>
-        <source>B1</source>
-        <translation type="vanished">B1</translation>
-    </message>
-    <message>
-        <source>B2</source>
-        <translation type="vanished">B2</translation>
-    </message>
-    <message>
-        <source>B3</source>
-        <translation type="vanished">B3</translation>
-    </message>
-    <message>
-        <source>B4</source>
-        <translation type="vanished">B4</translation>
-    </message>
-    <message>
-        <source>B5</source>
-        <translation type="vanished">B5</translation>
-    </message>
-    <message>
-        <source>B6</source>
-        <translation type="vanished">B6</translation>
-    </message>
-    <message>
-        <source>B7</source>
-        <translation type="vanished">B7</translation>
-    </message>
-    <message>
-        <source>B8</source>
-        <translation type="vanished">B8</translation>
-    </message>
-    <message>
-        <source>B9</source>
-        <translation type="vanished">B9</translation>
-    </message>
-    <message>
-        <source>B10</source>
-        <translation type="vanished">B10</translation>
-    </message>
-    <message>
-        <source>C5E</source>
-        <translation type="vanished">C5E</translation>
-    </message>
-    <message>
-        <source>DLE</source>
-        <translation type="vanished">DLE</translation>
-    </message>
-    <message>
-        <source>Executive</source>
-        <translation type="vanished">Executivo</translation>
-    </message>
-    <message>
-        <source>Folio</source>
-        <translation type="vanished">Folio</translation>
-    </message>
-    <message>
-        <source>Ledger</source>
-        <translation type="vanished">Livro</translation>
-    </message>
-    <message>
-        <source>Legal</source>
-        <translation type="vanished">Legal</translation>
-    </message>
-    <message>
-        <source>Letter</source>
-        <translation type="vanished">Carta</translation>
-    </message>
-    <message>
-        <source>Tabloid</source>
-        <translation type="vanished">Tablóide</translation>
-    </message>
-    <message>
-        <source>US Common #10 Envelope</source>
-        <translation type="vanished">Envelope Comum US #10</translation>
-    </message>
-    <message>
-        <source>Custom</source>
-        <translation type="vanished">Customizado</translation>
-    </message>
-    <message>
-        <source>&Options >></source>
-        <translation>&Opções >></translation>
-    </message>
-    <message>
-        <source>&Print</source>
-        <translation>Im&primir</translation>
-    </message>
-    <message>
-        <source>&Options <<</source>
-        <translation>&Opções <<</translation>
-    </message>
-    <message>
-        <source>Print to File (PDF)</source>
-        <translation>Imprimir para Arquivo (PDF)</translation>
-    </message>
-    <message>
-        <source>Print to File (Postscript)</source>
-        <translation type="vanished">Imprimir para Arquivo (Postscript)</translation>
-    </message>
-    <message>
-        <source>Local file</source>
-        <translation>Arquivo local</translation>
-    </message>
-    <message>
-        <source>Write %1 file</source>
-        <translation type="vanished">Escrever para arquivo %1</translation>
-    </message>
-    <message>
-        <source>The 'From' value cannot be greater than the 'To' value.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left to Right, Top to Bottom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Left to Right, Bottom to Top</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right to Left, Bottom to Top</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Right to Left, Top to Bottom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Bottom to Top, Left to Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Bottom to Top, Right to Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Top to Bottom, Left to Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Top to Bottom, Right to Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>1 (1x1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>2 (2x1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>4 (2x2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>6 (2x3)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>9 (3x3)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>16 (4x4)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>All Pages</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Odd Pages</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Even Pages</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Write PDF file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Options 'Pages Per Sheet' and 'Page Set' cannot be used together.
-Please turn one of those options off.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Automatic</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintPreviewDialog</name>
-    <message>
-        <source>Page Setup</source>
-        <translation>Configurações de Página</translation>
-    </message>
-    <message>
-        <source>%1%</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Print Preview</source>
-        <translation>Visualização de Impressão</translation>
-    </message>
-    <message>
-        <source>Next page</source>
-        <translation>Próxima página</translation>
-    </message>
-    <message>
-        <source>Previous page</source>
-        <translation>Página anterior</translation>
-    </message>
-    <message>
-        <source>First page</source>
-        <translation>Primeira página</translation>
-    </message>
-    <message>
-        <source>Last page</source>
-        <translation>Última página</translation>
-    </message>
-    <message>
-        <source>Fit width</source>
-        <translation>Adaptar à largura</translation>
-    </message>
-    <message>
-        <source>Fit page</source>
-        <translation>Adaptar á página</translation>
-    </message>
-    <message>
-        <source>Zoom in</source>
-        <translation>Aumentar</translation>
-    </message>
-    <message>
-        <source>Zoom out</source>
-        <translation>Diminuir</translation>
-    </message>
-    <message>
-        <source>Portrait</source>
-        <translation>Retrato</translation>
-    </message>
-    <message>
-        <source>Landscape</source>
-        <translation>Paisagem</translation>
-    </message>
-    <message>
-        <source>Show single page</source>
-        <translation>Exibir uma página</translation>
-    </message>
-    <message>
-        <source>Show facing pages</source>
-        <translation>Exibir páginas opostas</translation>
-    </message>
-    <message>
-        <source>Show overview of all pages</source>
-        <translation>Exibir visão geral de todas as páginas</translation>
-    </message>
-    <message>
-        <source>Print</source>
-        <translation>Imprimir</translation>
-    </message>
-    <message>
-        <source>Page setup</source>
-        <translation>Configurações de Página</translation>
-    </message>
-    <message>
-        <source>Close</source>
-        <translation type="vanished">Fechar</translation>
-    </message>
-    <message>
-        <source>Export to PDF</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintPropertiesDialog</name>
-    <message>
-        <source>PPD Properties</source>
-        <translation type="obsolete">Propriedades PPD</translation>
-    </message>
-    <message>
-        <source>Save</source>
-        <translation type="obsolete">Gravar</translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation type="obsolete">OK</translation>
-    </message>
-    <message>
-        <source>Printer Properties</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Job Options</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintPropertiesWidget</name>
-    <message>
-        <source>Form</source>
-        <translation>Formulário</translation>
-    </message>
-    <message>
-        <source>Page</source>
-        <translation>Página</translation>
-    </message>
-    <message>
-        <source>Advanced</source>
-        <translation type="vanished">Avançado</translation>
-    </message>
-</context>
-<context>
-    <name>QPrintSettingsOutput</name>
-    <message>
-        <source>Form</source>
-        <translation>Formulário</translation>
-    </message>
-    <message>
-        <source>Copies</source>
-        <translation>Cópias</translation>
-    </message>
-    <message>
-        <source>Print range</source>
-        <translation>Imprimir faixa</translation>
-    </message>
-    <message>
-        <source>Print all</source>
-        <translation>Imprimir tudo</translation>
-    </message>
-    <message>
-        <source>Pages from</source>
-        <translation>Da página</translation>
-    </message>
-    <message>
-        <source>to</source>
-        <translation>até</translation>
-    </message>
-    <message>
-        <source>Selection</source>
-        <translation>Seleção</translation>
-    </message>
-    <message>
-        <source>Output Settings</source>
-        <translation>Configurações de Saída</translation>
-    </message>
-    <message>
-        <source>Copies:</source>
-        <translation>Cópias:</translation>
-    </message>
-    <message>
-        <source>Collate</source>
-        <translation>Agrupar</translation>
-    </message>
-    <message>
-        <source>Reverse</source>
-        <translation>Inverter</translation>
-    </message>
-    <message>
-        <source>Options</source>
-        <translation>Opções</translation>
-    </message>
-    <message>
-        <source>Color Mode</source>
-        <translation>Modo de Cor</translation>
-    </message>
-    <message>
-        <source>Color</source>
-        <translation>Cor</translation>
-    </message>
-    <message>
-        <source>Grayscale</source>
-        <translation>Preto e Branco</translation>
-    </message>
-    <message>
-        <source>Duplex Printing</source>
-        <translation>Impressão Duplex</translation>
-    </message>
-    <message>
-        <source>None</source>
-        <translation>Nenhum</translation>
-    </message>
-    <message>
-        <source>Long side</source>
-        <translation>Lado comprido</translation>
-    </message>
-    <message>
-        <source>Short side</source>
-        <translation>Lado curto</translation>
-    </message>
-    <message>
-        <source>Current Page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Page Set:</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintWidget</name>
-    <message>
-        <source>Form</source>
-        <translation>Formulário</translation>
-    </message>
-    <message>
-        <source>Printer</source>
-        <translation>Impressora</translation>
-    </message>
-    <message>
-        <source>&Name:</source>
-        <translation>&Nome:</translation>
-    </message>
-    <message>
-        <source>P&roperties</source>
-        <translation>P&ropriedades</translation>
-    </message>
-    <message>
-        <source>Location:</source>
-        <translation>Localização:</translation>
-    </message>
-    <message>
-        <source>Preview</source>
-        <translation>Visualização</translation>
-    </message>
-    <message>
-        <source>Type:</source>
-        <translation>Tipo:</translation>
-    </message>
-    <message>
-        <source>Output &file:</source>
-        <translation>Arquivo de saída (&F):</translation>
-    </message>
-    <message>
-        <source>...</source>
-        <translation>...</translation>
-    </message>
-</context>
-<context>
-    <name>QProcess</name>
-    <message>
-        <source>Could not open input redirection for reading</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Could not open output redirection for writing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Resource error (fork failure): %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Process operation timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Error reading from process</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Error writing to process</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Process crashed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>No program defined</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Process failed to start</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Process failed to start: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QProgressDialog</name>
-    <message>
-        <source>Cancel</source>
-        <translation>Cancelar</translation>
-    </message>
-</context>
-<context>
-    <name>QPushButton</name>
-    <message>
-        <source>Open</source>
-        <translation type="vanished">Abrir</translation>
-    </message>
-</context>
-<context>
-    <name>QQnxFileDialogHelper</name>
-    <message>
-        <source>All files (*.*)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QQnxFilePicker</name>
-    <message>
-        <source>Pick a file</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QRadioButton</name>
-    <message>
-        <source>Check</source>
-        <translation type="vanished">Marcar</translation>
-    </message>
-</context>
-<context>
-    <name>QRegExp</name>
-    <message>
-        <source>no error occurred</source>
-        <translation>nenhum erro ocorreu</translation>
-    </message>
-    <message>
-        <source>disabled feature used</source>
-        <translation>recurso desabilitado foi usado</translation>
-    </message>
-    <message>
-        <source>bad char class syntax</source>
-        <translation>sintaxe de classe de caracteres incorreta</translation>
-    </message>
-    <message>
-        <source>bad lookahead syntax</source>
-        <translation>sintaxe de lookahead incorreta</translation>
-    </message>
-    <message>
-        <source>bad repetition syntax</source>
-        <translation>sintaxe de repetição incorreta</translation>
-    </message>
-    <message>
-        <source>invalid octal value</source>
-        <translation>valor octal inválido</translation>
-    </message>
-    <message>
-        <source>missing left delim</source>
-        <translation>delimitador esquerdo faltando</translation>
-    </message>
-    <message>
-        <source>unexpected end</source>
-        <translation>fim inesperado</translation>
-    </message>
-    <message>
-        <source>met internal limit</source>
-        <translation>atingiu limite interno</translation>
-    </message>
-    <message>
-        <source>lookbehinds not supported, see QTBUG-2371</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid interval</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid category</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QRegularExpression</name>
-    <message>
-        <source>no error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>\ at end of pattern</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>\c at end of pattern</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unrecognized character follows \</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>numbers out of order in {} quantifier</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>number too big in {} quantifier</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>missing terminating ] for character class</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid escape sequence in character class</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>range out of order in character class</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>nothing to repeat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>internal error: unexpected repeat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unrecognized character after (? or (?-</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>POSIX named classes are supported only within a class</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>missing )</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>reference to non-existent subpattern</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>erroffset passed as NULL</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unknown option bit(s) set</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>missing ) after comment</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>regular expression is too large</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>failed to get memory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unmatched parentheses</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>internal error: code overflow</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unrecognized character after (?<</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>lookbehind assertion is not fixed length</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>malformed number or name after (?(</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>conditional group contains more than two branches</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>assertion expected after (?(</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>(?R or (?[+-]digits must be followed by )</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unknown POSIX class name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>POSIX collating elements are not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>this version of PCRE is not compiled with PCRE_UTF8 support</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>character value in \x{...} sequence is too large</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid condition (?(0)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>\C not allowed in lookbehind assertion</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>PCRE does not support \L, \l, \N{name}, \U, or \u</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>number after (?C is > 255</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>closing ) for (?C expected</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>recursive call could loop indefinitely</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unrecognized character after (?P</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>syntax error in subpattern name (missing terminator)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>two named subpatterns have the same name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid UTF-8 string</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>support for \P, \p, and \X has not been compiled</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>malformed \P or \p sequence</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>unknown property name after \P or \p</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>subpattern name is too long (maximum 32 characters)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>too many named subpatterns (maximum 10000)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>octal value is greater than \377 (not in UTF-8 mode)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>internal error: overran compiling workspace</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>internal error: previously-checked referenced subpattern not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>DEFINE group contains more than one branch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>repeating a DEFINE group is not allowed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>inconsistent NEWLINE options</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>a numbered reference must not be zero</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>(*VERB) not recognized</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>number is too big</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>subpattern name expected</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>digit expected after (?+</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>] is an invalid data character in JavaScript compatibility mode</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>different names for subpatterns of the same number are not allowed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>(*MARK) must have an argument</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>this version of PCRE is not compiled with PCRE_UCP support</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>\c must be followed by an ASCII character</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>\k is not followed by a braced, angle-bracketed, or quoted name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>internal error: unknown opcode in find_fixedlength()</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>\N is not supported in a class</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>too many forward references</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>disallowed Unicode code point (>= 0xd800 && <= 0xdfff)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid UTF-16 string</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>character value in \u.... sequence is too large</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid UTF-32 string</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>setting UTF is disabled by the application</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>non-hex character in \x{} (closing brace missing?)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>non-octal character in \o{} (closing brace missing?)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>missing opening brace after \o</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>parentheses are too deeply nested</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>invalid range in character class</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>group name must start with a non-digit</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>parentheses are too deeply nested (stack check)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>digits missing in \x{} or \o{}</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSQLite2Driver</name>
-    <message>
-        <source>Error to open database</source>
-        <translation type="vanished">Erro ao abrir banco de dados</translation>
-    </message>
-    <message>
-        <source>Unable to begin transaction</source>
-        <translation>Não foi possível iniciar transação</translation>
-    </message>
-    <message>
-        <source>Unable to commit transaction</source>
-        <translation>Não foi possível efetuar commit da transação</translation>
-    </message>
-    <message>
-        <source>Unable to rollback Transaction</source>
-        <translation type="vanished">Não foi possível fazer rollback da transação</translation>
-    </message>
-    <message>
-        <source>Error opening database</source>
-        <translation type="unfinished">Erro ao abrir banco de dados</translation>
-    </message>
-    <message>
-        <source>Unable to rollback transaction</source>
-        <translation type="unfinished">Não foi possível fazer rollback da transação</translation>
-    </message>
-</context>
-<context>
-    <name>QSQLite2Result</name>
-    <message>
-        <source>Unable to fetch results</source>
-        <translation>Não foi possível buscar resultados</translation>
-    </message>
-    <message>
-        <source>Unable to execute statement</source>
-        <translation>Não foi possível executar declaração</translation>
-    </message>
-</context>
-<context>
-    <name>QSQLiteDriver</name>
-    <message>
-        <source>Error opening database</source>
-        <translation>Erro ao abrir banco de dados</translation>
-    </message>
-    <message>
-        <source>Error closing database</source>
-        <translation>Erro ao fechar banco de dados</translation>
-    </message>
-    <message>
-        <source>Unable to begin transaction</source>
-        <translation>Não foi possível iniciar transação</translation>
-    </message>
-    <message>
-        <source>Unable to commit transaction</source>
-        <translation>Não foi possível efetuar commit da transação</translation>
-    </message>
-    <message>
-        <source>Unable to roll back transaction</source>
-        <translation type="obsolete">Não foi possível anular a transacção</translation>
-    </message>
-    <message>
-        <source>Unable to rollback transaction</source>
-        <translation>Não foi possível fazer rollback da transação</translation>
-    </message>
-</context>
-<context>
-    <name>QSQLiteResult</name>
-    <message>
-        <source>Unable to fetch row</source>
-        <translation>Não foi possível buscar linha</translation>
-    </message>
-    <message>
-        <source>Unable to execute statement</source>
-        <translation>Não foi possível executar declaração</translation>
-    </message>
-    <message>
-        <source>Unable to reset statement</source>
-        <translation>Não foi possível redefinir declaração</translation>
-    </message>
-    <message>
-        <source>Unable to bind parameters</source>
-        <translation>Não foi possível vincular parâmetros</translation>
-    </message>
-    <message>
-        <source>Parameter count mismatch</source>
-        <translation>Quantidade de parâmetros não coincide</translation>
-    </message>
-    <message>
-        <source>No query</source>
-        <translation>Sem pesquisa</translation>
-    </message>
-    <message>
-        <source>Unable to execute multiple statements at a time</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSaveFile</name>
-    <message>
-        <source>Existing file %1 is not writable</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Filename refers to a directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Writing canceled by application</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QScrollBar</name>
-    <message>
-        <source>Scroll here</source>
-        <translation>Role aqui</translation>
-    </message>
-    <message>
-        <source>Left edge</source>
-        <translation>Canto esquerdo</translation>
-    </message>
-    <message>
-        <source>Top</source>
-        <translation>Topo</translation>
-    </message>
-    <message>
-        <source>Right edge</source>
-        <translation>Canto Direito</translation>
-    </message>
-    <message>
-        <source>Bottom</source>
-        <translation>Fundo</translation>
-    </message>
-    <message>
-        <source>Page left</source>
-        <translation>Página para esquerda</translation>
-    </message>
-    <message>
-        <source>Page up</source>
-        <translation>Página para cima</translation>
-    </message>
-    <message>
-        <source>Page right</source>
-        <translation>Página para direita</translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation>Página para baixo</translation>
-    </message>
-    <message>
-        <source>Scroll left</source>
-        <translation>Rolar para esquerda</translation>
-    </message>
-    <message>
-        <source>Scroll up</source>
-        <translation>Rolar para cima</translation>
-    </message>
-    <message>
-        <source>Scroll right</source>
-        <translation>Rolar para direita</translation>
-    </message>
-    <message>
-        <source>Scroll down</source>
-        <translation>Rolar para baixo</translation>
-    </message>
-    <message>
-        <source>Line up</source>
-        <translation type="vanished">Linha para cima</translation>
-    </message>
-    <message>
-        <source>Position</source>
-        <translation type="vanished">Posição</translation>
-    </message>
-    <message>
-        <source>Line down</source>
-        <translation type="vanished">Linha para baixo</translation>
-    </message>
-</context>
-<context>
-    <name>QSharedMemory</name>
-    <message>
-        <source>%1: unable to set key on lock</source>
-        <translation>%1: não foi possível definir a a chave do lock</translation>
-    </message>
-    <message>
-        <source>%1: create size is less then 0</source>
-        <translation>%1: tamanho de criação é menor que 0</translation>
-    </message>
-    <message>
-        <source>%1: unable to lock</source>
-        <translation>%1: não foi possível efetuar lock</translation>
-    </message>
-    <message>
-        <source>%1: unable to unlock</source>
-        <translation>%1: não foi possível efetuar unlock</translation>
-    </message>
-    <message>
-        <source>%1: permission denied</source>
-        <translation>%1: permissão negada</translation>
-    </message>
-    <message>
-        <source>%1: already exists</source>
-        <translation>%1: já existe</translation>
-    </message>
-    <message>
-        <source>%1: doesn't exists</source>
-        <translation type="vanished">%1: não existe</translation>
-    </message>
-    <message>
-        <source>%1: out of resources</source>
-        <translation>%1: sem recursos</translation>
-    </message>
-    <message>
-        <source>%1: unknown error %2</source>
-        <translation>%1: erro desconhecido %2</translation>
-    </message>
-    <message>
-        <source>%1: key is empty</source>
-        <translation>%1: chave vazia</translation>
-    </message>
-    <message>
-        <source>%1: unix key file doesn't exists</source>
-        <translation type="vanished">%1: arquivo de chave unix não existe</translation>
-    </message>
-    <message>
-        <source>%1: ftok failed</source>
-        <translation>%1: ftok falhou</translation>
-    </message>
-    <message>
-        <source>%1: unable to make key</source>
-        <translation>%1: não foi possível criar chave</translation>
-    </message>
-    <message>
-        <source>%1: system-imposed size restrictions</source>
-        <translation>%1: restrições impostas pelo sistema</translation>
-    </message>
-    <message>
-        <source>%1: not attached</source>
-        <translation>%1: não associada</translation>
-    </message>
-    <message>
-        <source>%1: invalid size</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1: key error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1: size query failed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1: bad name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1: UNIX key file doesn't exist</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>%1: doesn't exist</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QShortcut</name>
-    <message>
-        <source>Space</source>
-        <extracomment>This and all following "incomprehensible" strings in QShortcut context are key names. Please use the localized names appearing on actual keyboards or whatever is commonly used.</extracomment>
-        <translation>Barra de Espaços</translation>
-    </message>
-    <message>
-        <source>Esc</source>
-        <translation>Esc</translation>
-    </message>
-    <message>
-        <source>Tab</source>
-        <translation>Tab</translation>
-    </message>
-    <message>
-        <source>Backtab</source>
-        <translation>Backtab</translation>
-    </message>
-    <message>
-        <source>Backspace</source>
-        <translation>Backspace</translation>
-    </message>
-    <message>
-        <source>Return</source>
-        <translation>Return</translation>
-    </message>
-    <message>
-        <source>Enter</source>
-        <translation>Enter</translation>
-    </message>
-    <message>
-        <source>Ins</source>
-        <translation>Ins</translation>
-    </message>
-    <message>
-        <source>Del</source>
-        <translation>Del</translation>
-    </message>
-    <message>
-        <source>Pause</source>
-        <translation>Pause</translation>
-    </message>
-    <message>
-        <source>Print</source>
-        <translation>Print</translation>
-    </message>
-    <message>
-        <source>SysReq</source>
-        <translation>SysReq</translation>
-    </message>
-    <message>
-        <source>Home</source>
-        <translation>Home</translation>
-    </message>
-    <message>
-        <source>End</source>
-        <translation>End</translation>
-    </message>
-    <message>
-        <source>Left</source>
-        <translation>Seta Para Esquerda</translation>
-    </message>
-    <message>
-        <source>Up</source>
-        <translation>Seta Para Cima</translation>
-    </message>
-    <message>
-        <source>Right</source>
-        <translation>Seta Para Direita</translation>
-    </message>
-    <message>
-        <source>Down</source>
-        <translation>Seta Para Baixo</translation>
-    </message>
-    <message>
-        <source>PgUp</source>
-        <translation>PgUp</translation>
-    </message>
-    <message>
-        <source>PgDown</source>
-        <translation>PgDown</translation>
-    </message>
-    <message>
-        <source>CapsLock</source>
-        <translation>CapsLock</translation>
-    </message>
-    <message>
-        <source>NumLock</source>
-        <translation>NumLock</translation>
-    </message>
-    <message>
-        <source>ScrollLock</source>
-        <translation>ScrollLock</translation>
-    </message>
-    <message>
-        <source>Menu</source>
-        <translation>Menu</translation>
-    </message>
-    <message>
-        <source>Help</source>
-        <translation>Ajuda</translation>
-    </message>
-    <message>
-        <source>Back</source>
-        <translation>Voltar</translation>
-    </message>
-    <message>
-        <source>Forward</source>
-        <translation>Avançar</translation>
-    </message>
-    <message>
-        <source>Stop</source>
-        <translation>Parar</translation>
-    </message>
-    <message>
-        <source>Refresh</source>
-        <translation>Atualizar</translation>
-    </message>
-    <message>
-        <source>Volume Down</source>
-        <translation>Abaixar Volume</translation>
-    </message>
-    <message>
-        <source>Volume Mute</source>
-        <translation>Silenciar Volume</translation>
-    </message>
-    <message>
-        <source>Volume Up</source>
-        <translation>Aumentar Volume</translation>
-    </message>
-    <message>
-        <source>Bass Boost</source>
-        <translation>Controle de Graves</translation>
-    </message>
-    <message>
-        <source>Bass Up</source>
-        <translation>Aumentar Graves</translation>
-    </message>
-    <message>
-        <source>Bass Down</source>
-        <translation>Diminuir Graves</translation>
-    </message>
-    <message>
-        <source>Treble Up</source>
-        <translation>Aumentar Agudos</translation>
-    </message>
-    <message>
-        <source>Treble Down</source>
-        <translation>Diminuir Agudos</translation>
-    </message>
-    <message>
-        <source>Media Play</source>
-        <translation>Tocar Mídia</translation>
-    </message>
-    <message>
-        <source>Media Stop</source>
-        <translation>Parar Mídia</translation>
-    </message>
-    <message>
-        <source>Media Previous</source>
-        <translation>Mídia Anterior</translation>
-    </message>
-    <message>
-        <source>Media Next</source>
-        <translation>Próxima Mídia</translation>
-    </message>
-    <message>
-        <source>Media Record</source>
-        <translation>Gravar Mídia</translation>
-    </message>
-    <message>
-        <source>Favorites</source>
-        <translation>Favoritos</translation>
-    </message>
-    <message>
-        <source>Search</source>
-        <translation>Pesquisar</translation>
-    </message>
-    <message>
-        <source>Standby</source>
-        <translation>Modo de Espera</translation>
-    </message>
-    <message>
-        <source>Open URL</source>
-        <translation>Abrir URL</translation>
-    </message>
-    <message>
-        <source>Launch Mail</source>
-        <translation>Iniciar Correio</translation>
-    </message>
-    <message>
-        <source>Launch Media</source>
-        <translation>Iniciar Mídia</translation>
-    </message>
-    <message>
-        <source>Launch (0)</source>
-        <translation>Iniciar (0)</translation>
-    </message>
-    <message>
-        <source>Launch (1)</source>
-        <translation>Iniciar (1)</translation>
-    </message>
-    <message>
-        <source>Launch (2)</source>
-        <translation>Iniciar (2)</translation>
-    </message>
-    <message>
-        <source>Launch (3)</source>
-        <translation>Iniciar (3)</translation>
-    </message>
-    <message>
-        <source>Launch (4)</source>
-        <translation>Iniciar (4)</translation>
-    </message>
-    <message>
-        <source>Launch (5)</source>
-        <translation>Iniciar (5)</translation>
-    </message>
-    <message>
-        <source>Launch (6)</source>
-        <translation>Iniciar (6)</translation>
-    </message>
-    <message>
-        <source>Launch (7)</source>
-        <translation>Iniciar (7)</translation>
-    </message>
-    <message>
-        <source>Launch (8)</source>
-        <translation>Iniciar (8)</translation>
-    </message>
-    <message>
-        <source>Launch (9)</source>
-        <translation>Iniciar (9)</translation>
-    </message>
-    <message>
-        <source>Launch (A)</source>
-        <translation>Iniciar (A)</translation>
-    </message>
-    <message>
-        <source>Launch (B)</source>
-        <translation>Iniciar (B)</translation>
-    </message>
-    <message>
-        <source>Launch (C)</source>
-        <translation>Iniciar (C)</translation>
-    </message>
-    <message>
-        <source>Launch (D)</source>
-        <translation>Iniciar (D)</translation>
-    </message>
-    <message>
-        <source>Launch (E)</source>
-        <translation>Iniciar (E)</translation>
-    </message>
-    <message>
-        <source>Launch (F)</source>
-        <translation>Iniciar (F)</translation>
-    </message>
-    <message>
-        <source>Print Screen</source>
-        <translation>Print Screen</translation>
-    </message>
-    <message>
-        <source>Page Up</source>
-        <translation>Page Up</translation>
-    </message>
-    <message>
-        <source>Page Down</source>
-        <translation>Page Down</translation>
-    </message>
-    <message>
-        <source>Caps Lock</source>
-        <translation>Caps Lock</translation>
-    </message>
-    <message>
-        <source>Num Lock</source>
-        <translation>Num Lock</translation>
-    </message>
-    <message>
-        <source>Number Lock</source>
-        <translation>Number Lock</translation>
-    </message>
-    <message>
-        <source>Scroll Lock</source>
-        <translation>Scroll Lock</translation>
-    </message>
-    <message>
-        <source>Insert</source>
-        <translation>Insert</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>Delete</translation>
-    </message>
-    <message>
-        <source>Escape</source>
-        <translation>Escape</translation>
-    </message>
-    <message>
-        <source>System Request</source>
-        <translation>System Request</translation>
-    </message>
-    <message>
-        <source>Select</source>
-        <translation>Selecionar</translation>
-    </message>
-    <message>
-        <source>Yes</source>
-        <translation>Sim</translation>
-    </message>
-    <message>
-        <source>No</source>
-        <translation>Não</translation>
-    </message>
-    <message>
-        <source>Context1</source>
-        <translation>Contexto1</translation>
-    </message>
-    <message>
-        <source>Context2</source>
-        <translation>Contexto2</translation>
-    </message>
-    <message>
-        <source>Context3</source>
-        <translation>Contexto3</translation>
-    </message>
-    <message>
-        <source>Context4</source>
-        <translation>Contexto4</translation>
-    </message>
-    <message>
-        <source>Call</source>
-        <extracomment>Button to start a call (note: a separate button is used to end the call)</extracomment>
-        <translation>Chamar</translation>
-    </message>
-    <message>
-        <source>Hangup</source>
-        <extracomment>Button to end a call (note: a separate button is used to start the call)</extracomment>
-        <translation>Desligar</translation>
-    </message>
-    <message>
-        <source>Flip</source>
-        <translation>Virar</translation>
-    </message>
-    <message>
-        <source>Ctrl</source>
-        <translation>Ctrl</translation>
-    </message>
-    <message>
-        <source>Shift</source>
-        <translation>Shift</translation>
-    </message>
-    <message>
-        <source>Alt</source>
-        <translation>Alt</translation>
-    </message>
-    <message>
-        <source>Meta</source>
-        <translation>Meta</translation>
-    </message>
-    <message>
-        <source>+</source>
-        <translation>+</translation>
-    </message>
-    <message>
-        <source>F%1</source>
-        <translation>F%1</translation>
-    </message>
-    <message>
-        <source>Home Page</source>
-        <translation>Página Inicial</translation>
-    </message>
-    <message>
-        <source>Media Pause</source>
-        <extracomment>Media player pause button</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Toggle Media Play/Pause</source>
-        <extracomment>Media player button to toggle between playing and paused</extracomment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Monitor Brightness Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Monitor Brightness Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Keyboard Light On/Off</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Keyboard Brightness Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Keyboard Brightness Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Power Off</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Wake Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Eject</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Screensaver</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>WWW</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Sleep</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>LightBulb</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Shop</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>History</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Add Favorite</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hot Links</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Adjust Brightness</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Finance</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Community</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Media Rewind</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Back Forward</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Application Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Application Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Book</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>CD</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Calculator</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Clear</source>
-        <translation type="unfinished">Limpar</translation>
-    </message>
-    <message>
-        <source>Clear Grab</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Close</source>
-        <translation type="unfinished">Fechar</translation>
-    </message>
-    <message>
-        <source>Copy</source>
-        <translation type="unfinished">Copiar</translation>
-    </message>
-    <message>
-        <source>Cut</source>
-        <translation type="unfinished">Cortar</translation>
-    </message>
-    <message>
-        <source>Display</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>DOS</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Documents</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Spreadsheet</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Browser</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Game</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Go</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>iTouch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Logoff</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Market</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Meeting</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Keyboard Menu</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Menu PB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>My Sites</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>News</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Home Office</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Option</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Paste</source>
-        <translation type="unfinished">Colar</translation>
-    </message>
-    <message>
-        <source>Phone</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reply</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Reload</source>
-        <translation type="unfinished">Atualizar</translation>
-    </message>
-    <message>
-        <source>Rotate Windows</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Rotation PB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Rotation KB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Save</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Send</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Spellchecker</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Split Screen</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Support</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Task Panel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Terminal</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Tools</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Travel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Video</source>
-        <translation type="unfinished">Vídeo</translation>
-    </message>
-    <message>
-        <source>Word Processor</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>XFer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Zoom In</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Zoom Out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Away</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Messenger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>WebCam</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mail Forward</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Pictures</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Music</source>
-        <translation type="unfinished">Música</translation>
-    </message>
-    <message>
-        <source>Battery</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Bluetooth</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Wireless</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Ultra Wide Band</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Media Fast Forward</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Audio Repeat</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Audio Random Play</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Subtitle</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Audio Cycle Track</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Time</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Hibernate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>View</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Top Menu</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Power Down</source>
-        <translation type="unfinished"></translation>
+        <source>Print Preview</source>
+        <translation>Visualização de Impressão</translation>
     </message>
     <message>
-        <source>Suspend</source>
-        <translation type="unfinished"></translation>
+        <source>Next page</source>
+        <translation>Próxima página</translation>
     </message>
     <message>
-        <source>Microphone Mute</source>
-        <translation type="unfinished"></translation>
+        <source>Previous page</source>
+        <translation>Página anterior</translation>
     </message>
     <message>
-        <source>Red</source>
-        <translation type="unfinished"></translation>
+        <source>First page</source>
+        <translation>Primeira página</translation>
     </message>
     <message>
-        <source>Green</source>
-        <translation type="unfinished"></translation>
+        <source>Last page</source>
+        <translation>Última página</translation>
     </message>
     <message>
-        <source>Yellow</source>
-        <translation type="unfinished"></translation>
+        <source>Fit width</source>
+        <translation>Adaptar à largura</translation>
     </message>
     <message>
-        <source>Blue</source>
-        <translation type="unfinished"></translation>
+        <source>Fit page</source>
+        <translation>Adaptar á página</translation>
     </message>
     <message>
-        <source>Channel Up</source>
-        <translation type="unfinished"></translation>
+        <source>Zoom in</source>
+        <translation>Aumentar</translation>
     </message>
     <message>
-        <source>Channel Down</source>
-        <translation type="unfinished"></translation>
+        <source>Zoom out</source>
+        <translation>Diminuir</translation>
     </message>
     <message>
-        <source>Guide</source>
-        <translation type="unfinished"></translation>
+        <source>Portrait</source>
+        <translation>Retrato</translation>
     </message>
     <message>
-        <source>Info</source>
-        <translation type="unfinished"></translation>
+        <source>Landscape</source>
+        <translation>Paisagem</translation>
     </message>
     <message>
-        <source>Settings</source>
-        <translation type="unfinished"></translation>
+        <source>Show single page</source>
+        <translation>Exibir uma página</translation>
     </message>
     <message>
-        <source>Microphone Volume Up</source>
-        <translation type="unfinished"></translation>
+        <source>Show facing pages</source>
+        <translation>Exibir páginas opostas</translation>
     </message>
     <message>
-        <source>Microphone Volume Down</source>
-        <translation type="unfinished"></translation>
+        <source>Show overview of all pages</source>
+        <translation>Exibir visão geral de todas as páginas</translation>
     </message>
     <message>
-        <source>New</source>
-        <translation type="unfinished"></translation>
+        <source>Print</source>
+        <translation>Imprimir</translation>
     </message>
     <message>
-        <source>Open</source>
-        <translation type="unfinished">Abrir</translation>
+        <source>Page setup</source>
+        <translation>Configurações de Página</translation>
     </message>
     <message>
-        <source>Find</source>
-        <translation type="unfinished"></translation>
+        <source>Close</source>
+        <translation>Fechar</translation>
     </message>
+</context>
+<context>
+    <name>QPrintPropertiesWidget</name>
     <message>
-        <source>Undo</source>
-        <translation type="unfinished">Desfazer</translation>
+        <source>Form</source>
+        <translation>Formulário</translation>
     </message>
     <message>
-        <source>Redo</source>
-        <translation type="unfinished">Refazer</translation>
+        <source>Page</source>
+        <translation>Página</translation>
     </message>
     <message>
-        <source>Toggle Call/Hangup</source>
-        <extracomment>Button that will hang up if we're in call, or make a call if we're not.</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Advanced</source>
+        <translation>Avançado</translation>
     </message>
+</context>
+<context>
+    <name>QPrintSettingsOutput</name>
     <message>
-        <source>Voice Dial</source>
-        <extracomment>Button to trigger voice dialing</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Form</source>
+        <translation>Formulário</translation>
     </message>
     <message>
-        <source>Last Number Redial</source>
-        <extracomment>Button to redial the last number called</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Copies</source>
+        <translation>Cópias</translation>
     </message>
     <message>
-        <source>Camera Shutter</source>
-        <extracomment>Button to trigger the camera shutter (take a picture)</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Print range</source>
+        <translation>Imprimir faixa</translation>
     </message>
     <message>
-        <source>Camera Focus</source>
-        <extracomment>Button to focus the camera</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Print all</source>
+        <translation>Imprimir tudo</translation>
     </message>
     <message>
-        <source>Kanji</source>
-        <translation type="unfinished"></translation>
+        <source>Pages from</source>
+        <translation>Da página</translation>
     </message>
     <message>
-        <source>Muhenkan</source>
-        <translation type="unfinished"></translation>
+        <source>to</source>
+        <translation>até</translation>
     </message>
     <message>
-        <source>Henkan</source>
-        <translation type="unfinished"></translation>
+        <source>Selection</source>
+        <translation>Seleção</translation>
     </message>
     <message>
-        <source>Romaji</source>
-        <translation type="unfinished"></translation>
+        <source>Output Settings</source>
+        <translation>Configurações de Saída</translation>
     </message>
     <message>
-        <source>Hiragana</source>
-        <translation type="unfinished"></translation>
+        <source>Copies:</source>
+        <translation>Cópias:</translation>
     </message>
     <message>
-        <source>Katakana</source>
-        <translation type="unfinished"></translation>
+        <source>Collate</source>
+        <translation>Agrupar</translation>
     </message>
     <message>
-        <source>Hiragana Katakana</source>
-        <translation type="unfinished"></translation>
+        <source>Reverse</source>
+        <translation>Inverter</translation>
     </message>
     <message>
-        <source>Zenkaku</source>
-        <translation type="unfinished"></translation>
+        <source>Options</source>
+        <translation>Opções</translation>
     </message>
     <message>
-        <source>Hankaku</source>
-        <translation type="unfinished"></translation>
+        <source>Color Mode</source>
+        <translation>Modo de Cor</translation>
     </message>
     <message>
-        <source>Zenkaku Hankaku</source>
-        <translation type="unfinished"></translation>
+        <source>Color</source>
+        <translation>Cor</translation>
     </message>
     <message>
-        <source>Touroku</source>
-        <translation type="unfinished"></translation>
+        <source>Grayscale</source>
+        <translation>Preto e Branco</translation>
     </message>
     <message>
-        <source>Massyo</source>
-        <translation type="unfinished"></translation>
+        <source>Duplex Printing</source>
+        <translation>Impressão Duplex</translation>
     </message>
     <message>
-        <source>Kana Lock</source>
-        <translation type="unfinished"></translation>
+        <source>None</source>
+        <translation>Nenhum</translation>
     </message>
     <message>
-        <source>Kana Shift</source>
-        <translation type="unfinished"></translation>
+        <source>Long side</source>
+        <translation>Lado comprido</translation>
     </message>
     <message>
-        <source>Eisu Shift</source>
-        <translation type="unfinished"></translation>
+        <source>Short side</source>
+        <translation>Lado curto</translation>
     </message>
+</context>
+<context>
+    <name>QPrintWidget</name>
     <message>
-        <source>Eisu toggle</source>
-        <translation type="unfinished"></translation>
+        <source>Form</source>
+        <translation>Formulário</translation>
     </message>
     <message>
-        <source>Code input</source>
-        <translation type="unfinished"></translation>
+        <source>Printer</source>
+        <translation>Impressora</translation>
     </message>
     <message>
-        <source>Multiple Candidate</source>
-        <translation type="unfinished"></translation>
+        <source>&Name:</source>
+        <translation>&Nome:</translation>
     </message>
     <message>
-        <source>Previous Candidate</source>
-        <translation type="unfinished"></translation>
+        <source>P&roperties</source>
+        <translation>P&ropriedades</translation>
     </message>
     <message>
-        <source>Hangul</source>
-        <translation type="unfinished"></translation>
+        <source>Location:</source>
+        <translation>Localização:</translation>
     </message>
     <message>
-        <source>Hangul Start</source>
-        <translation type="unfinished"></translation>
+        <source>Preview</source>
+        <translation>Visualização</translation>
     </message>
     <message>
-        <source>Hangul End</source>
-        <translation type="unfinished"></translation>
+        <source>Type:</source>
+        <translation>Tipo:</translation>
     </message>
     <message>
-        <source>Hangul Hanja</source>
-        <translation type="unfinished"></translation>
+        <source>Output &file:</source>
+        <translation>Arquivo de saída (&F):</translation>
     </message>
     <message>
-        <source>Hangul Jamo</source>
-        <translation type="unfinished"></translation>
+        <source>...</source>
+        <translation>...</translation>
     </message>
+</context>
+<context>
+    <name>QProgressDialog</name>
     <message>
-        <source>Hangul Romaja</source>
-        <translation type="unfinished"></translation>
+        <source>Cancel</source>
+        <translation>Cancelar</translation>
     </message>
+</context>
+<context>
+    <name>QPushButton</name>
     <message>
-        <source>Hangul Jeonja</source>
-        <translation type="unfinished"></translation>
+        <source>Open</source>
+        <translation>Abrir</translation>
     </message>
+</context>
+<context>
+    <name>QRadioButton</name>
     <message>
-        <source>Hangul Banja</source>
-        <translation type="unfinished"></translation>
+        <source>Check</source>
+        <translation>Marcar</translation>
     </message>
+</context>
+<context>
+    <name>QRegExp</name>
     <message>
-        <source>Hangul PreHanja</source>
-        <translation type="unfinished"></translation>
+        <source>no error occurred</source>
+        <translation>nenhum erro ocorreu</translation>
     </message>
     <message>
-        <source>Hangul PostHanja</source>
-        <translation type="unfinished"></translation>
+        <source>disabled feature used</source>
+        <translation>recurso desabilitado foi usado</translation>
     </message>
     <message>
-        <source>Hangul Special</source>
-        <translation type="unfinished"></translation>
+        <source>bad char class syntax</source>
+        <translation>sintaxe de classe de caracteres incorreta</translation>
     </message>
     <message>
-        <source>Cancel</source>
-        <translation type="unfinished">Cancelar</translation>
+        <source>bad lookahead syntax</source>
+        <translation>sintaxe de lookahead incorreta</translation>
     </message>
     <message>
-        <source>Printer</source>
-        <translation type="unfinished">Impressora</translation>
+        <source>bad repetition syntax</source>
+        <translation>sintaxe de repetição incorreta</translation>
     </message>
     <message>
-        <source>Execute</source>
-        <translation type="unfinished">Executar</translation>
+        <source>invalid octal value</source>
+        <translation>valor octal inválido</translation>
     </message>
     <message>
-        <source>Play</source>
-        <translation type="unfinished"></translation>
+        <source>missing left delim</source>
+        <translation>delimitador esquerdo faltando</translation>
     </message>
     <message>
-        <source>Zoom</source>
-        <translation type="unfinished"></translation>
+        <source>unexpected end</source>
+        <translation>fim inesperado</translation>
     </message>
     <message>
-        <source>Exit</source>
-        <translation type="unfinished">Sair</translation>
+        <source>met internal limit</source>
+        <translation>atingiu limite interno</translation>
     </message>
+</context>
+<context>
+    <name>QSQLite2Driver</name>
     <message>
-        <source>Touchpad Toggle</source>
-        <translation type="unfinished"></translation>
+        <source>Error to open database</source>
+        <translation>Erro ao abrir banco de dados</translation>
     </message>
     <message>
-        <source>Touchpad On</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to begin transaction</source>
+        <translation>Não foi possível iniciar transação</translation>
     </message>
     <message>
-        <source>Touchpad Off</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to commit transaction</source>
+        <translation>Não foi possível efetuar commit da transação</translation>
     </message>
     <message>
-        <source>Num</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to rollback Transaction</source>
+        <translation>Não foi possível fazer rollback da transação</translation>
     </message>
 </context>
 <context>
-    <name>QSlider</name>
-    <message>
-        <source>Page left</source>
-        <translation type="vanished">Página à esquerda</translation>
-    </message>
-    <message>
-        <source>Page up</source>
-        <translation type="vanished">Página para cima</translation>
-    </message>
-    <message>
-        <source>Position</source>
-        <translation type="vanished">Posição</translation>
-    </message>
+    <name>QSQLite2Result</name>
     <message>
-        <source>Page right</source>
-        <translation type="vanished">Página para direita</translation>
+        <source>Unable to fetch results</source>
+        <translation>Não foi possível buscar resultados</translation>
     </message>
     <message>
-        <source>Page down</source>
-        <translation type="vanished">Página para baixo</translation>
+        <source>Unable to execute statement</source>
+        <translation>Não foi possível executar declaração</translation>
     </message>
 </context>
 <context>
-    <name>QSocks5SocketEngine</name>
-    <message>
-        <source>Connection to proxy refused</source>
-        <translation type="unfinished"></translation>
-    </message>
+    <name>QSQLiteDriver</name>
     <message>
-        <source>Connection to proxy closed prematurely</source>
-        <translation type="unfinished"></translation>
+        <source>Error opening database</source>
+        <translation>Erro ao abrir banco de dados</translation>
     </message>
     <message>
-        <source>Proxy host not found</source>
-        <translation type="unfinished"></translation>
+        <source>Error closing database</source>
+        <translation>Erro ao fechar banco de dados</translation>
     </message>
     <message>
-        <source>Connection to proxy timed out</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to begin transaction</source>
+        <translation>Não foi possível iniciar transação</translation>
     </message>
     <message>
-        <source>Proxy authentication failed</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to commit transaction</source>
+        <translation>Não foi possível efetuar commit da transação</translation>
     </message>
     <message>
-        <source>Proxy authentication failed: %1</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to rollback transaction</source>
+        <translation>Não foi possível fazer rollback da transação</translation>
     </message>
+</context>
+<context>
+    <name>QSQLiteResult</name>
     <message>
-        <source>SOCKS version 5 protocol error</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to fetch row</source>
+        <translation>Não foi possível buscar linha</translation>
     </message>
     <message>
-        <source>General SOCKSv5 server failure</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to execute statement</source>
+        <translation>Não foi possível executar declaração</translation>
     </message>
     <message>
-        <source>Connection not allowed by SOCKSv5 server</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to reset statement</source>
+        <translation>Não foi possível redefinir declaração</translation>
     </message>
     <message>
-        <source>TTL expired</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to bind parameters</source>
+        <translation>Não foi possível vincular parâmetros</translation>
     </message>
     <message>
-        <source>SOCKSv5 command not supported</source>
-        <translation type="unfinished"></translation>
+        <source>Parameter count mismatch</source>
+        <translation>Quantidade de parâmetros não coincide</translation>
     </message>
     <message>
-        <source>Address type not supported</source>
-        <translation type="unfinished"></translation>
+        <source>No query</source>
+        <translation>Sem pesquisa</translation>
     </message>
+</context>
+<context>
+    <name>QScrollBar</name>
     <message>
-        <source>Unknown SOCKSv5 proxy error code 0x%1</source>
-        <translation type="unfinished"></translation>
+        <source>Scroll here</source>
+        <translation>Role aqui</translation>
     </message>
     <message>
-        <source>Socks5 timeout error connecting to socks server</source>
-        <translation type="vanished">Erro de tempo esgotado no Socks5 ao tentar conectar ao servidor socks</translation>
+        <source>Left edge</source>
+        <translation>Canto esquerdo</translation>
     </message>
     <message>
-        <source>Network operation timed out</source>
-        <translation>Tempo esgotado durante operação de rede</translation>
+        <source>Top</source>
+        <translation>Topo</translation>
     </message>
-</context>
-<context>
-    <name>QSpiAccessibleBridge</name>
     <message>
-        <source>invalid role</source>
-        <extracomment>Role of an accessible object - the object is in an invalid state or could not be constructed</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Right edge</source>
+        <translation>Canto Direito</translation>
     </message>
     <message>
-        <source>title bar</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Bottom</source>
+        <translation>Fundo</translation>
     </message>
     <message>
-        <source>menu bar</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Page left</source>
+        <translation>Página para esquerda</translation>
     </message>
     <message>
-        <source>scroll bar</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Page up</source>
+        <translation>Página para cima</translation>
     </message>
     <message>
-        <source>grip</source>
-        <extracomment>Role of an accessible object - the grip is usually used for resizing another object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Page right</source>
+        <translation>Página para direita</translation>
     </message>
     <message>
-        <source>sound</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Page down</source>
+        <translation>Página para baixo</translation>
     </message>
     <message>
-        <source>cursor</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Scroll left</source>
+        <translation>Rolar para esquerda</translation>
     </message>
     <message>
-        <source>text caret</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Scroll up</source>
+        <translation>Rolar para cima</translation>
     </message>
     <message>
-        <source>alert message</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Scroll right</source>
+        <translation>Rolar para direita</translation>
     </message>
     <message>
-        <source>frame</source>
-        <extracomment>Role of an accessible object: a window with frame and title
-----------
-Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Scroll down</source>
+        <translation>Rolar para baixo</translation>
     </message>
     <message>
-        <source>filler</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Line up</source>
+        <translation>Linha para cima</translation>
     </message>
     <message>
-        <source>popup menu</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Position</source>
+        <translation>Posição</translation>
     </message>
     <message>
-        <source>menu item</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Line down</source>
+        <translation>Linha para baixo</translation>
     </message>
+</context>
+<context>
+    <name>QSharedMemory</name>
     <message>
-        <source>tool tip</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: unable to set key on lock</source>
+        <translation>%1: não foi possível definir a a chave do lock</translation>
     </message>
     <message>
-        <source>application</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: create size is less then 0</source>
+        <translation>%1: tamanho de criação é menor que 0</translation>
     </message>
     <message>
-        <source>document</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: unable to lock</source>
+        <translation>%1: não foi possível efetuar lock</translation>
     </message>
     <message>
-        <source>panel</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: unable to unlock</source>
+        <translation>%1: não foi possível efetuar unlock</translation>
     </message>
     <message>
-        <source>chart</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: permission denied</source>
+        <translation>%1: permissão negada</translation>
     </message>
     <message>
-        <source>dialog</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: already exists</source>
+        <translation>%1: já existe</translation>
     </message>
     <message>
-        <source>separator</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: doesn't exists</source>
+        <translation>%1: não existe</translation>
     </message>
     <message>
-        <source>tool bar</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: out of resources</source>
+        <translation>%1: sem recursos</translation>
     </message>
     <message>
-        <source>status bar</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: unknown error %2</source>
+        <translation>%1: erro desconhecido %2</translation>
     </message>
     <message>
-        <source>table</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: key is empty</source>
+        <translation>%1: chave vazia</translation>
     </message>
     <message>
-        <source>column header</source>
-        <extracomment>Role of an accessible object - part of a table</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: unix key file doesn't exists</source>
+        <translation>%1: arquivo de chave unix não existe</translation>
     </message>
     <message>
-        <source>row header</source>
-        <extracomment>Role of an accessible object - part of a table</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: ftok failed</source>
+        <translation>%1: ftok falhou</translation>
     </message>
     <message>
-        <source>column</source>
-        <extracomment>Role of an accessible object - part of a table</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: unable to make key</source>
+        <translation>%1: não foi possível criar chave</translation>
     </message>
     <message>
-        <source>row</source>
-        <extracomment>Role of an accessible object - part of a table</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: system-imposed size restrictions</source>
+        <translation>%1: restrições impostas pelo sistema</translation>
     </message>
     <message>
-        <source>cell</source>
-        <extracomment>Role of an accessible object - part of a table</extracomment>
-        <translation type="unfinished"></translation>
+        <source>%1: not attached</source>
+        <translation>%1: não associada</translation>
     </message>
+</context>
+<context>
+    <name>QShortcut</name>
     <message>
-        <source>link</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Space</source>
+        <translation>Barra de Espaços</translation>
     </message>
     <message>
-        <source>help balloon</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Esc</source>
+        <translation>Esc</translation>
     </message>
     <message>
-        <source>assistant</source>
-        <extracomment>Role of an accessible object - a helper dialog</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Tab</source>
+        <translation>Tab</translation>
     </message>
     <message>
-        <source>list</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Backtab</source>
+        <translation>Backtab</translation>
     </message>
     <message>
-        <source>list item</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Backspace</source>
+        <translation>Backspace</translation>
     </message>
     <message>
-        <source>tree</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Return</source>
+        <translation>Return</translation>
     </message>
     <message>
-        <source>tree item</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Enter</source>
+        <translation>Enter</translation>
     </message>
     <message>
-        <source>page tab</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Ins</source>
+        <translation>Ins</translation>
     </message>
     <message>
-        <source>property page</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Del</source>
+        <translation>Del</translation>
     </message>
     <message>
-        <source>indicator</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Pause</source>
+        <translation>Pause</translation>
     </message>
     <message>
-        <source>graphic</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Print</source>
+        <translation>Print</translation>
     </message>
     <message>
-        <source>label</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>SysReq</source>
+        <translation>SysReq</translation>
     </message>
     <message>
-        <source>text</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Home</source>
+        <translation>Home</translation>
     </message>
     <message>
-        <source>push button</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>End</source>
+        <translation>End</translation>
     </message>
     <message>
-        <source>check box</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Left</source>
+        <translation>Seta Para Esquerda</translation>
     </message>
     <message>
-        <source>radio button</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Up</source>
+        <translation>Seta Para Cima</translation>
     </message>
     <message>
-        <source>combo box</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Right</source>
+        <translation>Seta Para Direita</translation>
     </message>
     <message>
-        <source>progress bar</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Down</source>
+        <translation>Seta Para Baixo</translation>
     </message>
     <message>
-        <source>dial</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>PgUp</source>
+        <translation>PgUp</translation>
     </message>
     <message>
-        <source>hotkey field</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>PgDown</source>
+        <translation>PgDown</translation>
     </message>
     <message>
-        <source>slider</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>CapsLock</source>
+        <translation>CapsLock</translation>
     </message>
     <message>
-        <source>spin box</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>NumLock</source>
+        <translation>NumLock</translation>
     </message>
     <message>
-        <source>canvas</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>ScrollLock</source>
+        <translation>ScrollLock</translation>
     </message>
     <message>
-        <source>animation</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Menu</source>
+        <translation>Menu</translation>
     </message>
     <message>
-        <source>equation</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Help</source>
+        <translation>Ajuda</translation>
     </message>
     <message>
-        <source>button with drop down</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Back</source>
+        <translation>Voltar</translation>
     </message>
     <message>
-        <source>button menu</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Forward</source>
+        <translation>Avançar</translation>
     </message>
     <message>
-        <source>button with drop down grid</source>
-        <extracomment>Role of an accessible object - a button that expands a grid.</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Stop</source>
+        <translation>Parar</translation>
     </message>
     <message>
-        <source>space</source>
-        <extracomment>Role of an accessible object - blank space between other objects.</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Refresh</source>
+        <translation>Atualizar</translation>
     </message>
     <message>
-        <source>page tab list</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Volume Down</source>
+        <translation>Abaixar Volume</translation>
     </message>
     <message>
-        <source>clock</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Volume Mute</source>
+        <translation>Silenciar Volume</translation>
     </message>
     <message>
-        <source>splitter</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Volume Up</source>
+        <translation>Aumentar Volume</translation>
     </message>
     <message>
-        <source>layered pane</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Bass Boost</source>
+        <translation>Controle de Graves</translation>
     </message>
     <message>
-        <source>web document</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Bass Up</source>
+        <translation>Aumentar Graves</translation>
     </message>
     <message>
-        <source>paragraph</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Bass Down</source>
+        <translation>Diminuir Graves</translation>
     </message>
     <message>
-        <source>section</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Treble Up</source>
+        <translation>Aumentar Agudos</translation>
     </message>
     <message>
-        <source>color chooser</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Treble Down</source>
+        <translation>Diminuir Agudos</translation>
     </message>
     <message>
-        <source>footer</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Media Play</source>
+        <translation>Tocar Mídia</translation>
     </message>
     <message>
-        <source>form</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Media Stop</source>
+        <translation>Parar Mídia</translation>
     </message>
     <message>
-        <source>heading</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Media Previous</source>
+        <translation>Mídia Anterior</translation>
     </message>
     <message>
-        <source>note</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Media Next</source>
+        <translation>Próxima Mídia</translation>
     </message>
     <message>
-        <source>complementary content</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished"></translation>
+        <source>Media Record</source>
+        <translation>Gravar Mídia</translation>
     </message>
     <message>
-        <source>unknown</source>
-        <extracomment>Role of an accessible object</extracomment>
-        <translation type="unfinished">desconhecido</translation>
+        <source>Favorites</source>
+        <translation>Favoritos</translation>
     </message>
-</context>
-<context>
-    <name>QSpinBox</name>
     <message>
-        <source>More</source>
-        <translation type="vanished">Mais</translation>
+        <source>Search</source>
+        <translation>Pesquisar</translation>
     </message>
     <message>
-        <source>Less</source>
-        <translation type="vanished">Menos</translation>
+        <source>Standby</source>
+        <translation>Modo de Espera</translation>
     </message>
-</context>
-<context>
-    <name>QSql</name>
     <message>
-        <source>Delete</source>
-        <translation type="vanished">Apagar</translation>
+        <source>Open URL</source>
+        <translation>Abrir URL</translation>
     </message>
     <message>
-        <source>Delete this record?</source>
-        <translation type="vanished">Apagar este registro?</translation>
+        <source>Launch Mail</source>
+        <translation>Iniciar Correio</translation>
     </message>
     <message>
-        <source>Yes</source>
-        <translation type="vanished">Sim</translation>
+        <source>Launch Media</source>
+        <translation>Iniciar Mídia</translation>
     </message>
     <message>
-        <source>No</source>
-        <translation type="vanished">Não</translation>
+        <source>Launch (0)</source>
+        <translation>Iniciar (0)</translation>
     </message>
     <message>
-        <source>Insert</source>
-        <translation type="vanished">Inserir</translation>
+        <source>Launch (1)</source>
+        <translation>Iniciar (1)</translation>
     </message>
     <message>
-        <source>Update</source>
-        <translation type="vanished">Atualizar</translation>
+        <source>Launch (2)</source>
+        <translation>Iniciar (2)</translation>
     </message>
     <message>
-        <source>Save edits?</source>
-        <translation type="vanished">Salvar edição?</translation>
+        <source>Launch (3)</source>
+        <translation>Iniciar (3)</translation>
     </message>
     <message>
-        <source>Cancel</source>
-        <translation type="vanished">Cancelar</translation>
+        <source>Launch (4)</source>
+        <translation>Iniciar (4)</translation>
     </message>
     <message>
-        <source>Confirm</source>
-        <translation type="vanished">Confirmar</translation>
+        <source>Launch (5)</source>
+        <translation>Iniciar (5)</translation>
     </message>
     <message>
-        <source>Cancel your edits?</source>
-        <translation type="vanished">Cancelar sua edição?</translation>
+        <source>Launch (6)</source>
+        <translation>Iniciar (6)</translation>
     </message>
-</context>
-<context>
-    <name>QSslSocket</name>
     <message>
-        <source>Unable to write data: %1</source>
-        <translation>Não foi possível gravar dados: %1</translation>
+        <source>Launch (7)</source>
+        <translation>Iniciar (7)</translation>
     </message>
     <message>
-        <source>Error while reading: %1</source>
-        <translation>Erro durante leitura: %1</translation>
+        <source>Launch (8)</source>
+        <translation>Iniciar (8)</translation>
     </message>
     <message>
-        <source>Error during SSL handshake: %1</source>
-        <translation>Erro durante handshake SSL: %1</translation>
+        <source>Launch (9)</source>
+        <translation>Iniciar (9)</translation>
     </message>
     <message>
-        <source>Error creating SSL context (%1)</source>
-        <translation>Erro ao criar contexto SSL (%1)</translation>
+        <source>Launch (A)</source>
+        <translation>Iniciar (A)</translation>
     </message>
     <message>
-        <source>Invalid or empty cipher list (%1)</source>
-        <translation>Lista de mecanismos de cifragem inválida ou vazia (%1)</translation>
+        <source>Launch (B)</source>
+        <translation>Iniciar (B)</translation>
     </message>
     <message>
-        <source>Error creating SSL session, %1</source>
-        <translation>Erro ao criar sesão SSL, %1</translation>
+        <source>Launch (C)</source>
+        <translation>Iniciar (C)</translation>
     </message>
     <message>
-        <source>Error creating SSL session: %1</source>
-        <translation>Erro ao criar sessão SSL: %1</translation>
+        <source>Launch (D)</source>
+        <translation>Iniciar (D)</translation>
     </message>
     <message>
-        <source>Cannot provide a certificate with no key, %1</source>
-        <translation>Não foi possível fornecer um certificado sem chave, %1</translation>
+        <source>Launch (E)</source>
+        <translation>Iniciar (E)</translation>
     </message>
     <message>
-        <source>Error loading local certificate, %1</source>
-        <translation>Erro ao carregar certificado local, %1</translation>
+        <source>Launch (F)</source>
+        <translation>Iniciar (F)</translation>
     </message>
     <message>
-        <source>Error loading private key, %1</source>
-        <translation>Erro ao carregar chave privada, %1</translation>
+        <source>Print Screen</source>
+        <translation>Print Screen</translation>
     </message>
     <message>
-        <source>Private key does not certificate public key, %1</source>
-        <translation type="vanished">A chave privada não certifica a chave pública %1</translation>
+        <source>Page Up</source>
+        <translation>Page Up</translation>
     </message>
     <message>
-        <source>Error when setting the elliptic curves (%1)</source>
-        <translation type="unfinished"></translation>
+        <source>Page Down</source>
+        <translation>Page Down</translation>
     </message>
     <message>
-        <source>unsupported protocol</source>
-        <translation type="unfinished"></translation>
+        <source>Caps Lock</source>
+        <translation>Caps Lock</translation>
     </message>
     <message>
-        <source>Private key does not certify public key, %1</source>
-        <translation type="unfinished"></translation>
+        <source>Num Lock</source>
+        <translation>Num Lock</translation>
     </message>
     <message>
-        <source>OpenSSL version too old, need at least v1.0.2</source>
-        <translation type="unfinished"></translation>
+        <source>Number Lock</source>
+        <translation>Number Lock</translation>
     </message>
     <message>
-        <source>No error</source>
-        <translation type="unfinished"></translation>
+        <source>Scroll Lock</source>
+        <translation>Scroll Lock</translation>
     </message>
     <message>
-        <source>The issuer certificate could not be found</source>
-        <translation type="unfinished"></translation>
+        <source>Insert</source>
+        <translation>Insert</translation>
     </message>
     <message>
-        <source>The certificate signature could not be decrypted</source>
-        <translation type="unfinished"></translation>
+        <source>Delete</source>
+        <translation>Delete</translation>
     </message>
     <message>
-        <source>The public key in the certificate could not be read</source>
-        <translation type="unfinished"></translation>
+        <source>Escape</source>
+        <translation>Escape</translation>
     </message>
     <message>
-        <source>The signature of the certificate is invalid</source>
-        <translation type="unfinished"></translation>
+        <source>System Request</source>
+        <translation>System Request</translation>
     </message>
     <message>
-        <source>The certificate is not yet valid</source>
-        <translation type="unfinished"></translation>
+        <source>Select</source>
+        <translation>Selecionar</translation>
     </message>
     <message>
-        <source>The certificate has expired</source>
-        <translation type="unfinished"></translation>
+        <source>Yes</source>
+        <translation>Sim</translation>
     </message>
     <message>
-        <source>The certificate's notBefore field contains an invalid time</source>
-        <translation type="unfinished"></translation>
+        <source>No</source>
+        <translation>Não</translation>
     </message>
     <message>
-        <source>The certificate's notAfter field contains an invalid time</source>
-        <translation type="unfinished"></translation>
+        <source>Context1</source>
+        <translation>Contexto1</translation>
     </message>
     <message>
-        <source>The certificate is self-signed, and untrusted</source>
-        <translation type="unfinished"></translation>
+        <source>Context2</source>
+        <translation>Contexto2</translation>
     </message>
     <message>
-        <source>The root certificate of the certificate chain is self-signed, and untrusted</source>
-        <translation type="unfinished"></translation>
+        <source>Context3</source>
+        <translation>Contexto3</translation>
     </message>
     <message>
-        <source>The issuer certificate of a locally looked up certificate could not be found</source>
-        <translation type="unfinished"></translation>
+        <source>Context4</source>
+        <translation>Contexto4</translation>
     </message>
     <message>
-        <source>No certificates could be verified</source>
-        <translation type="unfinished"></translation>
+        <source>Call</source>
+        <translation>Chamar</translation>
     </message>
     <message>
-        <source>One of the CA certificates is invalid</source>
-        <translation type="unfinished"></translation>
+        <source>Hangup</source>
+        <translation>Desligar</translation>
     </message>
     <message>
-        <source>The basicConstraints path length parameter has been exceeded</source>
-        <translation type="unfinished"></translation>
+        <source>Flip</source>
+        <translation>Virar</translation>
     </message>
     <message>
-        <source>The supplied certificate is unsuitable for this purpose</source>
-        <translation type="unfinished"></translation>
+        <source>Ctrl</source>
+        <translation>Ctrl</translation>
     </message>
     <message>
-        <source>The root CA certificate is not trusted for this purpose</source>
-        <translation type="unfinished"></translation>
+        <source>Shift</source>
+        <translation>Shift</translation>
     </message>
     <message>
-        <source>The root CA certificate is marked to reject the specified purpose</source>
-        <translation type="unfinished"></translation>
+        <source>Alt</source>
+        <translation>Alt</translation>
     </message>
     <message>
-        <source>The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate</source>
-        <translation type="unfinished"></translation>
+        <source>Meta</source>
+        <translation>Meta</translation>
     </message>
     <message>
-        <source>The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate</source>
-        <translation type="unfinished"></translation>
+        <source>+</source>
+        <translation>+</translation>
     </message>
     <message>
-        <source>The peer did not present any certificate</source>
-        <translation type="unfinished"></translation>
+        <source>F%1</source>
+        <translation>F%1</translation>
     </message>
     <message>
-        <source>The host name did not match any of the valid hosts for this certificate</source>
-        <translation type="unfinished"></translation>
+        <source>Home Page</source>
+        <translation>Página Inicial</translation>
     </message>
+</context>
+<context>
+    <name>QSlider</name>
     <message>
-        <source>The peer certificate is blacklisted</source>
-        <translation type="unfinished"></translation>
+        <source>Page left</source>
+        <translation>Página à esquerda</translation>
     </message>
     <message>
-        <source>Unknown error</source>
-        <translation type="unfinished">Erro desconhecido</translation>
+        <source>Page up</source>
+        <translation>Página para cima</translation>
     </message>
     <message>
-        <source>The TLS/SSL connection has been closed</source>
-        <translation type="unfinished"></translation>
+        <source>Position</source>
+        <translation>Posição</translation>
     </message>
     <message>
-        <source>Unable to init SSL Context: %1</source>
-        <translation type="unfinished"></translation>
+        <source>Page right</source>
+        <translation>Página para direita</translation>
     </message>
     <message>
-        <source>Unable to decrypt data: %1</source>
-        <translation type="unfinished"></translation>
+        <source>Page down</source>
+        <translation>Página para baixo</translation>
     </message>
 </context>
 <context>
-    <name>QStandardPaths</name>
-    <message>
-        <source>Desktop</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Documents</source>
-        <translation type="unfinished"></translation>
-    </message>
+    <name>QSocks5SocketEngine</name>
     <message>
-        <source>Fonts</source>
-        <translation type="unfinished">Fontes</translation>
+        <source>Socks5 timeout error connecting to socks server</source>
+        <translation>Erro de tempo esgotado no Socks5 ao tentar conectar ao servidor socks</translation>
     </message>
     <message>
-        <source>Applications</source>
-        <translation type="unfinished"></translation>
+        <source>Network operation timed out</source>
+        <translation>Tempo esgotado durante operação de rede</translation>
     </message>
+</context>
+<context>
+    <name>QSpinBox</name>
     <message>
-        <source>Music</source>
-        <translation type="unfinished">Música</translation>
+        <source>More</source>
+        <translation>Mais</translation>
     </message>
     <message>
-        <source>Movies</source>
-        <translation type="unfinished"></translation>
+        <source>Less</source>
+        <translation>Menos</translation>
     </message>
+</context>
+<context>
+    <name>QSql</name>
     <message>
-        <source>Pictures</source>
-        <translation type="unfinished"></translation>
+        <source>Delete</source>
+        <translation>Apagar</translation>
     </message>
     <message>
-        <source>Temporary Directory</source>
-        <translation type="unfinished"></translation>
+        <source>Delete this record?</source>
+        <translation>Apagar este registro?</translation>
     </message>
     <message>
-        <source>Home</source>
-        <translation type="unfinished"></translation>
+        <source>Yes</source>
+        <translation>Sim</translation>
     </message>
     <message>
-        <source>Cache</source>
-        <translation type="unfinished"></translation>
+        <source>No</source>
+        <translation>Não</translation>
     </message>
     <message>
-        <source>Shared Data</source>
-        <translation type="unfinished"></translation>
+        <source>Insert</source>
+        <translation>Inserir</translation>
     </message>
     <message>
-        <source>Runtime</source>
-        <translation type="unfinished"></translation>
+        <source>Update</source>
+        <translation>Atualizar</translation>
     </message>
     <message>
-        <source>Configuration</source>
-        <translation type="unfinished"></translation>
+        <source>Save edits?</source>
+        <translation>Salvar edição?</translation>
     </message>
     <message>
-        <source>Shared Configuration</source>
-        <translation type="unfinished"></translation>
+        <source>Cancel</source>
+        <translation>Cancelar</translation>
     </message>
     <message>
-        <source>Shared Cache</source>
-        <translation type="unfinished"></translation>
+        <source>Confirm</source>
+        <translation>Confirmar</translation>
     </message>
     <message>
-        <source>Download</source>
-        <translation type="unfinished"></translation>
+        <source>Cancel your edits?</source>
+        <translation>Cancelar sua edição?</translation>
     </message>
+</context>
+<context>
+    <name>QSslSocket</name>
     <message>
-        <source>Application Data</source>
-        <translation type="unfinished"></translation>
+        <source>Unable to write data: %1</source>
+        <translation>Não foi possível gravar dados: %1</translation>
     </message>
     <message>
-        <source>Application Configuration</source>
-        <translation type="unfinished"></translation>
+        <source>Error while reading: %1</source>
+        <translation>Erro durante leitura: %1</translation>
     </message>
-</context>
-<context>
-    <name>QStateMachine</name>
     <message>
-        <source>Missing initial state in compound state '%1'</source>
-        <translation type="unfinished"></translation>
+        <source>Error during SSL handshake: %1</source>
+        <translation>Erro durante handshake SSL: %1</translation>
     </message>
     <message>
-        <source>Missing default state in history state '%1'</source>
-        <translation type="unfinished"></translation>
+        <source>Error creating SSL context (%1)</source>
+        <translation>Erro ao criar contexto SSL (%1)</translation>
     </message>
     <message>
-        <source>No common ancestor for targets and source of transition from state '%1'</source>
-        <translation type="unfinished"></translation>
+        <source>Invalid or empty cipher list (%1)</source>
+        <translation>Lista de mecanismos de cifragem inválida ou vazia (%1)</translation>
     </message>
     <message>
-        <source>Unknown error</source>
-        <translation type="unfinished">Erro desconhecido</translation>
+        <source>Error creating SSL session, %1</source>
+        <translation>Erro ao criar sesão SSL, %1</translation>
     </message>
-</context>
-<context>
-    <name>QSystemSemaphore</name>
     <message>
-        <source>%1: out of resources</source>
-        <translation type="unfinished">%1: sem recursos</translation>
+        <source>Error creating SSL session: %1</source>
+        <translation>Erro ao criar sessão SSL: %1</translation>
     </message>
     <message>
-        <source>%1: permission denied</source>
-        <translation type="unfinished">%1: permissão negada</translation>
+        <source>Cannot provide a certificate with no key, %1</source>
+        <translation>Não foi possível fornecer um certificado sem chave, %1</translation>
     </message>
     <message>
-        <source>%1: already exists</source>
-        <translation type="unfinished">%1: já existe</translation>
+        <source>Error loading local certificate, %1</source>
+        <translation>Erro ao carregar certificado local, %1</translation>
     </message>
     <message>
-        <source>%1: does not exist</source>
-        <translation type="unfinished"></translation>
+        <source>Error loading private key, %1</source>
+        <translation>Erro ao carregar chave privada, %1</translation>
     </message>
     <message>
-        <source>%1: unknown error %2</source>
-        <translation type="unfinished">%1: erro desconhecido %2</translation>
+        <source>Private key does not certificate public key, %1</source>
+        <translation>A chave privada não certifica a chave pública %1</translation>
     </message>
 </context>
 <context>
@@ -7904,96 +3910,67 @@ Role of an accessible object</extracomment>
     </message>
 </context>
 <context>
-    <name>QTcpServer</name>
-    <message>
-        <source>Socket operation unsupported</source>
-        <translation type="obsolete">Operação de 'socket' não suportada</translation>
-    </message>
-    <message>
-        <source>Operation on socket is not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
     <name>QTextControl</name>
     <message>
         <source>&Undo</source>
-        <translation type="vanished">Desfazer (&U)</translation>
+        <translation>Desfazer (&U)</translation>
     </message>
     <message>
         <source>&Redo</source>
-        <translation type="vanished">&Refazer</translation>
+        <translation>&Refazer</translation>
     </message>
     <message>
         <source>Cu&t</source>
-        <translation type="vanished">Cor&tar</translation>
+        <translation>Cor&tar</translation>
     </message>
     <message>
         <source>&Copy</source>
-        <translation type="vanished">&Copiar</translation>
+        <translation>&Copiar</translation>
     </message>
     <message>
         <source>Copy &Link Location</source>
-        <translation type="vanished">Copiar Localização do &Link</translation>
+        <translation>Copiar Localização do &Link</translation>
     </message>
     <message>
         <source>&Paste</source>
-        <translation type="vanished">Colar (&P)</translation>
+        <translation>Colar (&P)</translation>
     </message>
     <message>
         <source>Delete</source>
-        <translation type="vanished">Apagar</translation>
+        <translation>Apagar</translation>
     </message>
     <message>
         <source>Select All</source>
-        <translation type="vanished">Selecionar Todos</translation>
+        <translation>Selecionar Todos</translation>
     </message>
 </context>
 <context>
     <name>QToolButton</name>
     <message>
         <source>Press</source>
-        <translation type="vanished">Pressionar</translation>
+        <translation>Pressionar</translation>
     </message>
     <message>
         <source>Open</source>
-        <translation type="vanished">Abrir</translation>
+        <translation>Abrir</translation>
     </message>
 </context>
 <context>
     <name>QUdpSocket</name>
     <message>
         <source>This platform does not support IPv6</source>
-        <translation type="vanished">Esta plataforma não suporta IPv6</translation>
+        <translation>Esta plataforma não suporta IPv6</translation>
     </message>
 </context>
 <context>
     <name>QUndoGroup</name>
     <message>
         <source>Undo</source>
-        <translation type="vanished">Desfazer</translation>
-    </message>
-    <message>
-        <source>Redo</source>
-        <translation type="vanished">Refazer</translation>
-    </message>
-    <message>
-        <source>Undo %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Undo</source>
-        <comment>Default text for undo action</comment>
-        <translation type="unfinished">Desfazer</translation>
-    </message>
-    <message>
-        <source>Redo %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Desfazer</translation>
     </message>
     <message>
         <source>Redo</source>
-        <comment>Default text for redo action</comment>
-        <translation type="unfinished">Refazer</translation>
+        <translation>Refazer</translation>
     </message>
 </context>
 <context>
@@ -8007,29 +3984,11 @@ Role of an accessible object</extracomment>
     <name>QUndoStack</name>
     <message>
         <source>Undo</source>
-        <translation type="vanished">Desfazer</translation>
-    </message>
-    <message>
-        <source>Redo</source>
-        <translation type="vanished">Refazer</translation>
-    </message>
-    <message>
-        <source>Undo %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Undo</source>
-        <comment>Default text for undo action</comment>
-        <translation type="unfinished">Desfazer</translation>
-    </message>
-    <message>
-        <source>Redo %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Desfazer</translation>
     </message>
     <message>
         <source>Redo</source>
-        <comment>Default text for redo action</comment>
-        <translation type="unfinished">Refazer</translation>
+        <translation>Refazer</translation>
     </message>
 </context>
 <context>
@@ -8078,351 +4037,283 @@ Role of an accessible object</extracomment>
         <source>Insert Unicode control character</source>
         <translation>Inserir caractere de controle Unicode</translation>
     </message>
-    <message>
-        <source>LRI Left-to-right isolate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>RLI Right-to-left isolate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>FSI First strong isolate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>PDI Pop directional isolate</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QWebFrame</name>
     <message>
         <source>Request cancelled</source>
-        <translation type="vanished">Solicitação cancelada</translation>
+        <translation>Solicitação cancelada</translation>
     </message>
     <message>
         <source>Request blocked</source>
-        <translation type="vanished">Solicitação bloqueada</translation>
+        <translation>Solicitação bloqueada</translation>
     </message>
     <message>
         <source>Cannot show URL</source>
-        <translation type="vanished">Não é possível exibir a URL</translation>
+        <translation>Não é possível exibir a URL</translation>
     </message>
     <message>
         <source>Frame load interruped by policy change</source>
-        <translation type="vanished">O carregamento do frame foi interrompido por uma mudança de política</translation>
+        <translation>O carregamento do frame foi interrompido por uma mudança de política</translation>
     </message>
     <message>
         <source>Cannot show mimetype</source>
-        <translation type="vanished">Não é possível exibir o mimetype</translation>
+        <translation>Não é possível exibir o mimetype</translation>
     </message>
     <message>
         <source>File does not exist</source>
-        <translation type="vanished">O arquivo não existe</translation>
+        <translation>O arquivo não existe</translation>
     </message>
 </context>
 <context>
     <name>QWebPage</name>
     <message>
         <source>Bad HTTP request</source>
-        <translation type="vanished">Solicitação HTTP inválida</translation>
+        <translation>Solicitação HTTP inválida</translation>
     </message>
     <message>
         <source>Submit</source>
         <comment>default label for Submit buttons in forms on web pages</comment>
-        <translation type="vanished">Enviar</translation>
+        <translation>Enviar</translation>
     </message>
     <message>
         <source>Submit</source>
         <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment>
-        <translation type="vanished">Enviar</translation>
+        <translation>Enviar</translation>
     </message>
     <message>
         <source>Reset</source>
         <comment>default label for Reset buttons in forms on web pages</comment>
-        <translation type="vanished">Redefinir</translation>
+        <translation>Redefinir</translation>
     </message>
     <message>
         <source>This is a searchable index. Enter search keywords: </source>
         <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment>
-        <translation type="vanished">Este índice pode ser pesquisado. Entre com as palavras-chave de busca: </translation>
+        <translation>Este índice pode ser pesquisado. Entre com as palavras-chave de busca: </translation>
     </message>
     <message>
         <source>Choose File</source>
         <comment>title for file button used in HTML forms</comment>
-        <translation type="vanished">Escolher Arquivo</translation>
+        <translation>Escolher Arquivo</translation>
     </message>
     <message>
         <source>No file selected</source>
         <comment>text to display in file button used in HTML forms when no file is selected</comment>
-        <translation type="vanished">Nenhum arquivo selecionado</translation>
+        <translation>Nenhum arquivo selecionado</translation>
     </message>
     <message>
         <source>Open in New Window</source>
         <comment>Open in New Window context menu item</comment>
-        <translation type="vanished">Abrir em Nova Janela</translation>
+        <translation>Abrir em Nova Janela</translation>
     </message>
     <message>
         <source>Save Link...</source>
         <comment>Download Linked File context menu item</comment>
-        <translation type="vanished">Salvar Link...</translation>
+        <translation>Salvar Link...</translation>
     </message>
     <message>
         <source>Copy Link</source>
         <comment>Copy Link context menu item</comment>
-        <translation type="vanished">Copiar Link</translation>
+        <translation>Copiar Link</translation>
     </message>
     <message>
         <source>Open Image</source>
         <comment>Open Image in New Window context menu item</comment>
-        <translation type="vanished">Abrir Imagem</translation>
+        <translation>Abrir Imagem</translation>
     </message>
     <message>
         <source>Save Image</source>
         <comment>Download Image context menu item</comment>
-        <translation type="vanished">Salvar Imagem</translation>
+        <translation>Salvar Imagem</translation>
     </message>
     <message>
         <source>Copy Image</source>
         <comment>Copy Link context menu item</comment>
-        <translation type="vanished">Copiar Imagem</translation>
+        <translation>Copiar Imagem</translation>
     </message>
     <message>
         <source>Open Frame</source>
         <comment>Open Frame in New Window context menu item</comment>
-        <translation type="vanished">Abrir Frame</translation>
+        <translation>Abrir Frame</translation>
     </message>
     <message>
         <source>Copy</source>
         <comment>Copy context menu item</comment>
-        <translation type="vanished">Copiar</translation>
+        <translation>Copiar</translation>
     </message>
     <message>
         <source>Go Back</source>
         <comment>Back context menu item</comment>
-        <translation type="vanished">Voltar</translation>
+        <translation>Voltar</translation>
     </message>
     <message>
         <source>Go Forward</source>
         <comment>Forward context menu item</comment>
-        <translation type="vanished">Avançar</translation>
+        <translation>Avançar</translation>
     </message>
     <message>
         <source>Stop</source>
         <comment>Stop context menu item</comment>
-        <translation type="vanished">Parar</translation>
+        <translation>Parar</translation>
     </message>
     <message>
         <source>Reload</source>
         <comment>Reload context menu item</comment>
-        <translation type="vanished">Atualizar</translation>
+        <translation>Atualizar</translation>
     </message>
     <message>
         <source>Cut</source>
         <comment>Cut context menu item</comment>
-        <translation type="vanished">Cortar</translation>
+        <translation>Cortar</translation>
     </message>
     <message>
         <source>Paste</source>
         <comment>Paste context menu item</comment>
-        <translation type="vanished">Colar</translation>
+        <translation>Colar</translation>
     </message>
     <message>
         <source>No Guesses Found</source>
         <comment>No Guesses Found context menu item</comment>
-        <translation type="vanished">Nenhuma Sugestão Encontrada</translation>
+        <translation>Nenhuma Sugestão Encontrada</translation>
     </message>
     <message>
         <source>Ignore</source>
         <comment>Ignore Spelling context menu item</comment>
-        <translation type="vanished">Ignorar</translation>
+        <translation>Ignorar</translation>
     </message>
     <message>
         <source>Add To Dictionary</source>
         <comment>Learn Spelling context menu item</comment>
-        <translation type="vanished">Adicionar ao Dicionário</translation>
+        <translation>Adicionar ao Dicionário</translation>
     </message>
     <message>
         <source>Search The Web</source>
         <comment>Search The Web context menu item</comment>
-        <translation type="vanished">Pesquisar na Web</translation>
+        <translation>Pesquisar na Web</translation>
     </message>
     <message>
         <source>Look Up In Dictionary</source>
         <comment>Look Up in Dictionary context menu item</comment>
-        <translation type="vanished">Pesquisar no Dicionário</translation>
+        <translation>Pesquisar no Dicionário</translation>
     </message>
     <message>
         <source>Open Link</source>
         <comment>Open Link context menu item</comment>
-        <translation type="vanished">Abrir Link</translation>
+        <translation>Abrir Link</translation>
     </message>
     <message>
         <source>Ignore</source>
         <comment>Ignore Grammar context menu item</comment>
-        <translation type="vanished">Ignorar</translation>
+        <translation>Ignorar</translation>
     </message>
     <message>
         <source>Spelling</source>
         <comment>Spelling and Grammar context sub-menu item</comment>
-        <translation type="vanished">Ortografia</translation>
+        <translation>Ortografia</translation>
     </message>
     <message>
         <source>Show Spelling and Grammar</source>
         <comment>menu item title</comment>
-        <translation type="vanished">Exibir Ortografia e Gramática</translation>
+        <translation>Exibir Ortografia e Gramática</translation>
     </message>
     <message>
         <source>Hide Spelling and Grammar</source>
         <comment>menu item title</comment>
-        <translation type="vanished">Ocultar Ortografia e Gramática</translation>
+        <translation>Ocultar Ortografia e Gramática</translation>
     </message>
     <message>
         <source>Check Spelling</source>
         <comment>Check spelling context menu item</comment>
-        <translation type="vanished">Verificar Ortografia</translation>
+        <translation>Verificar Ortografia</translation>
     </message>
     <message>
         <source>Check Spelling While Typing</source>
         <comment>Check spelling while typing context menu item</comment>
-        <translation type="vanished">Verificar Ortografia Ao Digitar</translation>
+        <translation>Verificar Ortografia Ao Digitar</translation>
     </message>
     <message>
         <source>Check Grammar With Spelling</source>
         <comment>Check grammar with spelling context menu item</comment>
-        <translation type="vanished">Verificar Gramática Ao Digitar</translation>
+        <translation>Verificar Gramática Ao Digitar</translation>
     </message>
     <message>
         <source>Fonts</source>
         <comment>Font context sub-menu item</comment>
-        <translation type="vanished">Fontes</translation>
+        <translation>Fontes</translation>
     </message>
     <message>
         <source>Bold</source>
         <comment>Bold context menu item</comment>
-        <translation type="vanished">Negrito</translation>
+        <translation>Negrito</translation>
     </message>
     <message>
         <source>Italic</source>
         <comment>Italic context menu item</comment>
-        <translation type="vanished">Itálico</translation>
+        <translation>Itálico</translation>
     </message>
     <message>
         <source>Underline</source>
         <comment>Underline context menu item</comment>
-        <translation type="vanished">Sublinhado</translation>
+        <translation>Sublinhado</translation>
     </message>
     <message>
         <source>Outline</source>
         <comment>Outline context menu item</comment>
-        <translation type="vanished">Outline</translation>
+        <translation>Outline</translation>
     </message>
     <message>
         <source>Direction</source>
         <comment>Writing direction context sub-menu item</comment>
-        <translation type="vanished">Direção</translation>
+        <translation>Direção</translation>
     </message>
     <message>
         <source>Default</source>
         <comment>Default writing direction context menu item</comment>
-        <translation type="vanished">Padrão</translation>
+        <translation>Padrão</translation>
     </message>
     <message>
         <source>LTR</source>
         <comment>Left to Right context menu item</comment>
-        <translation type="vanished">Esquerda para Direita (LTR)</translation>
+        <translation>Esquerda para Direita (LTR)</translation>
     </message>
     <message>
         <source>RTL</source>
         <comment>Right to Left context menu item</comment>
-        <translation type="vanished">Direita Para Esquerda (RTL)</translation>
+        <translation>Direita Para Esquerda (RTL)</translation>
     </message>
     <message>
         <source>Inspect</source>
         <comment>Inspect Element context menu item</comment>
-        <translation type="vanished">Inspecionar</translation>
+        <translation>Inspecionar</translation>
     </message>
     <message>
         <source>No recent searches</source>
         <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
-        <translation type="vanished">Nenhuma pesquisa recente</translation>
+        <translation>Nenhuma pesquisa recente</translation>
     </message>
     <message>
         <source>Recent searches</source>
         <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
-        <translation type="vanished">Pesquisas recentes</translation>
+        <translation>Pesquisas recentes</translation>
     </message>
     <message>
         <source>Clear recent searches</source>
         <comment>menu item in Recent Searches menu that empties menu's contents</comment>
-        <translation type="vanished">Limpar pesquisas recentes</translation>
+        <translation>Limpar pesquisas recentes</translation>
     </message>
     <message>
         <source>Unknown</source>
         <comment>Unknown filesize FTP directory listing item</comment>
-        <translation type="vanished">Desconhecido</translation>
+        <translation>Desconhecido</translation>
     </message>
     <message>
         <source>%1 (%2x%3 pixels)</source>
         <comment>Title string for images</comment>
-        <translation type="vanished">%1 (%2x%3 pixels)</translation>
+        <translation>%1 (%2x%3 pixels)</translation>
     </message>
     <message>
         <source>Web Inspector - %2</source>
-        <translation type="vanished">Inspetor Web - %2</translation>
-    </message>
-    <message>
-        <source>Scroll here</source>
-        <translation type="obsolete">Deslizar aqui</translation>
-    </message>
-    <message>
-        <source>Left edge</source>
-        <translation type="obsolete">Borda esquerda</translation>
-    </message>
-    <message>
-        <source>Top</source>
-        <translation type="obsolete">Topo</translation>
-    </message>
-    <message>
-        <source>Right edge</source>
-        <translation type="obsolete">Borda direita</translation>
-    </message>
-    <message>
-        <source>Bottom</source>
-        <translation type="obsolete">Fundo</translation>
-    </message>
-    <message>
-        <source>Page left</source>
-        <translation type="obsolete">Página para esquerda</translation>
-    </message>
-    <message>
-        <source>Page up</source>
-        <translation type="obsolete">Página para cima</translation>
-    </message>
-    <message>
-        <source>Page right</source>
-        <translation type="obsolete">Página para direita</translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation type="obsolete">Página para baixo</translation>
-    </message>
-    <message>
-        <source>Scroll left</source>
-        <translation type="obsolete">Deslizar para esquerda</translation>
-    </message>
-    <message>
-        <source>Scroll up</source>
-        <translation type="obsolete">Deslizar para cima</translation>
-    </message>
-    <message>
-        <source>Scroll right</source>
-        <translation type="obsolete">Deslizar para a direita</translation>
-    </message>
-    <message>
-        <source>Scroll down</source>
-        <translation type="obsolete">Deslizar para baixo</translation>
+        <translation>Inspetor Web - %2</translation>
     </message>
 </context>
 <context>
@@ -8440,54 +4331,6 @@ Role of an accessible object</extracomment>
     </message>
 </context>
 <context>
-    <name>QWidgetTextControl</name>
-    <message>
-        <source>&Undo</source>
-        <translation type="unfinished">Desfazer (&U)</translation>
-    </message>
-    <message>
-        <source>&Redo</source>
-        <translation type="unfinished">&Refazer</translation>
-    </message>
-    <message>
-        <source>Cu&t</source>
-        <translation type="unfinished">Cor&tar</translation>
-    </message>
-    <message>
-        <source>&Copy</source>
-        <translation type="unfinished">&Copiar</translation>
-    </message>
-    <message>
-        <source>Copy &Link Location</source>
-        <translation type="unfinished">Copiar Localização do &Link</translation>
-    </message>
-    <message>
-        <source>&Paste</source>
-        <translation type="unfinished">Colar (&P)</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Select All</source>
-        <translation type="unfinished">Selecionar Todos</translation>
-    </message>
-</context>
-<context>
-    <name>QWindowsDirect2DIntegration</name>
-    <message>
-        <source>Qt cannot load the direct2d platform plugin because the Direct2D version on this system is too old. The minimum system requirement for this platform plugin is Windows 7 SP1 with Platform Update.
-
-The minimum Direct2D version required is %1.%2.%3.%4. The Direct2D version on this system is %5.%6.%7.%8.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Cannot load direct2d platform plugin</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
     <name>QWizard</name>
     <message>
         <source>Go Back</source>
@@ -8507,7 +4350,7 @@ The minimum Direct2D version required is %1.%2.%3.%4. The Direct2D version on th
     </message>
     <message>
         <source>Quit</source>
-        <translation type="vanished">Sair</translation>
+        <translation>Sair</translation>
     </message>
     <message>
         <source>Help</source>
@@ -8542,55 +4385,55 @@ The minimum Direct2D version required is %1.%2.%3.%4. The Direct2D version on th
     <name>QWorkspace</name>
     <message>
         <source>&Restore</source>
-        <translation type="vanished">&Restaurar</translation>
+        <translation>&Restaurar</translation>
     </message>
     <message>
         <source>&Move</source>
-        <translation type="vanished">&Mover</translation>
+        <translation>&Mover</translation>
     </message>
     <message>
         <source>&Size</source>
-        <translation type="vanished">Tamanho (&S)</translation>
+        <translation>Tamanho (&S)</translation>
     </message>
     <message>
         <source>Mi&nimize</source>
-        <translation type="vanished">Mi&nimizar</translation>
+        <translation>Mi&nimizar</translation>
     </message>
     <message>
         <source>Ma&ximize</source>
-        <translation type="vanished">Ma&ximizar</translation>
+        <translation>Ma&ximizar</translation>
     </message>
     <message>
         <source>&Close</source>
-        <translation type="vanished">Fe&char</translation>
+        <translation>Fe&char</translation>
     </message>
     <message>
         <source>Stay on &Top</source>
-        <translation type="vanished">Ficar no &Topo</translation>
+        <translation>Ficar no &Topo</translation>
     </message>
     <message>
         <source>Sh&ade</source>
-        <translation type="vanished">Sombre&ar</translation>
+        <translation>Sombre&ar</translation>
     </message>
     <message>
         <source>%1 - [%2]</source>
-        <translation type="vanished">%1 - [%2]</translation>
+        <translation>%1 - [%2]</translation>
     </message>
     <message>
         <source>Minimize</source>
-        <translation type="vanished">Minimizar</translation>
+        <translation>Minimizar</translation>
     </message>
     <message>
         <source>Restore Down</source>
-        <translation type="vanished">Restaurar Abaixo</translation>
+        <translation>Restaurar Abaixo</translation>
     </message>
     <message>
         <source>Close</source>
-        <translation type="vanished">Fechar</translation>
+        <translation>Fechar</translation>
     </message>
     <message>
         <source>&Unshade</source>
-        <translation type="vanished">Remover Sombreamento (&U)</translation>
+        <translation>Remover Sombreamento (&U)</translation>
     </message>
 </context>
 <context>
@@ -8712,7 +4555,7 @@ The minimum Direct2D version required is %1.%2.%3.%4. The Direct2D version on th
     </message>
     <message>
         <source>Attribute redefined.</source>
-        <translation type="vanished">Atributo redefinido.</translation>
+        <translation>Atributo redefinido.</translation>
     </message>
     <message>
         <source>Unexpected character '%1' in public id literal.</source>
@@ -8830,660 +4673,656 @@ The minimum Direct2D version required is %1.%2.%3.%4. The Direct2D version on th
         <source>%1 is an invalid PUBLIC identifier.</source>
         <translation>%1 é um identificador PUBLIC inválido.</translation>
     </message>
-    <message>
-        <source>Attribute '%1' redefined.</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>QtXmlPatterns</name>
     <message>
         <source>An %1-attribute with value %2 has already been declared.</source>
-        <translation type="vanished">Um atributo %1 com o valor %2 já foi declarado.</translation>
+        <translation>Um atributo %1 com o valor %2 já foi declarado.</translation>
     </message>
     <message>
         <source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source>
-        <translation type="vanished">Um atributo %1 deve possuir um valor %2 válido, que %3 não possui.</translation>
+        <translation>Um atributo %1 deve possuir um valor %2 válido, que %3 não possui.</translation>
     </message>
     <message>
         <source>Network timeout.</source>
-        <translation type="vanished">Timeout de rede.</translation>
+        <translation>Timeout de rede.</translation>
     </message>
     <message>
         <source>Element %1 can't be serialized because it appears outside the document element.</source>
-        <translation type="vanished">O elemento %1 não pode ser serializado porque parece estar fora do elemento do documento.</translation>
+        <translation>O elemento %1 não pode ser serializado porque parece estar fora do elemento do documento.</translation>
     </message>
     <message>
         <source>Attribute %1 can't be serialized because it appears at the top level.</source>
-        <translation type="vanished">O atributo %1 não pode ser serializado porque está no nível mais alto.</translation>
+        <translation>O atributo %1 não pode ser serializado porque está no nível mais alto.</translation>
     </message>
     <message>
         <source>Year %1 is invalid because it begins with %2.</source>
-        <translation type="vanished">O ano %1 é inválido porque começa com %2.</translation>
+        <translation>O ano %1 é inválido porque começa com %2.</translation>
     </message>
     <message>
         <source>Day %1 is outside the range %2..%3.</source>
-        <translation type="vanished">O dia %1 está fora da faixa %2..%3.</translation>
+        <translation>O dia %1 está fora da faixa %2..%3.</translation>
     </message>
     <message>
         <source>Month %1 is outside the range %2..%3.</source>
-        <translation type="vanished">O mês %1 está fora da faixa %2..%3.</translation>
+        <translation>O mês %1 está fora da faixa %2..%3.</translation>
     </message>
     <message>
         <source>Overflow: Can't represent date %1.</source>
-        <translation type="vanished">Valor máximo excedido: Não é possível representar a data %1.</translation>
+        <translation>Valor máximo excedido: Não é possível representar a data %1.</translation>
     </message>
     <message>
         <source>Day %1 is invalid for month %2.</source>
-        <translation type="vanished">O dia %1 é inválido para o mês %2.</translation>
+        <translation>O dia %1 é inválido para o mês %2.</translation>
     </message>
     <message>
         <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
-        <translation type="vanished">A hora 24:%1:%2:%3 é inválida.A hora é 24, mas os minutos, segundos e milissegundos não são todos 0;</translation>
+        <translation>A hora 24:%1:%2:%3 é inválida.A hora é 24, mas os minutos, segundos e milissegundos não são todos 0;</translation>
     </message>
     <message>
         <source>Time %1:%2:%3.%4 is invalid.</source>
-        <translation type="vanished">A hora %1:%2:%3.%4 é inválida.</translation>
+        <translation>A hora %1:%2:%3.%4 é inválida.</translation>
     </message>
     <message>
         <source>Overflow: Date can't be represented.</source>
-        <translation type="vanished">Valor máximo excedido: a data não pode ser representada.</translation>
+        <translation>Valor máximo excedido: a data não pode ser representada.</translation>
     </message>
     <message>
         <source>At least one component must be present.</source>
-        <translation type="vanished">Ao menos um componente deve estar presente.</translation>
+        <translation>Ao menos um componente deve estar presente.</translation>
     </message>
     <message>
         <source>At least one time component must appear after the %1-delimiter.</source>
-        <translation type="vanished">Ao menos um componente de tempo deve aparecer após o delimitador %1.</translation>
+        <translation>Ao menos um componente de tempo deve aparecer após o delimitador %1.</translation>
     </message>
     <message>
         <source>No operand in an integer division, %1, can be %2.</source>
-        <translation type="vanished">Nenhum operando presente na operação de divisão de inteiros, %1, pode ser %2.</translation>
+        <translation>Nenhum operando presente na operação de divisão de inteiros, %1, pode ser %2.</translation>
     </message>
     <message>
         <source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
-        <translation type="vanished">O primeiro operando em uma divisão de inteiros, %1, não pode ser infinito (%2).</translation>
+        <translation>O primeiro operando em uma divisão de inteiros, %1, não pode ser infinito (%2).</translation>
     </message>
     <message>
         <source>The second operand in a division, %1, cannot be zero (%2).</source>
-        <translation type="vanished">O segundo operando em uma divisão, %1, não pode ser zero (%2).</translation>
+        <translation>O segundo operando em uma divisão, %1, não pode ser zero (%2).</translation>
     </message>
     <message>
         <source>%1 is not a valid value of type %2.</source>
-        <translation type="vanished">%1 não é um valor válido para o tipo %2.</translation>
+        <translation>%1 não é um valor válido para o tipo %2.</translation>
     </message>
     <message>
         <source>When casting to %1 from %2, the source value cannot be %3.</source>
-        <translation type="vanished">Ao converter para %1 de %2, o valor de origem não pode ser %3.</translation>
+        <translation>Ao converter para %1 de %2, o valor de origem não pode ser %3.</translation>
     </message>
     <message>
         <source>Integer division (%1) by zero (%2) is undefined.</source>
-        <translation type="vanished">A divisão de inteiros (%1) por zero (%2) é indefinida.</translation>
+        <translation>A divisão de inteiros (%1) por zero (%2) é indefinida.</translation>
     </message>
     <message>
         <source>Division (%1) by zero (%2) is undefined.</source>
-        <translation type="vanished">A divisão (%1) por zero (%2) é indefinida.</translation>
+        <translation>A divisão (%1) por zero (%2) é indefinida.</translation>
     </message>
     <message>
         <source>Modulus division (%1) by zero (%2) is undefined.</source>
-        <translation type="vanished">O divisão de módulo (%1) por zero (%2) é indefinida.</translation>
+        <translation>O divisão de módulo (%1) por zero (%2) é indefinida.</translation>
     </message>
     <message>
         <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
-        <translation type="vanished">Dividir um valor do tipo %1 por %2 (que não é um número) não é permitido.</translation>
+        <translation>Dividir um valor do tipo %1 por %2 (que não é um número) não é permitido.</translation>
     </message>
     <message>
         <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
-        <translation type="vanished">Dividir um valor do tipo %1 por %2 ou %3 (mais ou menos zero) não é permitido.</translation>
+        <translation>Dividir um valor do tipo %1 por %2 ou %3 (mais ou menos zero) não é permitido.</translation>
     </message>
     <message>
         <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
-        <translation type="vanished">Multiplicação de um valor do tipo %1 por %2 ou %3 (mais ou menos infinito) não é permitido.</translation>
+        <translation>Multiplicação de um valor do tipo %1 por %2 ou %3 (mais ou menos infinito) não é permitido.</translation>
     </message>
     <message>
         <source>A value of type %1 cannot have an Effective Boolean Value.</source>
-        <translation type="vanished">Um valor do tipo %1 não pode ter um Valor Booleano Efetivo.</translation>
+        <translation>Um valor do tipo %1 não pode ter um Valor Booleano Efetivo.</translation>
     </message>
     <message>
         <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
-        <translation type="vanished">O Valor Booleano Efetivo não pode ser calculado por uma sequência contendo dois ou mais valores atômicos.</translation>
+        <translation>O Valor Booleano Efetivo não pode ser calculado por uma sequência contendo dois ou mais valores atômicos.</translation>
     </message>
     <message>
         <source>Value %1 of type %2 exceeds maximum (%3).</source>
-        <translation type="vanished">O valor %1 do tipo %2 excede o máximo (%3).</translation>
+        <translation>O valor %1 do tipo %2 excede o máximo (%3).</translation>
     </message>
     <message>
         <source>Value %1 of type %2 is below minimum (%3).</source>
-        <translation type="vanished">O valor %1 do tipo %2 está abaixo do mínimo (%3).</translation>
+        <translation>O valor %1 do tipo %2 está abaixo do mínimo (%3).</translation>
     </message>
     <message>
         <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
-        <translation type="vanished">Um valor do tipo %1 deve conter um número par de dígitos. O valor %2 não atende a esta condição.</translation>
+        <translation>Um valor do tipo %1 deve conter um número par de dígitos. O valor %2 não atende a esta condição.</translation>
     </message>
     <message>
         <source>%1 is not valid as a value of type %2.</source>
-        <translation type="vanished">%1 não é válido com o valor do tipo %2.</translation>
+        <translation>%1 não é válido com o valor do tipo %2.</translation>
     </message>
     <message>
         <source>Operator %1 cannot be used on type %2.</source>
-        <translation type="vanished">O operador %1 não pode ser usado com o tipo %2.</translation>
+        <translation>O operador %1 não pode ser usado com o tipo %2.</translation>
     </message>
     <message>
         <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
-        <translation type="vanished">O operador %1 não pode ser usado em valores atômicos do tipo %2 e %3.</translation>
+        <translation>O operador %1 não pode ser usado em valores atômicos do tipo %2 e %3.</translation>
     </message>
     <message>
         <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
-        <translation type="vanished">A URI de namespace presente no nome de um atributo calculado não pode ser %1.</translation>
+        <translation>A URI de namespace presente no nome de um atributo calculado não pode ser %1.</translation>
     </message>
     <message>
         <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
-        <translation type="vanished">O nome de um atributo calculado não pode ter a URI de namespace %1 com o nome local %2.</translation>
+        <translation>O nome de um atributo calculado não pode ter a URI de namespace %1 com o nome local %2.</translation>
     </message>
     <message>
         <source>Type error in cast, expected %1, received %2.</source>
-        <translation type="vanished">Erro de conversão de tipo, esperado %1, recebido %2.</translation>
+        <translation>Erro de conversão de tipo, esperado %1, recebido %2.</translation>
     </message>
     <message>
         <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
-        <translation type="vanished">Ao converter para %1 ou tipos derivados dele, o valor de origem pode ser do mesmo tipo, ou deve ser uma string literal. O tipo %2 não é permitido.</translation>
+        <translation>Ao converter para %1 ou tipos derivados dele, o valor de origem pode ser do mesmo tipo, ou deve ser uma string literal. O tipo %2 não é permitido.</translation>
     </message>
     <message>
         <source>No casting is possible with %1 as the target type.</source>
-        <translation type="vanished">Conversão de tipos não é possível com %1 como tipo de destino.</translation>
+        <translation>Conversão de tipos não é possível com %1 como tipo de destino.</translation>
     </message>
     <message>
         <source>It is not possible to cast from %1 to %2.</source>
-        <translation type="vanished">Não é possível converter do tipo %1 para %2.</translation>
+        <translation>Não é possível converter do tipo %1 para %2.</translation>
     </message>
     <message>
         <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
-        <translation type="vanished">Converter para o tipo %1 não é possível porque este é um tipo abstrato, e não pode ser instanciado.</translation>
+        <translation>Converter para o tipo %1 não é possível porque este é um tipo abstrato, e não pode ser instanciado.</translation>
     </message>
     <message>
         <source>It's not possible to cast the value %1 of type %2 to %3</source>
-        <translation type="vanished">Não é possível converter o valor %1 do tipo %2 para %3</translation>
+        <translation>Não é possível converter o valor %1 do tipo %2 para %3</translation>
     </message>
     <message>
         <source>Failure when casting from %1 to %2: %3</source>
-        <translation type="vanished">Falha ao converter de %1 para %2: %3</translation>
+        <translation>Falha ao converter de %1 para %2: %3</translation>
     </message>
     <message>
         <source>A comment cannot contain %1</source>
-        <translation type="vanished">Um comentário não pode conter %1</translation>
+        <translation>Um comentário não pode conter %1</translation>
     </message>
     <message>
         <source>A comment cannot end with a %1.</source>
-        <translation type="vanished">Um comentário não pode terminar com %1.</translation>
+        <translation>Um comentário não pode terminar com %1.</translation>
     </message>
     <message>
         <source>No comparisons can be done involving the type %1.</source>
-        <translation type="vanished">Nenhuma comparação pode ser feita envolvendo o tipo %1.</translation>
+        <translation>Nenhuma comparação pode ser feita envolvendo o tipo %1.</translation>
     </message>
     <message>
         <source>Operator %1 is not available between atomic values of type %2 and %3.</source>
-        <translation type="vanished">O operador %1 não está disponível entre valores atômicos dos tipos %2 e %3.</translation>
+        <translation>O operador %1 não está disponível entre valores atômicos dos tipos %2 e %3.</translation>
     </message>
     <message>
         <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
-        <translation type="vanished">Um nó de atributo não pode ser filho de um nó de documento. Logo, o atributo %1 está fora do lugar.</translation>
+        <translation>Um nó de atributo não pode ser filho de um nó de documento. Logo, o atributo %1 está fora do lugar.</translation>
     </message>
     <message>
         <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
-        <translation type="vanished">Um módulo de biblioteca não pode ser interpretado diretamente. Ele deve ser importado a partir do módulo principal.</translation>
+        <translation>Um módulo de biblioteca não pode ser interpretado diretamente. Ele deve ser importado a partir do módulo principal.</translation>
     </message>
     <message>
         <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
-        <translation type="vanished">Um valor do tipo %1 não pode ser um predicado. Um predicado deve ter pelo menos um tipo numérico ou um tipo de Valor Efetivo Booleano.</translation>
+        <translation>Um valor do tipo %1 não pode ser um predicado. Um predicado deve ter pelo menos um tipo numérico ou um tipo de Valor Efetivo Booleano.</translation>
     </message>
     <message>
         <source>A positional predicate must evaluate to a single numeric value.</source>
-        <translation type="vanished">Um predicado posicional deve ser interpretado para um valor numérico simples.</translation>
+        <translation>Um predicado posicional deve ser interpretado para um valor numérico simples.</translation>
     </message>
     <message>
         <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
-        <translation type="vanished">O nome de destino em uma instrução de processamento não pode ser %1 em qualquer combinação de maiúsculas e minúsculas. Logo, %2 é inválido.</translation>
+        <translation>O nome de destino em uma instrução de processamento não pode ser %1 em qualquer combinação de maiúsculas e minúsculas. Logo, %2 é inválido.</translation>
     </message>
     <message>
         <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
-        <translation type="vanished">%1 não é um nome válido de destino em uma instrução de processamento. Deve ser um valor do tipo %2, como por exemplo %3.</translation>
+        <translation>%1 não é um nome válido de destino em uma instrução de processamento. Deve ser um valor do tipo %2, como por exemplo %3.</translation>
     </message>
     <message>
         <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
-        <translation type="vanished">O último passo em um caminho deve conter nós ou valores atômicos. Não pode ser uma mistura dos dois.</translation>
+        <translation>O último passo em um caminho deve conter nós ou valores atômicos. Não pode ser uma mistura dos dois.</translation>
     </message>
     <message>
         <source>The data of a processing instruction cannot contain the string %1</source>
-        <translation type="vanished">Os dados de uma instrução de processamento não podem conter a string %1</translation>
+        <translation>Os dados de uma instrução de processamento não podem conter a string %1</translation>
     </message>
     <message>
         <source>No namespace binding exists for the prefix %1</source>
-        <translation type="vanished">Não existe associação no namespace para o prefixo %1</translation>
+        <translation>Não existe associação no namespace para o prefixo %1</translation>
     </message>
     <message>
         <source>No namespace binding exists for the prefix %1 in %2</source>
-        <translation type="vanished">Não existe associação no namespace para o prefixo %1 em %2</translation>
+        <translation>Não existe associação no namespace para o prefixo %1 em %2</translation>
     </message>
     <message>
         <source>%1 is an invalid %2</source>
-        <translation type="vanished">%1 é um %2 inválido</translation>
+        <translation>%1 é um %2 inválido</translation>
     </message>
     <message numerus="yes">
         <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
-        <translation type="vanished">
+        <translation>
             <numerusform>%1 recebe no máximo %n argumento. %2 é portanto inválido.</numerusform>
             <numerusform>%1 recebe no máximo %n argumentos. %2 é portanto inválido.</numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
-        <translation type="vanished">
+        <translation>
             <numerusform>%1 requer no mínimo %n argumento. %2 é portanto inválido.</numerusform>
             <numerusform>%1 requer no mínimo %n argumentos. %2 é portanto inválido.</numerusform>
         </translation>
     </message>
     <message>
         <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
-        <translation type="vanished">O primeiro argumento de %1 não pode ser do tipo %2. Este argumento deve ser de um tipo numérico, xs:yearMonthDuration ou xs:dayTimeDuration.</translation>
+        <translation>O primeiro argumento de %1 não pode ser do tipo %2. Este argumento deve ser de um tipo numérico, xs:yearMonthDuration ou xs:dayTimeDuration.</translation>
     </message>
     <message>
         <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
-        <translation type="vanished">O primeiro argumento de %1 não pode ser do tipo %2. Este argumento deve ser do tipo %3, %4 ou %5.</translation>
+        <translation>O primeiro argumento de %1 não pode ser do tipo %2. Este argumento deve ser do tipo %3, %4 ou %5.</translation>
     </message>
     <message>
         <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
-        <translation type="vanished">O segundo argumento de %1 não pode ser do tipo %2. Este argumento deve ser do tipo %3, %4 ou %5.</translation>
+        <translation>O segundo argumento de %1 não pode ser do tipo %2. Este argumento deve ser do tipo %3, %4 ou %5.</translation>
     </message>
     <message>
         <source>%1 is not a valid XML 1.0 character.</source>
-        <translation type="vanished">%1 não é um caractere XML 1.0 válido.</translation>
+        <translation>%1 não é um caractere XML 1.0 válido.</translation>
     </message>
     <message>
         <source>The first argument to %1 cannot be of type %2.</source>
-        <translation type="vanished">O primeiro argumento de %1 não pode ser do tipo %2.</translation>
+        <translation>O primeiro argumento de %1 não pode ser do tipo %2.</translation>
     </message>
     <message>
         <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
-        <translation type="vanished">Se ambos os valores tiverem deslocamentos de zona, eles devem ter o mesmo deslocamento de zona. %1 e %2 não são os mesmos.</translation>
+        <translation>Se ambos os valores tiverem deslocamentos de zona, eles devem ter o mesmo deslocamento de zona. %1 e %2 não são os mesmos.</translation>
     </message>
     <message>
         <source>%1 was called.</source>
-        <translation type="vanished">%1 foi chamado.</translation>
+        <translation>%1 foi chamado.</translation>
     </message>
     <message>
         <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
-        <translation type="vanished">%1 deve ser seguido por %2 ou %3, não ao final da string de substituição.</translation>
+        <translation>%1 deve ser seguido por %2 ou %3, não ao final da string de substituição.</translation>
     </message>
     <message>
         <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
-        <translation type="vanished">Na string de substituição, %1 deve ser seguido por pelo menos um dígito quando não estiver utilizando sequências de escape.</translation>
+        <translation>Na string de substituição, %1 deve ser seguido por pelo menos um dígito quando não estiver utilizando sequências de escape.</translation>
     </message>
     <message>
         <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
-        <translation type="vanished">Na string de substituição, %1 só pode ser utilizada para fazer escape dela mesma ou %2, e não %3</translation>
+        <translation>Na string de substituição, %1 só pode ser utilizada para fazer escape dela mesma ou %2, e não %3</translation>
     </message>
     <message>
         <source>%1 matches newline characters</source>
-        <translation type="vanished">%1 coincide com caracteres de salto de linha</translation>
+        <translation>%1 coincide com caracteres de salto de linha</translation>
     </message>
     <message>
         <source>%1 and %2 match the start and end of a line.</source>
-        <translation type="vanished">%1 e %2 coincidem com o início e o fim de uma linha.</translation>
+        <translation>%1 e %2 coincidem com o início e o fim de uma linha.</translation>
     </message>
     <message>
         <source>Matches are case insensitive</source>
-        <translation type="vanished">As buscas não são sensíveis à caixa</translation>
+        <translation>As buscas não são sensíveis à caixa</translation>
     </message>
     <message>
         <source>Whitespace characters are removed, except when they appear in character classes</source>
-        <translation type="vanished">Caracteres embranco são removidos, exceto quando aparecerem em classes de caracteres</translation>
+        <translation>Caracteres embranco são removidos, exceto quando aparecerem em classes de caracteres</translation>
     </message>
     <message>
         <source>%1 is an invalid regular expression pattern: %2</source>
-        <translation type="vanished">%1 é um padrão inválido de expressão regular: %2</translation>
+        <translation>%1 é um padrão inválido de expressão regular: %2</translation>
     </message>
     <message>
         <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
-        <translation type="vanished">%1 é um atributo inválido para expressões regulares. Os atributos válidos são:</translation>
+        <translation>%1 é um atributo inválido para expressões regulares. Os atributos válidos são:</translation>
     </message>
     <message>
         <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
-        <translation type="vanished">Se o primeiro argumento é uma sequência vazia ou uma string de tamanho zero (sem namespace), um prefixo não pode ser espeficado. O prefixo %1 foi especificado.</translation>
+        <translation>Se o primeiro argumento é uma sequência vazia ou uma string de tamanho zero (sem namespace), um prefixo não pode ser espeficado. O prefixo %1 foi especificado.</translation>
     </message>
     <message>
         <source>It will not be possible to retrieve %1.</source>
-        <translation type="vanished">Não será possível recuperar %1.</translation>
+        <translation>Não será possível recuperar %1.</translation>
     </message>
     <message>
         <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
-        <translation type="vanished">O nó raiz do segundo argumento da função %1 deve ser um nó de documento. %2 não é um nó de documento.</translation>
+        <translation>O nó raiz do segundo argumento da função %1 deve ser um nó de documento. %2 não é um nó de documento.</translation>
     </message>
     <message>
         <source>The default collection is undefined</source>
-        <translation type="vanished">A coleção padrão está indefinida</translation>
+        <translation>A coleção padrão está indefinida</translation>
     </message>
     <message>
         <source>%1 cannot be retrieved</source>
-        <translation type="vanished">%1 não pode ser recuperado</translation>
+        <translation>%1 não pode ser recuperado</translation>
     </message>
     <message>
         <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
-        <translation type="vanished">A forma de normalização %1 não é suportada. As formas suportadas são %2, %3, %4 e %5 ou nenhuma. Neste último caso, uma string vazia (sem normalização).</translation>
+        <translation>A forma de normalização %1 não é suportada. As formas suportadas são %2, %3, %4 e %5 ou nenhuma. Neste último caso, uma string vazia (sem normalização).</translation>
     </message>
     <message>
         <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
-        <translation type="vanished">Um deslocamento de zona deve ser especificado dentro da faixa %1..%2 (inclusive). %3 está fora da faixa.</translation>
+        <translation>Um deslocamento de zona deve ser especificado dentro da faixa %1..%2 (inclusive). %3 está fora da faixa.</translation>
     </message>
     <message>
         <source>%1 is not a whole number of minutes.</source>
-        <translation type="vanished">%1 não é um número inteiro de minutos.</translation>
+        <translation>%1 não é um número inteiro de minutos.</translation>
     </message>
     <message>
         <source>Required cardinality is %1; got cardinality %2.</source>
-        <translation type="vanished">A cardinalidade requerida é de %1; a cardinalidade atual é %2.</translation>
+        <translation>A cardinalidade requerida é de %1; a cardinalidade atual é %2.</translation>
     </message>
     <message>
         <source>The item %1 did not match the required type %2.</source>
-        <translation type="vanished">O item %1 não coincide com o tipo requerido %2.</translation>
+        <translation>O item %1 não coincide com o tipo requerido %2.</translation>
     </message>
     <message>
         <source>%1 is an unknown schema type.</source>
-        <translation type="vanished">%1 é um tipo desconhecido de schema.</translation>
+        <translation>%1 é um tipo desconhecido de schema.</translation>
     </message>
     <message>
         <source>Only one %1 declaration can occur in the query prolog.</source>
-        <translation type="vanished">Apenas uma declaração %1 pode ocorrer no prolog da solicitação.</translation>
+        <translation>Apenas uma declaração %1 pode ocorrer no prolog da solicitação.</translation>
     </message>
     <message>
         <source>The initialization of variable %1 depends on itself</source>
-        <translation type="vanished">A inicialização da variável %1 depende dela mesma</translation>
+        <translation>A inicialização da variável %1 depende dela mesma</translation>
     </message>
     <message>
         <source>No variable by name %1 exists</source>
-        <translation type="vanished">Nenhuma variável de nome %1 foi encontrada</translation>
+        <translation>Nenhuma variável de nome %1 foi encontrada</translation>
     </message>
     <message>
         <source>The variable %1 is unused</source>
-        <translation type="vanished">A variável %1 não é utilizada</translation>
+        <translation>A variável %1 não é utilizada</translation>
     </message>
     <message>
         <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
-        <translation type="vanished">A versão %1 não é suportada. A versão suportada do XQuery é 1.0.</translation>
+        <translation>A versão %1 não é suportada. A versão suportada do XQuery é 1.0.</translation>
     </message>
     <message>
         <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
-        <translation type="vanished">A codificação %1 é inválida. Ela deve conter caracteres Latinos apenas, não deve conter espaços em branco, e deve coincidir com a expressão regular %2.</translation>
+        <translation>A codificação %1 é inválida. Ela deve conter caracteres Latinos apenas, não deve conter espaços em branco, e deve coincidir com a expressão regular %2.</translation>
     </message>
     <message>
         <source>No function with signature %1 is available</source>
-        <translation type="vanished">Nenhuma função com a assinatura %1 está disponível</translation>
+        <translation>Nenhuma função com a assinatura %1 está disponível</translation>
     </message>
     <message>
         <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
-        <translation type="vanished">Uma declaração padrão de namespace deve ocorrer antes das declarações de funções, variáveis ou opções.</translation>
+        <translation>Uma declaração padrão de namespace deve ocorrer antes das declarações de funções, variáveis ou opções.</translation>
     </message>
     <message>
         <source>Namespace declarations must occur before function, variable, and option declarations.</source>
-        <translation type="vanished">As declarações de namespace devem ocorrer antes das declarações de funções, variáveis ou opções.</translation>
+        <translation>As declarações de namespace devem ocorrer antes das declarações de funções, variáveis ou opções.</translation>
     </message>
     <message>
         <source>Module imports must occur before function, variable, and option declarations.</source>
-        <translation type="vanished">A importação de módulos deve ocorrer antes das declarações de funções, variáveis ou opções.</translation>
+        <translation>A importação de módulos deve ocorrer antes das declarações de funções, variáveis ou opções.</translation>
     </message>
     <message>
         <source>It is not possible to redeclare prefix %1.</source>
-        <translation type="vanished">Não é possível redeclarar o prefixo %1.</translation>
+        <translation>Não é possível redeclarar o prefixo %1.</translation>
+    </message>
+    <message>
+        <source>Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1.</source>
+        <translation>Apenas o prefixo %1 pode ser declarado para se associar ao namespace %2. Por padrão, este namespace já é associado ao prefixo %1.</translation>
     </message>
     <message>
         <source>Prefix %1 is already declared in the prolog.</source>
-        <translation type="vanished">O prefixo %1 já está declarado no prolog.</translation>
+        <translation>O prefixo %1 já está declarado no prolog.</translation>
     </message>
     <message>
         <source>The name of an option must have a prefix. There is no default namespace for options.</source>
-        <translation type="vanished">O nome de uma opção deve conter um prefixo. Não existe namespace padrão para opções.</translation>
+        <translation>O nome de uma opção deve conter um prefixo. Não existe namespace padrão para opções.</translation>
     </message>
     <message>
         <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
-        <translation type="vanished">O recurso de Importação de Schema não é suportado, logo as declarações do tipo %1 não podem ocorrer.</translation>
+        <translation>O recurso de Importação de Schema não é suportado, logo as declarações do tipo %1 não podem ocorrer.</translation>
     </message>
     <message>
         <source>The target namespace of a %1 cannot be empty.</source>
-        <translation type="vanished">O namespace de destino de um %1 não pode ser vazio.</translation>
+        <translation>O namespace de destino de um %1 não pode ser vazio.</translation>
     </message>
     <message>
         <source>The module import feature is not supported</source>
-        <translation type="vanished">O recurso de importação de módulos não é suportado</translation>
+        <translation>O recurso de importação de módulos não é suportado</translation>
+    </message>
+    <message>
+        <source>A variable by name %1 has already been declared in the prolog.</source>
+        <translation>Uma variável de nome %1 já foi declarada no prolog.</translation>
     </message>
     <message>
         <source>No value is available for the external variable by name %1.</source>
-        <translation type="vanished">Não há valor disponível para a variável externa de nome %1.</translation>
+        <translation>Não há valor disponível para a variável externa de nome %1.</translation>
     </message>
     <message>
         <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
-        <translation type="vanished">O namespace de uma função definida pelo usuário não pode ser vazio (tente usar o prefixo pré-definido %1 que existe para casos como estes)</translation>
+        <translation>O namespace de uma função definida pelo usuário não pode ser vazio (tente usar o prefixo pré-definido %1 que existe para casos como estes)</translation>
     </message>
     <message>
         <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
-        <translation type="vanished">O namespace %1 é reservado; logo funções definidas pelo usu[ario não podem usá-lo. Tente utilizar o prefixo pré-definido %2, que existe para estes casos.</translation>
+        <translation>O namespace %1 é reservado; logo funções definidas pelo usu[ario não podem usá-lo. Tente utilizar o prefixo pré-definido %2, que existe para estes casos.</translation>
     </message>
     <message>
         <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
-        <translation type="vanished">O namespace de uma função definida pelo usuário em um módulo de biblioteca deve ser equivalente ao namespace do módulo. Em outras palavras, ele deve ser %1 ao invés de %2</translation>
+        <translation>O namespace de uma função definida pelo usuário em um módulo de biblioteca deve ser equivalente ao namespace do módulo. Em outras palavras, ele deve ser %1 ao invés de %2</translation>
     </message>
     <message>
         <source>A function already exists with the signature %1.</source>
-        <translation type="vanished">Uma função já existe com a assinatura %1.</translation>
+        <translation>Uma função já existe com a assinatura %1.</translation>
     </message>
     <message>
         <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
-        <translation type="vanished">Funções externas não são suportadas. Todas as funções suportadas podem ser utilizadas diretamente, sem declará-las primeiro como externas</translation>
+        <translation>Funções externas não são suportadas. Todas as funções suportadas podem ser utilizadas diretamente, sem declará-las primeiro como externas</translation>
     </message>
     <message>
         <source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
-        <translation type="vanished">Um argumento de nome %1 já foi declarado. Cada nome de argumento deve ser único.</translation>
+        <translation>Um argumento de nome %1 já foi declarado. Cada nome de argumento deve ser único.</translation>
     </message>
     <message>
         <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
-        <translation type="vanished">O nome de uma variável associada a uma expressão 'for' deve ser diferente da variável posicional. Logo, duas variáveis chamadas de %1 geram conflito.</translation>
+        <translation>O nome de uma variável associada a uma expressão 'for' deve ser diferente da variável posicional. Logo, duas variáveis chamadas de %1 geram conflito.</translation>
     </message>
     <message>
         <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
-        <translation type="vanished">O Recurso de Validação de Schemas não é suportado. Logo, expressões do tipo %1 não podem ser utilizadas.</translation>
+        <translation>O Recurso de Validação de Schemas não é suportado. Logo, expressões do tipo %1 não podem ser utilizadas.</translation>
     </message>
     <message>
         <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
-        <translation type="vanished">Expressões do tipo 'pragma' não são suportadas. Logo, uma expressão de fallback deve estar presente</translation>
+        <translation>Expressões do tipo 'pragma' não são suportadas. Logo, uma expressão de fallback deve estar presente</translation>
     </message>
     <message>
         <source>The %1-axis is unsupported in XQuery</source>
-        <translation type="vanished">O eixo %1 não é suportado no XQuery</translation>
+        <translation>O eixo %1 não é suportado no XQuery</translation>
     </message>
     <message>
         <source>%1 is not a valid numeric literal.</source>
-        <translation type="vanished">%1 não é um literal numérico válido.</translation>
+        <translation>%1 não é um literal numérico válido.</translation>
     </message>
     <message>
         <source>No function by name %1 is available.</source>
-        <translation type="vanished">Nenhuma função de nome %1 está disponível.</translation>
+        <translation>Nenhuma função de nome %1 está disponível.</translation>
     </message>
     <message>
         <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
-        <translation type="vanished">A URI do namespace não pode ser uma string vazia quando estiver se associando a um prefixo, %1.</translation>
+        <translation>A URI do namespace não pode ser uma string vazia quando estiver se associando a um prefixo, %1.</translation>
     </message>
     <message>
         <source>%1 is an invalid namespace URI.</source>
-        <translation type="vanished">%1 é uma URI de namespace inválida.</translation>
+        <translation>%1 é uma URI de namespace inválida.</translation>
     </message>
     <message>
         <source>It is not possible to bind to the prefix %1</source>
-        <translation type="vanished">Não é possível se associar ao prefixo %1</translation>
+        <translation>Não é possível se associar ao prefixo %1</translation>
     </message>
     <message>
         <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
-        <translation type="vanished">O namespace %1 somente pode ser associado a %2 (e já é associado, pois é pré-declarado assim).</translation>
+        <translation>O namespace %1 somente pode ser associado a %2 (e já é associado, pois é pré-declarado assim).</translation>
     </message>
     <message>
         <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
-        <translation type="vanished">O prefixo %1 somente pode ser associado a %2 (e já é associado, pois é pré-declarado).</translation>
+        <translation>O prefixo %1 somente pode ser associado a %2 (e já é associado, pois é pré-declarado).</translation>
     </message>
     <message>
         <source>Two namespace declaration attributes have the same name: %1.</source>
-        <translation type="vanished">Duas declarações de atributos de namespaces possuem o mesmo nome: %1.</translation>
+        <translation>Duas declarações de atributos de namespaces possuem o mesmo nome: %1.</translation>
     </message>
     <message>
         <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
-        <translation type="vanished">A URI do namespace deve ser uma constante e não pode utilizar expressões embutidas.</translation>
+        <translation>A URI do namespace deve ser uma constante e não pode utilizar expressões embutidas.</translation>
     </message>
     <message>
         <source>An attribute by name %1 has already appeared on this element.</source>
-        <translation type="vanished">Um atributo de nome %1 já apareceu neste elemento.</translation>
+        <translation>Um atributo de nome %1 já apareceu neste elemento.</translation>
     </message>
     <message>
         <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
-        <translation type="vanished">Um construtor de elemento direto não está formado corretamente. %1 é finalizado com %2.</translation>
+        <translation>Um construtor de elemento direto não está formado corretamente. %1 é finalizado com %2.</translation>
     </message>
     <message>
         <source>The name %1 does not refer to any schema type.</source>
-        <translation type="vanished">O nome %1 não se refere a nenhum tipo de schema.</translation>
+        <translation>O nome %1 não se refere a nenhum tipo de schema.</translation>
     </message>
     <message>
         <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
-        <translation type="vanished">%1 é um tipo complexo. Conversão para tipos complexos não é possível. No entanto, a conversão para tipos atômicos como %2 funciona.</translation>
+        <translation>%1 é um tipo complexo. Conversão para tipos complexos não é possível. No entanto, a conversão para tipos atômicos como %2 funciona.</translation>
     </message>
     <message>
         <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
-        <translation type="vanished">%1 não é um tipo atômico. A conversão somente é possível para tipos atômicos.</translation>
+        <translation>%1 não é um tipo atômico. A conversão somente é possível para tipos atômicos.</translation>
+    </message>
+    <message>
+        <source>%1 is not a valid name for a processing-instruction. Therefore this name test will never match.</source>
+        <translation>%1 não é um nome válido para uma instrução de processamento. Logo, este teste de nome nunca irá coincidir.</translation>
     </message>
     <message>
         <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
-        <translation type="vanished">%1 não está no escopo de declarações de atributos. Lembre-se de que o recurso de importação de schemas não é suportado.</translation>
+        <translation>%1 não está no escopo de declarações de atributos. Lembre-se de que o recurso de importação de schemas não é suportado.</translation>
     </message>
     <message>
         <source>The name of an extension expression must be in a namespace.</source>
-        <translation type="vanished">O nome de uma expressão de extensão deve estar contido em um namespace.</translation>
+        <translation>O nome de uma expressão de extensão deve estar contido em um namespace.</translation>
     </message>
     <message>
         <source>empty</source>
-        <translation type="vanished">vazio</translation>
+        <translation>vazio</translation>
     </message>
     <message>
         <source>zero or one</source>
-        <translation type="vanished">zero ou um</translation>
+        <translation>zero ou um</translation>
     </message>
     <message>
         <source>exactly one</source>
-        <translation type="vanished">exatamente um</translation>
+        <translation>exatamente um</translation>
     </message>
     <message>
         <source>one or more</source>
-        <translation type="vanished">um ou mais</translation>
+        <translation>um ou mais</translation>
     </message>
     <message>
         <source>zero or more</source>
-        <translation type="vanished">zero ou mais</translation>
+        <translation>zero ou mais</translation>
     </message>
     <message>
         <source>Required type is %1, but %2 was found.</source>
-        <translation type="vanished">O tipo requerido é %1, mas %2 foi encontrado.</translation>
+        <translation>O tipo requerido é %1, mas %2 foi encontrado.</translation>
     </message>
     <message>
         <source>Promoting %1 to %2 may cause loss of precision.</source>
-        <translation type="vanished">Promover %1 a %2 pode causar perda de precisão.</translation>
+        <translation>Promover %1 a %2 pode causar perda de precisão.</translation>
     </message>
     <message>
         <source>The focus is undefined.</source>
-        <translation type="vanished">O foco está indefinido.</translation>
+        <translation>O foco está indefinido.</translation>
     </message>
     <message>
         <source>It's not possible to add attributes after any other kind of node.</source>
-        <translation type="vanished">Não é possível acrescentar atributos após qualquer outro tipo de nó.</translation>
+        <translation>Não é possível acrescentar atributos após qualquer outro tipo de nó.</translation>
     </message>
     <message>
         <source>An attribute by name %1 has already been created.</source>
-        <translation type="vanished">Um atributo de nome %1 já foi criado.</translation>
+        <translation>Um atributo de nome %1 já foi criado.</translation>
     </message>
     <message>
         <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
-        <translation type="vanished">Apenas o Ordenamento de Códigos Unicode é suportado(%1). %2 não é suportado.</translation>
-    </message>
-    <message>
-        <source>Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1.</source>
-        <translation type="vanished">Apenas o prefixo %1 pode ser declarado para se associar ao namespace %2. Por padrão, este namespace já é associado ao prefixo %1.</translation>
-    </message>
-    <message>
-        <source>A variable by name %1 has already been declared in the prolog.</source>
-        <translation type="vanished">Uma variável de nome %1 já foi declarada no prolog.</translation>
-    </message>
-    <message>
-        <source>%1 is not a valid name for a processing-instruction. Therefore this name test will never match.</source>
-        <translation type="vanished">%1 não é um nome válido para uma instrução de processamento. Logo, este teste de nome nunca irá coincidir.</translation>
+        <translation>Apenas o Ordenamento de Códigos Unicode é suportado(%1). %2 não é suportado.</translation>
     </message>
 </context>
 <context>
     <name>VolumeSlider</name>
     <message>
         <source>Muted</source>
-        <translation type="vanished">Mudo</translation>
+        <translation>Mudo</translation>
     </message>
     <message>
         <source>Volume: %1%</source>
-        <translation type="vanished">Volume: %1%</translation>
+        <translation>Volume: %1%</translation>
     </message>
 </context>
 <context>
     <name>WebCore::PlatformScrollbar</name>
     <message>
         <source>Scroll here</source>
-        <translation type="vanished">Role aqui</translation>
+        <translation>Role aqui</translation>
     </message>
     <message>
         <source>Left edge</source>
-        <translation type="vanished">Canto esquerdo</translation>
+        <translation>Canto esquerdo</translation>
     </message>
     <message>
         <source>Top</source>
-        <translation type="vanished">Topo</translation>
+        <translation>Topo</translation>
     </message>
     <message>
         <source>Right edge</source>
-        <translation type="vanished">Canto Direito</translation>
+        <translation>Canto Direito</translation>
     </message>
     <message>
         <source>Bottom</source>
-        <translation type="vanished">Fundo</translation>
+        <translation>Fundo</translation>
     </message>
     <message>
         <source>Page left</source>
-        <translation type="vanished">Página à esquerda</translation>
+        <translation>Página à esquerda</translation>
     </message>
     <message>
         <source>Page up</source>
-        <translation type="vanished">Página para cima</translation>
+        <translation>Página para cima</translation>
     </message>
     <message>
         <source>Page right</source>
-        <translation type="vanished">Página para direita</translation>
+        <translation>Página para direita</translation>
     </message>
     <message>
         <source>Page down</source>
-        <translation type="vanished">Página para baixo</translation>
+        <translation>Página para baixo</translation>
     </message>
     <message>
         <source>Scroll left</source>
-        <translation type="vanished">Rolar para esquerda</translation>
+        <translation>Rolar para esquerda</translation>
     </message>
     <message>
         <source>Scroll up</source>
-        <translation type="vanished">Rolar para cima</translation>
+        <translation>Rolar para cima</translation>
     </message>
     <message>
         <source>Scroll right</source>
-        <translation type="vanished">Rolar para direita</translation>
+        <translation>Rolar para direita</translation>
     </message>
     <message>
         <source>Scroll down</source>
-        <translation type="vanished">Rolar para baixo</translation>
+        <translation>Rolar para baixo</translation>
     </message>
 </context>
 </TS>
diff --git a/src/VBox/Frontends/VirtualBox/src/UITakeSnapshotDialog.cpp b/src/VBox/Frontends/VirtualBox/src/UITakeSnapshotDialog.cpp
index 744911b..f4157cc 100644
--- a/src/VBox/Frontends/VirtualBox/src/UITakeSnapshotDialog.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/UITakeSnapshotDialog.cpp
@@ -24,6 +24,7 @@
 # include <QLabel>
 # include <QLineEdit>
 # include <QPushButton>
+# include <QStyle>
 
 /* GUI includes: */
 # include "QIDialogButtonBox.h"
@@ -100,7 +101,8 @@ void UITakeSnapshotDialog::prepare()
     AssertPtrReturnVoid(pLayout);
     {
         /* Configure layout: */
-        pLayout->setSpacing(20);
+        const int iS0 = qApp->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) * 2;
+        pLayout->setSpacing(iS0);
 
         /* Create sub-layout: */
         QVBoxLayout *pSubLayout1 = new QVBoxLayout;
@@ -129,7 +131,8 @@ void UITakeSnapshotDialog::prepare()
         AssertPtrReturnVoid(pSubLayout2);
         {
             /* Configure layout: */
-            pSubLayout2->setSpacing(10);
+            const int iS2 = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+            pSubLayout2->setSpacing(iS2);
 
             /* Create name label: */
             m_pLabelName = new QLabel;
@@ -161,7 +164,8 @@ void UITakeSnapshotDialog::prepare()
         AssertPtrReturnVoid(pSubLayout3);
         {
             /* Configure layout: */
-            pSubLayout3->setSpacing(10);
+            const int iS3 = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+            pSubLayout3->setSpacing(iS3);
 
             /* Create description label: */
             m_pLabelDescription = new QLabel;
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.cpp b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.cpp
index 1e7ff21..0168add 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.cpp
@@ -235,7 +235,8 @@ void QIArrowSplitter::prepare()
     {
         /* Configure main-layout: */
         m_pMainLayout->setContentsMargins(0, 0, 0, 0);
-        m_pMainLayout->setSpacing(3);
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+        m_pMainLayout->setSpacing(iS);
         /* Create button-layout: */
         QHBoxLayout *pButtonLayout = new QHBoxLayout;
         AssertPtrReturnVoid(pButtonLayout);
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.cpp b/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.cpp
index baf5c05..6b1cb33 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.cpp
@@ -60,6 +60,7 @@ void QIManagerDialogFactory::cleanup(QIManagerDialog *&pDialog)
 
 QIManagerDialog::QIManagerDialog(QWidget *pCenterWidget)
     : pCenterWidget(pCenterWidget)
+    , m_fCloseEmitted(false)
     , m_pWidget(0)
     , m_pWidgetMenu(0)
 #ifdef VBOX_WS_MAC
@@ -214,7 +215,11 @@ void QIManagerDialog::closeEvent(QCloseEvent *pEvent)
 {
     /* Ignore the event itself: */
     pEvent->ignore();
-    /* But tell the listener to close us: */
-    emit sigClose();
+    /* But tell the listener to close us (once): */
+    if (!m_fCloseEmitted)
+    {
+        m_fCloseEmitted = true;
+        emit sigClose();
+    }
 }
 
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.h
index 43c3b00..c8be147 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIManagerDialog.h
@@ -163,6 +163,9 @@ private:
       * @{ */
         /** Holds the widget reference to center Host Network Manager according. */
         QWidget *pCenterWidget;
+
+        /** Holds whether the manager had emitted command to be closed. */
+        bool m_fCloseEmitted;
     /** @} */
 
     /** @name Widget stuff.
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp
index 271038e..a999ffb 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.cpp
@@ -180,7 +180,6 @@ void QIMessageBox::prepare()
         {
             /* Configure top-layout: */
             pTopLayout->setContentsMargins(0, 0, 0, 0);
-            pTopLayout->setSpacing(10);
             /* Create icon-label: */
             m_pLabelIcon = new QLabel;
             AssertPtrReturnVoid(m_pLabelIcon);
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp
index 3d256cd..cec73bc 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.cpp
@@ -244,15 +244,9 @@ void UIIconPool::addName(QIcon &icon, const QString &strName,
     icon.addPixmap(pixmap, mode, state);
 
 #ifdef VBOX_WS_MAC
-# ifdef VBOX_GUI_WITH_HIDPI
-    /* Test if HiDPI icons are enabled. Works only with a patched version of Qt 4.x
-     * with the changes from https://codereview.qt-project.org/#change,54636 applied. */
+    /* Test if HiDPI icons are enabled: */
     if (!qApp->testAttribute(Qt::AA_UseHighDpiPixmaps))
         return;
-# else /* !VBOX_GUI_WITH_HIDPI */
-    /* Otherwise HiDPI icons are useless: */
-    return;
-# endif /* !VBOX_GUI_WITH_HIDPI */
 #endif /* VBOX_WS_MAC */
 
     /* Parse name to prefix and suffix: */
diff --git a/src/VBox/Frontends/VirtualBox/src/hostnetwork/UIHostNetworkManager.cpp b/src/VBox/Frontends/VirtualBox/src/hostnetwork/UIHostNetworkManager.cpp
index 184a927..07f04a4 100644
--- a/src/VBox/Frontends/VirtualBox/src/hostnetwork/UIHostNetworkManager.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/hostnetwork/UIHostNetworkManager.cpp
@@ -814,7 +814,8 @@ void UIHostNetworkManagerWidget::prepareWidgets()
 #ifdef VBOX_WS_MAC
         layout()->setSpacing(10);
 #else
-        layout()->setSpacing(4);
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+        layout()->setSpacing(iS);
 #endif
 
         /* Prepare toolbar: */
diff --git a/src/VBox/Frontends/VirtualBox/src/main.cpp b/src/VBox/Frontends/VirtualBox/src/main.cpp
index 4776ee6..0f6083f 100644
--- a/src/VBox/Frontends/VirtualBox/src/main.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/main.cpp
@@ -411,12 +411,8 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char ** /*envp*/)
 #endif /* VBOX_WS_WIN */
 
 #ifdef VBOX_WS_MAC
-# ifdef VBOX_GUI_WITH_HIDPI
-        /* Enable HiDPI icons.
-         * For this we require a patched version of Qt 4.x with
-         * the changes from https://codereview.qt-project.org/#change,54636 applied. */
+        /* Enable HiDPI icons: */
         a.setAttribute(Qt::AA_UseHighDpiPixmaps);
-# endif /* VBOX_GUI_WITH_HIDPI */
 
         /* Disable menu icons on MacOS X host: */
         ::darwinDisableIconsInMenus();
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
index 841d2e2..999fbaf 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
@@ -1521,7 +1521,8 @@ void UIMediumManagerWidget::prepareWidgets()
 #ifdef VBOX_WS_MAC
         layout()->setSpacing(10);
 #else
-        layout()->setSpacing(4);
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+        layout()->setSpacing(iS);
 #endif
 
         /* Prepare toolbar: */
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 d0b73ab..7cdd342 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
@@ -90,13 +90,11 @@ NativeNSImageRef darwinToNSImageRef(const QImage *pImage)
     CGImageRef pCGImage = ::darwinToCGImageRef(pImage);
     NativeNSImageRef pNSImage = ::darwinToNSImageRef(pCGImage);
     CGImageRelease(pCGImage);
-#ifdef VBOX_GUI_WITH_HIDPI
     /* Apply device pixel ratio: */
     double dScaleFactor = pImage->devicePixelRatio();
     NSSize imageSize = { (CGFloat)pImage->width() / dScaleFactor,
                          (CGFloat)pImage->height() / dScaleFactor };
     [pNSImage setSize:imageSize];
-#endif /* VBOX_GUI_WITH_HIDPI */
     /* Return result: */
     return pNSImage;
 }
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
index e217097..15925e2 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
@@ -1520,16 +1520,14 @@ void UIFrameBufferPrivate::eraseImageRect(QPainter &painter, const QRect &rect,
         }
 
 #ifdef VBOX_WS_MAC
-# ifdef VBOX_GUI_WITH_HIDPI
         /* Should we
-         * do not perform logical HiDPI scaling or
+         * not perform logical HiDPI scaling or
          * perform logical HiDPI scaling and optimize it for performance? */
         if (fUseUnscaledHiDPIOutput || hiDPIOptimizationType == HiDPIOptimizationType_Performance)
         {
             /* Mark sub-pixmap as HiDPI: */
             subPixmap.setDevicePixelRatio(dBackingScaleFactor);
         }
-# endif /* VBOX_GUI_WITH_HIDPI */
 #endif /* VBOX_WS_MAC */
     }
 
@@ -1580,16 +1578,14 @@ void UIFrameBufferPrivate::drawImageRect(QPainter &painter, const QImage &image,
         }
 
 #ifdef VBOX_WS_MAC
-# ifdef VBOX_GUI_WITH_HIDPI
         /* Should we
-         * do not perform logical HiDPI scaling or
+         * not perform logical HiDPI scaling or
          * perform logical HiDPI scaling and optimize it for performance? */
         if (fUseUnscaledHiDPIOutput || hiDPIOptimizationType == HiDPIOptimizationType_Performance)
         {
             /* Mark sub-pixmap as HiDPI: */
             subPixmap.setDevicePixelRatio(dBackingScaleFactor);
         }
-# endif /* VBOX_GUI_WITH_HIDPI */
 #endif /* VBOX_WS_MAC */
     }
 
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp
index c30369c..d378797 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp
@@ -1285,7 +1285,8 @@ void UIIndicatorsPool::prepareContents()
     {
         /* Configure main-layout: */
         m_pMainLayout->setContentsMargins(0, 0, 0, 0);
-        m_pMainLayout->setSpacing(5);
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) / 2;
+        m_pMainLayout->setSpacing(iS);
         /* Update pool: */
         updatePool();
     }
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
index 51a59ce..b4429c9 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
@@ -1120,12 +1120,10 @@ void UIMachineView::takePausePixmapLive()
     /* Finally copy the screen-shot to pause-pixmap: */
     m_pausePixmap = QPixmap::fromImage(screenShot);
 #ifdef VBOX_WS_MAC
-# ifdef VBOX_GUI_WITH_HIDPI
     /* Adjust backing-scale-factor if necessary: */
     const double dBackingScaleFactor = frameBuffer()->backingScaleFactor();
     if (dBackingScaleFactor > 1.0 && frameBuffer()->useUnscaledHiDPIOutput())
         m_pausePixmap.setDevicePixelRatio(dBackingScaleFactor);
-# endif /* VBOX_GUI_WITH_HIDPI */
 #endif /* VBOX_WS_MAC */
 
     /* Update scaled pause pixmap: */
@@ -1157,12 +1155,10 @@ void UIMachineView::takePausePixmapSnapshot()
     /* Finally copy the screen-shot to pause-pixmap: */
     m_pausePixmap = QPixmap::fromImage(screenShot);
 #ifdef VBOX_WS_MAC
-# ifdef VBOX_GUI_WITH_HIDPI
     /* Adjust backing-scale-factor if necessary: */
     const double dBackingScaleFactor = frameBuffer()->backingScaleFactor();
     if (dBackingScaleFactor > 1.0 && frameBuffer()->useUnscaledHiDPIOutput())
         m_pausePixmap.setDevicePixelRatio(dBackingScaleFactor);
-# endif /* VBOX_GUI_WITH_HIDPI */
 #endif /* VBOX_WS_MAC */
 
     /* Update scaled pause pixmap: */
@@ -1183,12 +1179,10 @@ void UIMachineView::updateScaledPausePixmap()
     /* Update pause pixmap finally: */
     m_pausePixmapScaled = pausePixmap().scaled(scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
 #ifdef VBOX_WS_MAC
-# ifdef VBOX_GUI_WITH_HIDPI
     /* Adjust backing-scale-factor if necessary: */
     const double dBackingScaleFactor = frameBuffer()->backingScaleFactor();
     if (dBackingScaleFactor > 1.0 && frameBuffer()->useUnscaledHiDPIOutput())
         m_pausePixmapScaled.setDevicePixelRatio(dBackingScaleFactor);
-# endif /* VBOX_GUI_WITH_HIDPI */
 #endif /* VBOX_WS_MAC */
 }
 
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
index ed57e60..e2201c2 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
@@ -1776,7 +1776,6 @@ void UISession::setPointerShape(const uchar *pShapeData, bool fHasAlpha,
     /* Create cursor-pixmap from the image: */
     QPixmap cursorPixmap = QPixmap::fromImage(image);
 # ifdef VBOX_WS_MAC
-#  ifdef VBOX_GUI_WITH_HIDPI
     /* Adjust backing-scale-factor: */
     /// @todo In case of multi-monitor setup check whether backing-scale factor and cursor are screen specific.
     /* Get screen-id of main-window: */
@@ -1790,7 +1789,6 @@ void UISession::setPointerShape(const uchar *pShapeData, bool fHasAlpha,
         uYHot /= dBackingScaleFactor;
         cursorPixmap.setDevicePixelRatio(dBackingScaleFactor);
     }
-#  endif /* VBOX_GUI_WITH_HIDPI */
 # endif /* VBOX_WS_MAC */
     /* Set the new cursor: */
     m_cursor = QCursor(cursorPixmap, uXHot, uYHot);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.cpp
index 8427725..ca6e86c 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.cpp
@@ -544,7 +544,8 @@ void UIStatusBarEditorWidget::prepare()
         {
             /* Configure button-layout: */
             m_pButtonLayout->setContentsMargins(0, 0, 0, 0);
-            m_pButtonLayout->setSpacing(5);
+            const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) / 2;
+            m_pButtonLayout->setSpacing(iS);
             /* Add button-layout into main-layout: */
             m_pMainLayout->addLayout(m_pButtonLayout);
         }
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp
index 6ad32ae..128f3f1 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.cpp
@@ -189,7 +189,6 @@ void UIVMCloseDialog::prepare()
                     m_pIcon->setPixmap(icon.pixmap(iIconMetric, iIconMetric));
                 }
                 /* Configure layout: */
-                pTopLeftLayout->setSpacing(0);
                 pTopLeftLayout->setContentsMargins(0, 0, 0, 0);
                 pTopLeftLayout->addWidget(m_pIcon);
                 pTopLeftLayout->addStretch();
@@ -197,11 +196,23 @@ void UIVMCloseDialog::prepare()
             /* Prepare 'top-right' layout: */
             QVBoxLayout *pTopRightLayout = new QVBoxLayout;
             {
+                /* Configure layout: */
+                // WORKAROUND:
+                // Why do we need it? It should be the default one, but it's not..
+                const int iS1 = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing);
+                pTopRightLayout->setSpacing(iS1);
+
                 /* Prepare 'text' label: */
                 m_pLabel = new QLabel(this);
                 /* Prepare 'choice' layout: */
                 QGridLayout *pChoiceLayout = new QGridLayout;
                 {
+                    /* Configure layout: */
+                    // WORKAROUND:
+                    // Why do we need it? It should be the default one, but it's not..
+                    const int iS2 = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing);
+                    pChoiceLayout->setSpacing(iS2);
+
                     /* Prepare icon metric: */
                     const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
                     /* Prepare 'detach' icon: */
@@ -269,9 +280,7 @@ void UIVMCloseDialog::prepare()
                     /* Configure layout: */
 #ifdef VBOX_WS_MAC
                     pChoiceLayout->setSpacing(15);
-#else /* VBOX_WS_MAC */
-                    pChoiceLayout->setSpacing(6);
-#endif /* !VBOX_WS_MAC */
+#endif
                     pChoiceLayout->setContentsMargins(0, 0, 0, 0);
                     pChoiceLayout->addWidget(m_pDetachIcon, 0, 0);
                     pChoiceLayout->addWidget(m_pDetachRadio, 0, 1);
@@ -286,16 +295,15 @@ void UIVMCloseDialog::prepare()
                 /* Configure layout: */
 #ifdef VBOX_WS_MAC
                 pTopRightLayout->setSpacing(15);
-#else /* VBOX_WS_MAC */
-                pTopRightLayout->setSpacing(6);
-#endif /* !VBOX_WS_MAC */
+#endif
                 pTopRightLayout->setContentsMargins(0, 0, 0, 0);
                 pTopRightLayout->addWidget(m_pLabel);
                 pTopRightLayout->addItem(pChoiceLayout);
             }
             /* Configure layout: */
-            pTopLayout->setSpacing(20);
             pTopLayout->setContentsMargins(0, 0, 0, 0);
+            const int iS3 = qApp->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) * 2;
+            pTopLayout->setSpacing(iS3);
             pTopLayout->addItem(pTopLeftLayout);
             pTopLayout->addItem(pTopRightLayout);
         }
@@ -309,7 +317,6 @@ void UIVMCloseDialog::prepare()
             connect(pButtonBox, SIGNAL(helpRequested()), &msgCenter(), SLOT(sltShowHelpHelpDialog()));
         }
         /* Configure layout: */
-        pMainLayout->setSpacing(20);
 #ifdef VBOX_WS_MAC
         pMainLayout->setContentsMargins(40, 20, 40, 20);
 #endif /* VBOX_WS_MAC */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
index 433d2f9..5847b54 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
@@ -260,7 +260,8 @@ void UIMachineLogicNormal::sltHostScreenAvailableAreaChange()
 
     /* Make sure all machine-window(s) have previous but normalized geometry: */
     foreach (UIMachineWindow *pMachineWindow, machineWindows())
-        pMachineWindow->restoreCachedGeometry();
+        if (!pMachineWindow->isMaximized())
+            pMachineWindow->restoreCachedGeometry();
 #endif /* VBOX_WS_X11 */
 
     /* Call to base-class: */
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
index 9dd5eb5..2ab4885 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
@@ -452,10 +452,7 @@ void UISelectorWindow::sltCloseVirtualMediumManagerWindow()
 {
     /* Destroy instance if still exists: */
     if (m_pManagerVirtualMedia)
-    {
-        m_pManagerVirtualMedia->close();
         UIMediumManagerFactory().cleanup(m_pManagerVirtualMedia);
-    }
 }
 
 void UISelectorWindow::sltOpenHostNetworkManagerWindow()
@@ -485,10 +482,7 @@ void UISelectorWindow::sltCloseHostNetworkManagerWindow()
 {
     /* Destroy instance if still exists: */
     if (m_pManagerHostNetwork)
-    {
-        m_pManagerHostNetwork->close();
         UIHostNetworkManagerFactory().cleanup(m_pManagerHostNetwork);
-    }
 }
 
 void UISelectorWindow::sltOpenImportApplianceWizard(const QString &strFileName /* = QString() */)
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotPane.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotPane.cpp
index 564e99f..1ea6f6e 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotPane.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UISnapshotPane.cpp
@@ -1241,7 +1241,8 @@ void UISnapshotPane::prepareWidgets()
 #ifdef VBOX_WS_MAC
         layout()->setSpacing(10);
 #else
-        layout()->setSpacing(4);
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+        layout()->setSpacing(iS);
 #endif
 
         /* Prepare toolbar: */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp
index bee3632..b4762a1 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp
@@ -102,7 +102,6 @@ UISettingsDialog::UISettingsDialog(QWidget *pParent)
     m_pSelector = new UISettingsSelectorTreeView(this);
     pMainLayout->addWidget(m_pSelector->widget(), 0, 0, 2, 1);
     m_pSelector->widget()->setFocus();
-    pMainLayout->setSpacing(10);
 #endif /* VBOX_GUI_WITH_TOOLBAR_SETTINGS */
     connect(m_pSelector, SIGNAL(sigCategoryChanged(int)), this, SLOT(sltCategoryChanged(int)));
 
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
index 6c11b64..88d67cc 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
@@ -3449,6 +3449,9 @@ void UIMachineSettingsStorage::prepare()
         /* We need a little more space for the focus rect: */
         mLtStorage->setContentsMargins(3, 0, 3, 0);
         mLtStorage->setSpacing(3);
+#else
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 3;
+        mLtStorage->setSpacing(iS);
 #endif
 
         /* Prepare storage tree: */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp
index b2a3963..66dd310 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp
@@ -754,6 +754,9 @@ void UIMachineSettingsSystem::prepareTabMotherboard()
             /* We need a little space for the focus rect: */
             m_pLayoutBootOrder->setContentsMargins(3, 3, 3, 3);
             m_pLayoutBootOrder->setSpacing(3);
+#else
+            const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) / 3;
+            m_pLayoutBootOrder->setSpacing(iS);
 #endif
 
             /* Boot-order tree-widget created in the .ui file. */
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp
index 63d9216..613cece 100755
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp
@@ -24,6 +24,7 @@
 # include <QVBoxLayout>
 # include <QScrollArea>
 # include <QScrollBar>
+# include <QStyle>
 # include <QCheckBox>
 # include <QPainter>
 
@@ -67,7 +68,8 @@ void UIFilmContainer::setValue(const QVector<BOOL> &value)
         {
             /* Configure viewport layout: */
             pWidgetLayout->setMargin(0);
-            pWidgetLayout->setSpacing(4);
+            const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) / 2;
+            pWidgetLayout->setSpacing(iS);
             /* Create new widgets according passed vector: */
             for (int iScreenIndex = 0; iScreenIndex < value.size(); ++iScreenIndex)
             {
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp
index 9f9fb17..ab7f9dc 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp
@@ -480,7 +480,8 @@ void UIHostComboEditor::prepare()
     QHBoxLayout *pLayout = new QHBoxLayout(this);
     {
         /* Configure layout: */
-        pLayout->setSpacing(4);
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+        pLayout->setSpacing(iS);
         pLayout->setContentsMargins(0, 0, 0, 0);
         /* Create UIHostComboEditorPrivate instance: */
         m_pEditor = new UIHostComboEditorPrivate;
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp
index 4e943d4..ae397cf 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp
@@ -24,6 +24,7 @@
 # include <QHBoxLayout>
 # include <QLineEdit>
 # include <QKeyEvent>
+# include <QStyle>
 
 /* GUI includes; */
 # include "UIHotKeyEditor.h"
@@ -122,7 +123,8 @@ UIHotKeyEditor::UIHotKeyEditor(QWidget *pParent)
     setFocusProxy(m_pLineEdit);
 
     /* Configure layout: */
-    m_pMainLayout->setSpacing(4);
+    const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing) / 2;
+    m_pMainLayout->setSpacing(iS);
     m_pMainLayout->setContentsMargins(0, 0, 0, 0);
     m_pMainLayout->addWidget(m_pLineEdit);
     m_pMainLayout->addLayout(m_pButtonLayout);
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp
index 810c41d..87ad9e7 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp
@@ -825,8 +825,11 @@ UIPortForwardingTable::UIPortForwardingTable(const UIPortForwardingDataList &rul
 #ifdef VBOX_WS_MAC
         /* On macOS we can do a bit of smoothness: */
         pMainLayout->setContentsMargins(0, 0, 0, 0);
-#endif
         pMainLayout->setSpacing(3);
+#else
+        const int iS = qApp->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) / 3;
+        pMainLayout->setSpacing(iS);
+#endif
         /* Create table: */
         m_pTableView = new UIPortForwardingView;
         {
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.cpp
index 797fe88..c42c83f 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.cpp
@@ -106,7 +106,6 @@ void UIWarningPane::prepareContent()
     {
         /* Configure layout: */
         pMainLayout->setContentsMargins(0, 0, 0, 0);
-        pMainLayout->setSpacing(10);
         /* Add left stretch: */
         pMainLayout->addStretch();
         /* Create text-label: */
@@ -120,7 +119,6 @@ void UIWarningPane::prepareContent()
         {
             /* Configure layout: */
             m_pIconLayout->setContentsMargins(0, 0, 0, 0);
-            m_pIconLayout->setSpacing(6);
             /* Add into main-layout: */
             pMainLayout->addLayout(m_pIconLayout);
         }
diff --git a/src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.pyc b/src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.pyc
index 85911d8..e95a558 100644
Binary files a/src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.pyc and b/src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.pyc differ
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.pyc b/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.pyc
index cb39901..80e8494 100644
Binary files a/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.pyc and b/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.pyc differ
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/convert.pyc b/src/VBox/GuestHost/OpenGL/state_tracker/convert.pyc
index 74422fc..39b0f5f 100644
Binary files a/src/VBox/GuestHost/OpenGL/state_tracker/convert.pyc and b/src/VBox/GuestHost/OpenGL/state_tracker/convert.pyc differ
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/get_components.pyc b/src/VBox/GuestHost/OpenGL/state_tracker/get_components.pyc
index 339b668..7724543 100644
Binary files a/src/VBox/GuestHost/OpenGL/state_tracker/get_components.pyc and b/src/VBox/GuestHost/OpenGL/state_tracker/get_components.pyc differ
diff --git a/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c b/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
index a4087a0..0a0786f 100644
--- a/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
+++ b/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
@@ -36,6 +36,7 @@
 #include "net_internals.h"
 #include "cr_process.h"
 
+#include <iprt/initterm.h>
 #include <iprt/thread.h>
 
 #include <VBox/VBoxGuestLib.h>
@@ -704,7 +705,7 @@ static void _crVBoxHGCMWriteExact(CRConnection *conn, const void *buf, unsigned
         parms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf;
 
         rc = crVBoxHGCMCall(conn, &parms.hdr, sizeof(parms));
-        callRes = parms.hdr.Hdr.rc;
+        callRes = parms.hdr.Hdr.rc; /** @todo now rc == parms.hdr.Hdr.rc */
     }
     else
 #endif
@@ -718,7 +719,7 @@ static void _crVBoxHGCMWriteExact(CRConnection *conn, const void *buf, unsigned
         parms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf;
 
         rc = crVBoxHGCMCall(conn, &parms.hdr, sizeof(parms));
-        callRes = parms.hdr.Hdr.rc;
+        callRes = parms.hdr.Hdr.rc; /** @todo now rc == parms.hdr.Hdr.rc */
     }
 
     if (RT_FAILURE(rc) || RT_FAILURE(callRes))
@@ -758,7 +759,7 @@ static void crVBoxHGCMReadExact( CRConnection *conn, const void *buf, unsigned i
 
     rc = crVBoxHGCMCall(conn, &parms.hdr, sizeof(parms));
 
-    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc))
+    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc) /** @todo now rc == parms.hdr.Hdr.rc */)
     {
         crWarning("SHCRGL_GUEST_FN_READ failed with %x %x\n", rc, parms.hdr.Hdr.rc);
         return;
@@ -834,7 +835,7 @@ crVBoxHGCMWriteReadExact(CRConnection *conn, const void *buf, unsigned int len,
             crDebug("SHCRGL_GUEST_FN_WRITE_BUFFER, offset=%u, size=%u", wbParms.ui32Offset.u.value32, wbParms.pBuffer.u.Pointer.size);
 
             rc = crVBoxHGCMCall(conn, &wbParms.hdr, sizeof(wbParms));
-            if (RT_FAILURE(rc) || RT_FAILURE(wbParms.hdr.Hdr.rc))
+            if (RT_FAILURE(rc) || RT_FAILURE(wbParms.hdr.Hdr.rc) /** @todo now rc == wbParms.hdr.Hdr.rc */)
             {
                 crError("SHCRGL_GUEST_FN_WRITE_BUFFER (%i) failed with %x %x\n", wbParms.pBuffer.u.Pointer.size, rc, wbParms.hdr.Hdr.rc);
                 return;
@@ -865,10 +866,10 @@ crVBoxHGCMWriteReadExact(CRConnection *conn, const void *buf, unsigned int len,
     }
 #endif
 
-    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc))
+    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc) /** @todo now rc == parms.hdr.Hdr.rc */)
     {
 
-        if ((VERR_BUFFER_OVERFLOW == parms.hdr.Hdr.rc) && RT_SUCCESS(rc))
+        if ((VERR_BUFFER_OVERFLOW == parms.hdr.Hdr.rc) /* && RT_SUCCESS(rc) */)
         {
             /* reallocate buffer and retry */
 
@@ -990,7 +991,7 @@ static void crVBoxHGCMPollHost(CRConnection *conn)
 
     rc = crVBoxHGCMCall(conn, &parms.hdr, sizeof(parms));
 
-    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc))
+    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc) /** @todo now rc == parms.hdr.Hdr.rc */)
     {
         crDebug("SHCRGL_GUEST_FN_READ failed with %x %x\n", rc, parms.hdr.Hdr.rc);
         return;
@@ -1193,7 +1194,7 @@ static int crVBoxHGCMSetVersion(CRConnection *conn, unsigned int vMajor, unsigne
 
     if (RT_SUCCESS(rc))
     {
-        rc =  parms.hdr.Hdr.rc;
+        rc =  parms.hdr.Hdr.rc; /** @todo now rc == parms.hdr.Hdr.rc */
         if (RT_SUCCESS(rc))
         {
             conn->vMajor = CR_PROTOCOL_VERSION_MAJOR;
@@ -1255,7 +1256,7 @@ static int crVBoxHGCMSetPID(CRConnection *conn, unsigned long long pid)
 
     rc = crVBoxHGCMCall(conn, &parms.hdr, sizeof(parms));
 
-    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc))
+    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.Hdr.rc) /** @todo now rc == parms.hdr.Hdr.rc */)
     {
         crWarning("SHCRGL_GUEST_FN_SET_PID failed!");
         return FALSE;
@@ -1274,6 +1275,7 @@ static int crVBoxHGCMDoConnect( CRConnection *conn )
 #ifdef IN_GUEST
     int rc;
     VBOXCRHGSMIPROFILE_FUNC_PROLOGUE();
+    RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE);
     rc = VbglR3InitUser();
     if (RT_SUCCESS(rc))
     {
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.pyc b/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.pyc
index dd10638..d9ab34e 100644
Binary files a/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.pyc and b/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.pyc differ
diff --git a/src/VBox/Installer/win/Makefile.kmk b/src/VBox/Installer/win/Makefile.kmk
index 2823aed..a2998df 100644
--- a/src/VBox/Installer/win/Makefile.kmk
+++ b/src/VBox/Installer/win/Makefile.kmk
@@ -54,7 +54,7 @@ VBOX_WIN_INST_OUT_DIR  := $(PATH_TARGET)/Installer/win
 
 # Note: en_US *must* come first for the dependency file generation.
 ifndef VBOX_INSTALLER_LANGUAGES
- VBOX_INSTALLER_LANGUAGES  = en_US de_DE fr_FR it_IT zh_TW
+ VBOX_INSTALLER_LANGUAGES  = en_US de_DE fr_FR it_IT zh_TW zh_CN
  VBOX_INSTALLER_LANGUAGES += $(VBOX_INSTALLER_ADD_LANGUAGES)
 endif
 
@@ -81,11 +81,16 @@ VBOX_BRAND_de_DE_LANG_ID ?= 1031
 VBOX_BRAND_fr_FR_LANG_ID ?= 1036
 VBOX_BRAND_it_IT_LANG_ID ?= 1040
 VBOX_BRAND_zh_TW_LANG_ID ?= 1028
+VBOX_BRAND_zh_CN_LANG_ID ?= 2052
 
 # Standard language names (in the native language), to be extended as we go.
 # VBOX_BRAND_$(lang)_LANG_NAME must be defined for each language which occurs
 # in either VBOX_LICENSE_ADD_LANGUAGES or VBOX_MANUAL_ADD_LANGUAGES.
+VBOX_BRAND_de_DE_LANG_NAME := Deutsch
 VBOX_BRAND_fr_FR_LANG_NAME := Français
+VBOX_BRAND_it_IT_LANG_NAME := Italiano
+VBOX_BRAND_zh_TW_LANG_NAME := 正體中文
+VBOX_BRAND_zh_CN_LANG_NAME := 简体中文
 
 
 #
@@ -104,6 +109,7 @@ $(foreach lang,$(sort $(VBOX_INSTALLER_LANGUAGES) $(VBOX_LICENSE_ADD_LANGUAGES)
 	$(eval VBOX_BRAND_$(lang)_LANGUAGE_CODEPAGE := 1252))
 # Exceptions:
 VBOX_BRAND_zh_TW_LANGUAGE_CODEPAGE := 950
+VBOX_BRAND_zh_CN_LANGUAGE_CODEPAGE := 936
 
 
 
diff --git a/src/VBox/Installer/win/NLS/zh_CN.wxl b/src/VBox/Installer/win/NLS/zh_CN.wxl
new file mode 100644
index 0000000..7bcf4f0
--- /dev/null
+++ b/src/VBox/Installer/win/NLS/zh_CN.wxl
@@ -0,0 +1,600 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="65001" Culture="zh_CN">
+
+<!--
+Language Definition Include for VirtualBox WiX script.
+
+Copyright (C) 2011-2016 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.
+-->
+
+<String Id="LANG">2052</String>
+<String Id="LangName">简体中文</String>
+
+<String Id="ButtonText_No">否(&N)</String>
+<String Id="ButtonText_Yes">是(&Y)</String>
+<String Id="ButtonText_Cancel">取消(&C)</String>
+<String Id="ButtonText_Next">下一步(&N) ></String>
+<String Id="ButtonText_Back">< 上一步(&B)</String>
+<String Id="ButtonText_Browse">浏览(&O)</String>
+<String Id="ButtonText_OK">确定(&K)</String>
+<String Id="ButtonText_Check">检查(&C)</String>
+<String Id="ButtonText_Install">安装(&I)</String>
+<String Id="ButtonText_Remove">删除(&R)</String>
+<String Id="ButtonText_Finish">完成(&F)</String>
+<String Id="ButtonText_Repair">修复(&R)</String>
+<String Id="ButtonText_Return">返回(&R)</String>
+<String Id="ButtonText_Retry">重试(&T)</String>
+<String Id="ButtonText_Ignore">忽略(&G)</String>
+<String Id="ButtonText_Exit">结束(&X)</String>
+
+<String Id="InstallModeCustom">自定</String>
+<String Id="Setup">设置</String>
+
+<!---->
+
+<String Id="StartMenu_License">软件许可</String>
+<String Id="StartMenu_UserManual">用户手册</String>
+
+<!---->
+
+<String Id="VB_App">[ProductName] 应用程序。</String>
+<String Id="VB_USBDriver">[ProductName] USB 设备驱动程序针对 USB 设备支持。</String>
+<String Id="VB_Network">[ProductName] 网络设备驱动程序针对网络支持。</String>
+<String Id="VB_NetFltDriver">[ProductName] 驱动程序针对桥接网络。</String>
+<String Id="VB_NetAdpDriver">[ProductName] 虚拟网络界面卡针对“仅主机”网络。</String>
+<String Id="VB_NetLwfDriver">[ProductName] driver for NDIS6 Bridged Networking.</String>
+<String Id="VB_NetAdp6Driver">[ProductName] virtual network adapter driver for NDIS6 Host-Only Networking.</String>
+
+<String Id="VB_Python">VirtualBox 的 Python 支持。</String>
+
+<!---->
+
+<String Id="NeedAdmin">您需要有系统管理员特殊权限以安装 (或卸载)[ProductName]!此安装程序现在将中止。</String>
+<String Id="WrongOS">此应用程序只能执行在 Windows XP 或以上。</String>
+<String Id="Only32Bit">此应用程序只能执行在 32 位 Windows 系统。 请安装 [ProductName] 的 64 位版本!</String>
+<String Id="Only64Bit">此应用程序只能执行在 64 位 Windows 系统。 请安装 [ProductName] 的 32 位版本!</String>
+<String Id="SunFound">在此计算机发现旧的 Sun VirtualBox 安装。 请先卸载此组件然后安装 [ProductName]!</String>
+<String Id="InnotekFound">在此计算机发现旧的 innotek VirtualBox 安装。 请先卸载此组件然后安装 [ProductName]!</String>
+
+<!---->
+
+<String Id="CancelDlg_Question">您确定要取消 [ProductName] 安装吗?</String>
+
+<!---->
+
+<String Id="WelcomeDlg_Header">欢迎使用 [ProductName] 安装向导</String>
+<String Id="WelcomeDlg_Body">安装向导将在您的计算机安装 [ProductName]。 单击「下一步」继续或「取消」结束安装向导。</String>
+
+<!---->
+
+<String Id="LicenseAgreementDlg_Header">最终用户授权协议</String>
+<String Id="LicenseAgreementDlg_Body">请仔细阅读以下授权协议。</String>
+<String Id="LicenseAgreementDlg_Accept">我接受授权协议中条款(&A)</String>
+<String Id="LicenseAgreementDlg_Decline">我不接受授权协议中条款(&D)</String>
+
+<!---->
+
+<String Id="CheckSerialDlg_Header">序号</String>
+<String Id="CheckSerialDlg_Body">请在以下字段输入您的序号。 您可以在 VirtualBox CD 盒内的贴纸找到。</String>
+<String Id="CheckSerialDlg_Footer">序号输入完成时,单击以下「检查」按钮。</String>
+
+<!---->
+
+<String Id="WrongSerialDlg_Header">输入的序号无效!</String>
+<String Id="WrongSerialDlg_Desc1">请返回再次输入您的序号。</String>
+<String Id="WrongSerialDlg_Desc2">请记得,序号必须和印在贴纸上的拼写完全一样。</String>
+
+<!---->
+
+<String Id="WarnSaveStatesDlg_Header">警告:</String>
+<String Id="WarnSaveStatesDlg_Header2">已经的存储状态不兼容!</String>
+<String Id="WarnSaveStatesDlg_Desc">升级 [ProductName] 时,所有来自已经存在机器的存储状态不再能动作!安装后,您必须手动舍弃。</String>
+<String Id="WarnSaveStatesDlg_Proceed">立即进行安装吗?</String>
+
+<!---->
+
+<String Id="WarnTAPDevicesDlg_Header">主机界面</String>
+<String Id="WarnTAPDevicesDlg_Desc">如果您的机器在先前版本使用某些主机界面。 在此安装后您必须重新创建它们。</String>
+
+<!---->
+
+<String Id="NetCfgLocked">继续安装前,必须关闭以下应用程序:"[2]"</String>
+
+<!---->
+
+<String Id="CustomizeDlg_Location">位置:</String>
+<String Id="CustomizeDlg_DiskUsage">磁盘使用量(&U)</String>
+<String Id="CustomizeDlg_SelFeatures">选择您要安装功能的方式。</String>
+<String Id="CustomizeDlg_IconTree">单击以下树状中图示以更改安装功能的方式。</String>
+<String Id="CustomizeDlg_CustomSetup">自定安装</String>
+<String Id="CustomizeDlg_SelItemDesc">CustomizeDlgItemDescription-CustomizeDlgItemDescription</String>
+<String Id="CustomizeDlg_SelItemSize">CustomizeDlgItemSize-CustomizeDlgItemSize</String>
+<String Id="CustomizeDlg_SelItemPath">CustomizeDlgLocation-CustomizeDlgLocation</String>
+
+<!---->
+
+<String Id="Customize2Dlg_Header">自定</String>
+<String Id="Customize2Dlg_Desc">请选择以下选项:</String>
+<String Id="Customize2Dlg_CreateStartMenuEntries">添加系统菜单条目</String>
+<String Id="Customize2Dlg_CreateDesktopShortcut">在桌面创建快捷方式</String>
+<String Id="Customize2Dlg_CreateQuickLaunch">在快速启动栏创建快捷方式</String>
+<String Id="Customize2Dlg_RegisterFileExtensions">注册文件关联</String>
+
+<!---->
+
+<String Id="SelectionNetworkTypeDlg_CommonDescription">Please choose which type of network drivers you will use:</String>
+<String Id="SelectionNetworkTypeDlg_DescriptionNDIS5">NDIS5 network drivers.
+This is default for older versions of Windows (pre-Vista).</String>
+<String Id="SelectionNetworkTypeDlg_DescriptionNDIS6">NDIS6 network drivers.
+This is default for newer versions of Windows (Vista and newer).</String>
+<String Id="SelectionNetworkTypeDlg_RadioButtonNDIS5">Use NDIS5 network drivers.</String>
+<String Id="SelectionNetworkTypeDlg_RadioButtonNDIS6">Use NDIS6 network drivers.</String>
+
+<!---->
+
+<String Id="WarnDisconNetIfacesDlg_Title">警告:</String>
+<String Id="WarnDisconNetIfacesDlg_Title2">网络界面</String>
+<String Id="WarnDisconNetIfacesDlg_Desc">安装 [ProductName] 网络功能将复位您的网络连接并暂时中断网络连接。</String>
+<String Id="WarnDisconNetIfacesDlg_Question">立即进行安装吗?</String>
+
+<!---->
+
+<String Id="DiskCostDlg_SpaceRequired">安装选择功能所需的磁盘空间。</String>
+<String Id="DiskCostDlg_NotEnoughSpace">高亮的磁盘区(如果有)对于当前选择的功能没有足够的磁盘空间可以使用。 您可以从高亮的磁盘区删除一些文件,或选择安装较少功能在本机磁盘机,或选择不同目的地磁盘机。</String>
+<String Id="DiskCostDlg_SpaceRequirements">磁盘空间需求</String>
+<String Id="DiskCostDlg_VolumeList">{120}{70}{70}{70}{70}</String>
+
+<!---->
+
+<String Id="BrowseDlg_BrowseDestFolder">浏览目的地数据夹</String>
+<String Id="BrowseDlg_ChangeCurFolder">更改当前目的地数据夹</String>
+<String Id="BrowseDlg_UpOneLevelTooltip">上一层</String>
+<String Id="BrowseDlg_CreateNewFolderTooltip">创建新的数据夹</String>
+<String Id="BrowseDlg_LookIn">浏览(&L):</String>
+<String Id="BrowseDlg_FolderName">数据夹名称(&F):</String>
+
+<!---->
+
+<String Id="VerifyReadyDlg_ReadyToBegin">安装向导准备好进行 [InstallMode] 安装。</String>
+<String Id="VerifyReadyDlg_ClickInstall">单击「安装」开始安装。 如果您要检查或更改任何安装设置,单击「上一步」。 单击「取消」结束向导。</String>
+<String Id="VerifyReadyDlg_ReadyToInstall">准备好安装</String>
+
+<!---->
+
+<String Id="ExitDlg_ClickFinish">单击「完成」按钮结束安装向导。</String>
+<String Id="ExitDlg_InstComplete">[ProductName] 安装完成。</String>
+<String Id="ExitDlg_StartVBox">安装后引导 [ProductName]</String>
+
+<!---->
+
+<String Id="FatalErrorDlg_Header">[ProductName] 安装向导太早结束</String>
+<String Id="FatalErrorDlg_Desc">[ProductName] 安装因为错误太早结束。 您的系统未做修改。 若要稍后安装此程序,请再次执行安装。</String>
+<String Id="FatalErrorDlg_Footer">单击「完成」按钮结束安装向导。</String>
+
+<!---->
+
+<String Id="FilesInUse_Text">以下应用程序使用此安装需要更新的文件。 关闭这些应用程序接著单击「重试(&R)」以继续安装或「取消」结束向导。</String>
+<String Id="FilesInUse_Description">某些需要更新的文件当前使用中。</String>
+<String Id="FilesInUse_Title">文件使用中</String>
+
+<!---->
+
+<String Id="UserExitDlg_Header">[ProductName] 安装向导中断</String>
+<String Id="UserExitDlg_Desc">[ProductName] 安装中断。 您的系统未做修改。 若要稍后安装此程序,请再次执行安装。</String>
+<String Id="UserExitDlg_Footer">单击「完成」按钮结束安装向导。</String>
+
+<!---->
+
+<String Id="ProgressDlg_PleaseWait">在安装向导安装 [ProductName] 时请稍候。 这需要几分钟时间。</String>
+
+<!---->
+
+<String Id="ResumeDlg_Header">正在继续 [ProductName] 安装向导</String>
+<String Id="ResumeDlg_Desc">安装向导将在您的计算机完成 [ProductName] 的安装。 单击「安装」以继续或「取消」结束安装向导。</String>
+
+<!---->
+
+<String Id="MaintenanceTypeDlg_Header">修改、修复或删除安装</String>
+<String Id="MaintenanceTypeDlg_SelOption">选择您希望执行的操作。</String>
+<String Id="MaintenanceTypeDlg_Repair">修复(&P)</String>
+<String Id="MaintenanceTypeDlg_RepairText">修复在最近安装状态的错误 - 修复缺少或毁坏的文件、快捷方式和注册档项目。</String>
+<String Id="MaintenanceTypeDlg_RepairTooltip">修复安装</String>
+<String Id="MaintenanceTypeDlg_RepairProgress1">正在修复</String>
+<String Id="MaintenanceTypeDlg_RepairProgress2">repairs</String>
+<String Id="MaintenanceTypeDlg_Remove">删除(&R)</String>
+<String Id="MaintenanceTypeDlg_RemoveText">从计算机删除 [ProductName]。</String>
+<String Id="MaintenanceTypeDlg_RemoveTooltip">删除安装</String>
+<String Id="MaintenanceTypeDlg_RemoveProgress1">正在删除</String>
+<String Id="MaintenanceTypeDlg_RemoveProgress2">removes</String>
+
+<!---->
+
+<String Id="MaintenanceWelcomeDlg_Header">欢迎使用 [ProductName] 安装向导</String>
+<String Id="MaintenanceWelcomeDlg_Desc">安装向导将允许您修复当前的安装或从您的计算机删除 [ProductName]。 单击「下一步」以继续或「取消」结束安装向导。</String>
+
+<!---->
+
+<String Id="OutOfDiskDlg_InstallationExceeds">安装所需的磁盘空间超过可用的磁盘空间。</String>
+<String Id="OutOfDiskDlg_NotEnoughDiskSpace">高亮的磁盘区对于当前选择的功能没有足够的磁盘空间可以使用。 您可以从高亮的磁盘区删除一些文件,或选择安装较少功能在本机磁盘机,或选择不同目的地磁盘机。</String>
+<String Id="OutOfDiskDlg_OutOfDiskSpace">磁盘空间不足</String>
+
+<!---->
+
+<String Id="OutOfRbDiskDlg_InstallationExceeds">安装所需的磁盘空间超过可用的磁盘空间。</String>
+<String Id="OutOfRbDiskDlg_NotEnoughDiskSpace">高亮的磁盘区对于当前选择的功能没有足够的磁盘空间可以使用。 您可以从高亮的磁盘区删除一些文件,或选择安装较少功能在本机磁盘机,或选择不同目的地磁盘机。</String>
+<String Id="OutOfRbDiskDlg_OutOfDiskSpace">磁盘空间不足</String>
+<String Id="OutOfRbDiskDlg_Desc">或者,您可以选择停用安装程序的恢复功能。 这允许安装程序在任何方式中断安装时撤消您计算机的原始状态。 单击「是」如果您希望承担停用恢复功能的风险。</String>
+
+<!---->
+
+<String Id="VerifyRemoveDlg_Header">删除 [ProductName]</String>
+<String Id="VerifyRemoveDlg_Desc">您已经选择从您的计算机删除程序。</String>
+<String Id="VerifyRemoveDlg_ClickRemove">单击「删除」以从您的计算机删除 [ProductName]。 如果您要检查或更改任何安装设置,单击「上一步」。 单击「取消」结束向导。</String>
+
+<!---->
+
+<String Id="VerifyRepairDlg_Header">修复 [ProductName]</String>
+<String Id="VerifyRepairDlg_ReadyToBegin">安装向导准备好开始修复 [ProductName]。</String>
+<String Id="VerifyRepairDlg_ClickRepair">单击「修复」以修复 [ProductName] 的安装。 如果您要检查或更改任何安装设置,单击「上一步」。 单击「取消」结束向导。</String>
+
+<!---->
+
+<String Id="WaitForCostingDlg_PleaseWait">在安装程序完成判断您的磁盘空间需求时请稍候。</String>
+
+<!---->
+
+<String Id="MsiRMFilesInUse_Text">以下应用程序使用此安装需要更新的文件。 您可以让安装向导关闭并尝试重新引导这些应用程序或稍后重新引导计算机。</String>
+<String Id="MsiRMFilesInUse_Description">某些需要更新的文件当前使用中。</String>
+<String Id="MsiRMFilesInUse_Title">文件使用中</String>
+<String Id="MsiRMFilesInUse_UseRM">关闭应用程序并尝试重新引导它们。 (&C)</String>
+<String Id="MsiRMFilesInUse_DontUseRM">不要关闭应用程序,将需要重新开机。 (&D)</String>
+
+<!-- The following strings are internally used by WiX and MSI -->
+<String Id="Error0">{{严重错误:}}</String>
+<String Id="Error1">{{错误 [1]。}}</String>
+<String Id="Error2">警告 [1]。</String>
+<String Id="Error3"/>
+<String Id="Error4">信息 [1]。</String>
+<String Id="Error5">安装程序安装这个封装时发生未预期的错误。 这可能表示这个封装的问题。 错误码 [1]。 {{引数:[2], [3], [4]}}</String>
+<String Id="Error6"/>
+<String Id="Error7">{{磁盘已满:}}</String>
+<String Id="Error8">动作 [Time]:[1]. [2]</String>
+<String Id="Error9">[ProductName]</String>
+<String Id="Error10">{[2]}{, [3]}{, [4]}</String>
+<String Id="Error11">消息类型:[1], 引数:[2]</String>
+<String Id="Error12">=== 打开记录时间:[Date] [Time] ===</String>
+<String Id="Error13">=== 停止记录时间:[Date] [Time] ===</String>
+<String Id="Error14">动作开始 [Time]:[1]。</String>
+<String Id="Error15">动作结束 [Time]:[1]。 返回值 [2]。</String>
+<String Id="Error16">剩下时间:{[1] 分 }{[2] 秒}</String>
+<String Id="Error17">内存不足,重试之前先关闭其它应用程序。</String>
+<String Id="Error18">安装程序不再有响应。</String>
+<String Id="Error19">安装程序已经永久中止。</String>
+<String Id="Error20">在 Windows 组态 [ProductName] 时请稍候</String>
+<String Id="Error21">正在收集所需的信息...</String>
+<String Id="Error22">正在删除此应用程序的旧版本...</String>
+<String Id="Error23">正在准备删除此应用程序的旧版本...</String>
+<String Id="Error32">{[ProductName] } 安装成功完成。</String>
+<String Id="Error33">{[ProductName] } 安装失败。</String>
+<String Id="Error1101">读入文件错误:[2]。{{ 系统错误 [3]。}} 检查文件是否存在,并且可以访问。</String>
+<String Id="Error1301">不能创建目录 '[2]'。 同名的目录已经存在。 取消安装并尝试安装到不同位置。</String>
+<String Id="Error1302">请插入磁盘:[2]</String>
+<String Id="Error1303">安装程序的权限不足,不能访问这个目录:[2],安装不能继续,以系统管理员的身份登录或是连络您的系统管理员。</String>
+<String Id="Error1304">写入至文件时发生错误:[2]。请检查您可以访问那个目录。</String>
+<String Id="Error1305">读入文件时发生错误:[2]。{{ 系统错误 [3]。}} 请检查文件是否存在,并且可以访问。</String>
+<String Id="Error1306">另一个应用程序独占访问文件 '[2]'。 请关闭所有其它应用程序,然后单击「重试」。</String>
+<String Id="Error1307">磁盘空间不足,不能安装这个文件:[2]。释放一些磁盘空间然后单击「重试」,或单击「取消」结束。</String>
+<String Id="Error1308">找不到源文件案:[2]。 请验证文件存在并且您可以访问它。</String>
+<String Id="Error1309">读入文件错误:[3]。{{ 系统错误 [2]。}} 请检查文件是否存在,并且可以访问。</String>
+<String Id="Error1310">写入至文件时发生错误:[3]。{{ 系统错误 [2]。}} 请检查您可以访问那个目录。</String>
+<String Id="Error1311">找不到源文件案 {{(cabinet)}}:[2]。 请检查文件存在并且可以访问。</String>
+<String Id="Error1312">不能创建目录 '[2]'。 同名的文件已经存在。 请重新命名或删除文件并单击「重试」,或单击「取消」结束。</String>
+<String Id="Error1313">磁盘区 [2] 当前不可使用。 请选择另一个。</String>
+<String Id="Error1314">指定的路径 '[2]' 不可使用。</String>
+<String Id="Error1315">不能写入指定的数据夹:[2]。</String>
+<String Id="Error1316">尝试从文件读入时发生网络错误:[2]</String>
+<String Id="Error1317">尝试创建目录时发生错误:[2]</String>
+<String Id="Error1318">尝试创建目录时发生网络错误:[2]</String>
+<String Id="Error1319">尝试打开源文件案时发生网络错误:[2]</String>
+<String Id="Error1320">指定的路径太长:[2]</String>
+<String Id="Error1321">Installer 的权限不足以修改这个文件:[2]。</String>
+<String Id="Error1322">数据夹路径的部份 '[2]' 无效。其为空或超过系统允许的长度。</String>
+<String Id="Error1323">数据夹路径 '[2]' 包含无效的字在数据夹路径。</String>
+<String Id="Error1324">数据夹路径 '[2]' 包含无效字符。</String>
+<String Id="Error1325">'[2]' 不是有效的短文件名。</String>
+<String Id="Error1326">取得文件安全性错误:[3] GetLastString:[2]</String>
+<String Id="Error1327">无效的磁盘机:[2]</String>
+<String Id="Error1328">套用修正档到文件 [2] 错误。 可能已由其它主机更新,且这个修正档不再能修改。 更多信息请联络您的修正档供应商。 {{系统错误:[3]}}</String>
+<String Id="Error1329">不能安装所需的文件,因为 cabinet 文件 [2] 没有数字签名。 这表示 cabinet 文件已经毁坏。</String>
+<String Id="Error1330">不能安装所需的文件,因为 cabinet 文件 [2] 有无效的数字签名。 这表示 cabinet 文件已经毁坏。 {{ WinVerifyTrust 返回错误 [3]。}}</String>
+<String Id="Error1331">修正复制 [2] 文件失败:CRC 错误。</String>
+<String Id="Error1332">修正移动 [2] 文件失败:CRC 错误。</String>
+<String Id="Error1333">修正路径 [2] 文件失败:CRC 错误。</String>
+<String Id="Error1334">不能安装 '[2]' 因为在 cainet 文件 '[3]' 中找不到文件。 这表示网络错误、从 CD-ROM 读入错误、或此安装包问题。</String>
+<String Id="Error1335">此安装所需的 cabinet 文件 '[2]' 已经毁坏且不能使用。 这表示网络错误、从 CD-ROM 读入错误、或此安装包问题。</String>
+<String Id="Error1336">完成这个安装所需的临时文件案创建错误。 {{ 数据夹:[3]。 系统错误码:[2]}}</String>
+<String Id="Error1401">不能创建机码:[2]。{{ 系统错误 [3]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1402">不能打开机码:[2]。{{ 系统错误 [3]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1403">不能从机码 [3] 删除值:[2]。{{ 系统错误 [4]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1404">不能删除机码:[2]。{{ 系统错误 [3]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1405">不能从机码 [3] 读入值 [2]。{{ 系统错误 [4]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1406">不能写入值 [2] 至机码 [3]。{{ 系统错误 [4]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1407">不能取得机码 [2] 的值名称。{{ 系统错误 [3]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1408">不能取得机码 [2] 的子机码名称。{{ 系统错误 [3]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1409">不能读入机码 [2] 的安全信息。{{ 系统错误 [3]。}} 检查您是有足够的权限访问该机码,或是连络您的支持人员。</String>
+<String Id="Error1410">不能增加可用的注册空间。 此应用程序须要 [2] KB 以上的空间。</String>
+<String Id="Error1500">其它的安装正在进行中,您必须完成该项安装之后才能继续。</String>
+<String Id="Error1501">访问保全数据时发生错误,请确定 Windows Installer 是否正确组态,然后再试一次。</String>
+<String Id="Error1502">用户 '[2]' 先前已经引导产品 '[3]' 的安装。 该用户在可以使用该产品前需要再次执行安装。您当前的安装现在将继续。</String>
+<String Id="Error1503">用户 '[2]' 先前已经引导产品 '[3]' 的安装。 该用户在可以使用该产品前需要再次执行安装。</String>
+<String Id="Error1601">磁盘空间不足 -- 磁盘区:'[2]',所需空间:[3] KB; 可用空间:[4] KB。 释放一些磁盘空间并重试。</String>
+<String Id="Error1602">您确定要取消吗?</String>
+<String Id="Error1603">文件 [2][3] 正在由 { 以下处理程序:名称:[4],Id:[5],窗口标题:'[6]'} 使用中。 关闭该应用程序并重试。</String>
+<String Id="Error1604">已经安装产品 '[2]',此产品防止安装。 两个产品不兼容。</String>
+<String Id="Error1605">磁盘区 '[2]' 没有足够的磁盘空间以启用恢复的安装继续。 需要 [3] KB,但只有 [4] KB 可以使用。 单击「忽略」以不存储恢复信息继续安装,单击「重试」以再次检查可用空间,或单击「取消」以离开安装。</String>
+<String Id="Error1606">不能访问网络位置 [2]。</String>
+<String Id="Error1607">继续安装前应该关闭以下应用程序:</String>
+<String Id="Error1608">不能在本机中找到任何先前已安装的合格版本。</String>
+<String Id="Error1609">套用安全性设置时发生错误。 [2] 不是有效的用户或群组。 这会是安装包的问题或连接到网络上网域控制站的问题。 检查您的网络连接并单击「重试」,或「取消」以结束安装。 {{找不到用户的 SID,系统错误 [3]}}</String>
+<String Id="Error1701">金钥 [2] 是无效的,检查您输入的金钥是否正确。</String>
+<String Id="Error1702">要继续设置 [2] 之前,Installer 必须重新引导您的系统,按「是」将立即重新引导;如果您想要稍后手动重新引导请按「否」。</String>
+<String Id="Error1703">您必须重新引导您的系统,对 [2] 所做的组态更改才会生效,按「是」立即重新引导;如果您想要稍后手动重新引导请按「否」。</String>
+<String Id="Error1704">安装 [2] 当前已经暂停,您必须恢复该安装所做的更改才能继续,您要恢复这些更改吗?</String>
+<String Id="Error1705">另一个安装这个产品的程序正在进行中,您必须恢复该安装所做的更改才能继续,您要恢复这些更改吗?</String>
+<String Id="Error1706">找不到产品 [2] 的安装包。 尝试使用安装包 '[3]' 的有效副本尝试再次安装。</String>
+<String Id="Error1707">安装成功完成。</String>
+<String Id="Error1708">安装失败。</String>
+<String Id="Error1709">产品:[2] -- [3]</String>
+<String Id="Error1710">您可以将计算机撤消成先前的状态或稍后继续安装,您希望撤消吗?</String>
+<String Id="Error1711">写入安装信息至磁盘时发生错误,确定磁盘的空间足够,并按「重试」,或按「取消」来结束安装。</String>
+<String Id="Error1712">撤消您的计算机成之前的状态所需的一个或数个文件找不到。 不能撤消。</String>
+<String Id="Error1713">[2] 不能安装其所需的产品之一。 请联络您的技术支持小组。 {{系统符串:[3]。}}</String>
+<String Id="Error1714">不能删除 [2] 的旧版本。 请联络您的技术支持小组。 {{系统符串 [3]。}}</String>
+<String Id="Error1715">已经安装 [2]</String>
+<String Id="Error1716">已经组态 [2]</String>
+<String Id="Error1717">已经删除 [2]</String>
+<String Id="Error1718">数字签名原则拒绝文件 [2] 。</String>
+<String Id="Error1719">不能访问 Windows Installer 服务。 如果您正执行在 Windows 安全模式,这将会发生。 请联络您的技术支持人员以取得协助。</String>
+<String Id="Error1720">这个 Windows Installer 封装有问题。 完成这个安装需要的指令码不能执行。 联络您的支持人员或封装供应商。 {{自定动作 [2] 指令码错误 [3],[4]:[5] 行 [6],栏 [7],[8] }}</String>
+<String Id="Error1721">这个 Windows Installer 封装有问题。 完成这个安装需要的程序不能执行。 联络您的支持人员或封装供应商。 {{动作 [2],位置:[3],命令:[4] }}</String>
+<String Id="Error1722">这个 Windows Installer 封装有问题。 以 setup 部分执行的程序不能如预期完成。 联络您的支持人员或封装供应商。 {{动作 [2],位置:[3],命令:[4] }}</String>
+<String Id="Error1723">这个 Windows Installer 封装有问题。 完成这个安装需要的 DLL 不能执行。 联络您的支持人员或封装供应商。 {{动作 [2],项目:[3],库:[4] }}</String>
+<String Id="Error1724">删除成功完成。</String>
+<String Id="Error1725">删除失败。</String>
+<String Id="Error1726">宣告成功完成。</String>
+<String Id="Error1727">宣告失败。</String>
+<String Id="Error1728">组态成功完成。</String>
+<String Id="Error1729">组态失败。</String>
+<String Id="Error1730">您必须是管理器以删除这个应用程序。 要删除这个应用程序,您可以使用系统管理员登录或联络您的技术支持群组取得协助。</String>
+<String Id="Error1801">路径 [2] 无效。 请指定有效的路径。</String>
+<String Id="Error1802">内存不足,重试之前先关闭其它应用程序。</String>
+<String Id="Error1803">磁盘机 [2] 中没有磁片,请插入磁片然后重试,或按「取消」回到上次选择的磁盘区。</String>
+<String Id="Error1804">磁盘机 [2] 中没有磁片,请插入磁片然后按「重试」,或按「取消」回到浏览对话框,并选择不同的磁盘区。</String>
+<String Id="Error1805">数据夹 [2] 不存在,请输入一个现有的数据夹路径。</String>
+<String Id="Error1806">您的权限不足,不能读入这个数据夹。</String>
+<String Id="Error1807">不能决定合法的目的数据夹。</String>
+<String Id="Error1901">尝试读入来源安装数据库时发生错误:[2]。</String>
+<String Id="Error1902">正在排定重新开机作业:正在更改文件名称 [2] 成 [3],必须重新开机才能完成作业。</String>
+<String Id="Error1903">正在排定重新开机作业:正在删除文件 [2],必须重新开机才能完成作业。</String>
+<String Id="Error1904">注册模块 [2] 失败。HRESULT [3]。连络您的支持人员。</String>
+<String Id="Error1905">取消注册模块 [2] 失败。HRESULT [3]。连络您的支持人员。</String>
+<String Id="Error1906">不能预存封装 [2]。错误:[3]。请连络支持人员。</String>
+<String Id="Error1907">不能注册字体 [2]。 请确认是否有足够的权限及系统支持。</String>
+<String Id="Error1908">不能解除注册字体 [2]。 请确认您有足够的权限来删除字体。</String>
+<String Id="Error1909">不能创建快捷方式 [2]。 请确认目地数据夹是否存在及您的访问权。</String>
+<String Id="Error1910">不能删除快捷方式 [2]。 请确认目地数据夹是否存在及您的访问权。</String>
+<String Id="Error1911">不能注册文件 [2] 的类型库。 请连络系统支持人员。</String>
+<String Id="Error1912">不能解除注册文件 [2] 的 type library。 请连络系统支持人员。</String>
+<String Id="Error1913">不能更新 ini 档 [2][3]。 请确认文件是否存在及您的访问权。</String>
+<String Id="Error1914">不能预定在重开机时将文件 [2] 取代 [3]。 请确认您有 [3] 的访问权。</String>
+<String Id="Error1915">删除 ODBC 驱动程序管理员错误,ODBC 错误 [2]:[3]。请连络系统支持人员。</String>
+<String Id="Error1916">安装 ODBC 驱动程序管理员错误,ODBC 错误 [2]:[3]。请连络系统支持人员。</String>
+<String Id="Error1917">删除 ODBC 驱动程序管理员错误:[4],ODBC 错误 [2]:[3]。请确认您有足够权限。</String>
+<String Id="Error1918">安装 ODBC 驱动程序管理员错误:[4],ODBC 错误 [2]:[3]。请确认文件[4]存在并可访问。</String>
+<String Id="Error1919">设置 ODBC 数据来源错误:[4],ODBC 错误 [2]:[3]。请确认文件[4]存在并可访问。</String>
+<String Id="Error1920">引导服务 '[2]' ([3]) 失败。 请确认您有足够的特殊权限以引导系统服务。</String>
+<String Id="Error1921">停止服务 '[2]' ([3]) 失败。 请确认您有足够的特殊权限以引导系统服务。</String>
+<String Id="Error1922">删除服务 '[2]' ([3]) 失败。 请确认您有足够的特殊权限以引导系统服务。</String>
+<String Id="Error1923">不能安装服务 '[2]' ([3]) 。 请确认您有足够的特殊权限以引导系统服务。</String>
+<String Id="Error1924">不能更新环境变量 '[2]'。 请确认您有足够的特殊权限以修改环境变量。</String>
+<String Id="Error1925">您没有足够的特殊权限使计算机的所有用户都完成此安装。请以系统管理员权限登录,接著再重试此安装。</String>
+<String Id="Error1926">不能配置文件案 '[3]' 的文件安全性。 错误:[2]。 请确认您有足够的特殊权限以修改此文件的安全性权限。</String>
+<String Id="Error1927">这台计算机并未安装 Component Services (COM+ 1.0)。这项安装需要有 Component Services 才能进行。Component Services 包含在 Windows XP 中。</String>
+<String Id="Error1928">注册 COM+ 应用程序时发生错误。请联络您的支持人员以取得其它信息。</String>
+<String Id="Error1929">解除 COM+ 应用程序注册时发生错误。请联络您的支持人员以取得其它信息。</String>
+<String Id="Error1930">不能更改服务 '[2]' ([3]) 的描述。</String>
+<String Id="Error1931">Windows Installer 服务不能更新系统文件 [2] 因为文件受 Windows 保护。 您可能需要更新您的作业系统使这个程序正确动作。 {{{封装版本:[3],受 OS 保护的版本:[4]}}</String>
+<String Id="Error1932">Windows Installer 服务不能更新受保护的 Windows 文件 [2]。 {{封装版本:[3],受 OS 保护的版本:[4],SFP 错误:[5]}}</String>
+<String Id="Error1933">Windows Installer 服务不能更新一个或数个受保护的 Windows 文件。 {{SFP 符串:[2]。 受保护的文件清单:\r\n[3]}}</String>
+<String Id="Error1934">计算机的原则停用用户安装。</String>
+<String Id="Error1935">组件组件 [2] 的安装期间发生错误。 HRESULT:[3]。 {{组件界面:[4],函数:[5],组件名称:[6]}}</String>
+
+<!-- Own / special errors -->
+<String Id="Error25001">需要关闭应用程序 "[2]" 以继续关闭。</String>
+
+<String Id="ProgressTextInstallValidate">正在验证安装</String>
+<String Id="ProgressTextInstallFiles">正在复制新文件</String>
+<String Id="ProgressTextInstallFilesTemplate">文件:[1], 目录:[9], 尺寸:[6]</String>
+<String Id="ProgressTextInstallAdminPackage">正在复制网络安装文件</String>
+<String Id="ProgressTextInstallAdminPackageTemplate">文件:[1], 目录:[9], 尺寸:[6]</String>
+<String Id="ProgressTextFileCost">正在计算空间需求</String>
+<String Id="ProgressTextCostInitialize">正在计算空间需求</String>
+<String Id="ProgressTextCostFinalize">正在计算空间需求</String>
+<String Id="ProgressTextCreateShortcuts">正在创建快捷方式</String>
+<String Id="ProgressTextCreateShortcutsTemplate">快捷方式:[1]</String>
+<String Id="ProgressTextPublishComponents">正在发布合格的组件</String>
+<String Id="ProgressTextPublishComponentsTemplate">组件 ID:[1], 公布者:[2]</String>
+<String Id="ProgressTextPublishFeatures">正在发布产品功能</String>
+<String Id="ProgressTextPublishFeaturesTemplate">功能:[1]</String>
+<String Id="ProgressTextPublishProduct">正在发布产品信息</String>
+<String Id="ProgressTextRegisterClassInfo">正在注册类型服务器</String>
+<String Id="ProgressTextRegisterClassInfoTemplate">类型 Id:[1]</String>
+<String Id="ProgressTextRegisterExtensionInfo">正在注册扩展服务器</String>
+<String Id="ProgressTextRegisterExtensionInfoTemplate">扩展名 [1]</String>
+<String Id="ProgressTextRegisterMIMEInfo">正在注册 MIME 信息</String>
+<String Id="ProgressTextRegisterMIMEInfoTemplate">MIME 内容类型:[1],扩展名:[2]</String>
+<String Id="ProgressTextRegisterProgIdInfo">正在注册程序辨识字符</String>
+<String Id="ProgressTextRegisterProgIdInfoTemplate">ProgId: [1]</String>
+<String Id="ProgressTextAllocateRegistrySpace">正在分配注册空间</String>
+<String Id="ProgressTextAllocateRegistrySpaceTemplate">可用空间:[1]</String>
+<String Id="ProgressTextAppSearch">正在寻找已安装的应用程序</String>
+<String Id="ProgressTextAppSearchTemplate">内容:[1], 签章:[2]</String>
+<String Id="ProgressTextBindImage">正在系结执行档</String>
+<String Id="ProgressTextBindImageTemplate">文件:[1]</String>
+<String Id="ProgressTextCCPSearch">正在寻找查询产品</String>
+<String Id="ProgressTextCreateFolders">正在创建数据夹</String>
+<String Id="ProgressTextCreateFoldersTemplate">数据夹:[1]</String>
+<String Id="ProgressTextDeleteServices">正在删除服务</String>
+<String Id="ProgressTextDeleteServicesTemplate">服务:[1]</String>
+<String Id="ProgressTextDuplicateFiles">正在创建重复文件</String>
+<String Id="ProgressTextDuplicateFilesTemplate">文件:[1], 目录:[9], 尺寸:[6]</String>
+<String Id="ProgressTextFindRelatedProducts">正在寻找相关的应用程序</String>
+<String Id="ProgressTextFindRelatedProductsTemplate">找到应用程序:[1]</String>
+<String Id="ProgressTextInstallODBC">正在安装 ODBC 组件</String>
+<String Id="ProgressTextInstallServices">正在安装新服务</String>
+<String Id="ProgressTextInstallServicesTemplate">服务:[2]</String>
+<String Id="ProgressTextLaunchConditions">正在评估引导条件</String>
+<String Id="ProgressTextMigrateFeatureStates">正在从相关的应用程序迁移功能状态</String>
+<String Id="ProgressTextMigrateFeatureStatesTemplate">应用程序:[1]</String>
+<String Id="ProgressTextMoveFiles">正在移动文件</String>
+<String Id="ProgressTextMoveFilesTemplate">文件:[1], 目录:[9], 尺寸:[6]</String>
+<String Id="ProgressTextPatchFiles">正在修补文件</String>
+<String Id="ProgressTextPatchFilesTemplate">文件:[1], 目录:[2], 尺寸:[3]</String>
+<String Id="ProgressTextProcessComponents">正在更新组件注册</String>
+<String Id="ProgressTextRegisterComPlus">正在注册 COM+ 应用程序和组件</String>
+<String Id="ProgressTextRegisterComPlusTemplate">AppId:[1]{{, AppType:[2],用户:[3],RSN:[4]}}</String>
+<String Id="ProgressTextRegisterFonts">正在注册字体</String>
+<String Id="ProgressTextRegisterFontsTemplate">字体:[1]</String>
+<String Id="ProgressTextRegisterProduct">正在注册产品</String>
+<String Id="ProgressTextRegisterProductTemplate">[1]</String>
+<String Id="ProgressTextRegisterTypeLibraries">正在注册类型库</String>
+<String Id="ProgressTextRegisterTypeLibrariesTemplate">LibID: [1]</String>
+<String Id="ProgressTextRegisterUser">正在注册用户</String>
+<String Id="ProgressTextRegisterUserTemplate">[1]</String>
+<String Id="ProgressTextRemoveDuplicateFiles">正在删除重复的文件</String>
+<String Id="ProgressTextRemoveDuplicateFilesTemplate">文件:[1], 目录:[9]</String>
+<String Id="ProgressTextRemoveEnvironmentStrings">正在更新环境符串</String>
+<String Id="ProgressTextRemoveEnvironmentStringsTemplate">名称:[1], 数值:[2], 动作:[3]</String>
+<String Id="ProgressTextRemoveExistingProducts">正在删除应用程序</String>
+<String Id="ProgressTextRemoveExistingProductsTemplate">应用程序:[1], 命令列:[2]</String>
+<String Id="ProgressTextRemoveFiles">正在删除文件</String>
+<String Id="ProgressTextRemoveFilesTemplate">文件:[1], 目录:[9]</String>
+<String Id="ProgressTextRemoveFolders">正在删除数据夹</String>
+<String Id="ProgressTextRemoveFoldersTemplate">数据夹:[1]</String>
+<String Id="ProgressTextRemoveIniValues">正在删除 INI 文件项目</String>
+<String Id="ProgressTextRemoveIniValuesTemplate">文件:[1], 区段:[2], 机码:[3], 数值:[4]</String>
+<String Id="ProgressTextRemoveODBC">正在删除 ODBC 组件</String>
+<String Id="ProgressTextRemoveRegistryValues">正在删除系统注册档数值</String>
+<String Id="ProgressTextRemoveRegistryValuesTemplate">机码:[1], 名称:[2]</String>
+<String Id="ProgressTextRemoveShortcuts">正在删除快捷方式</String>
+<String Id="ProgressTextRemoveShortcutsTemplate">快捷方式:[1]</String>
+<String Id="ProgressTextRMCCPSearch">正在寻找查询产品</String>
+<String Id="ProgressTextSelfRegModules">正在注册模块</String>
+<String Id="ProgressTextSelfRegModulesTemplate">文件:[1], 数据夹:[2]</String>
+<String Id="ProgressTextSelfUnregModules">正在解除模块注册</String>
+<String Id="ProgressTextSelfUnregModulesTemplate">文件:[1], 数据夹:[2]</String>
+<String Id="ProgressTextSetODBCFolders">正在初始化 ODBC 目录</String>
+<String Id="ProgressTextStartServices">正在引导服务</String>
+<String Id="ProgressTextStartServicesTemplate">服务:[1]</String>
+<String Id="ProgressTextStopServices">正在停止服务</String>
+<String Id="ProgressTextStopServicesTemplate">服务:[1]</String>
+<String Id="ProgressTextUnpublishComponents">正在取消组件公布</String>
+<String Id="ProgressTextUnpublishComponentsTemplate">组件 ID:[1], 公布者:[2]</String>
+<String Id="ProgressTextUnpublishFeatures">正在取消功能公布</String>
+<String Id="ProgressTextUnpublishFeaturesTemplate">功能:[1]</String>
+<String Id="ProgressTextUnregisterClassInfo">解除类型服务器注册</String>
+<String Id="ProgressTextUnregisterClassInfoTemplate">类型 Id:[1]</String>
+<String Id="ProgressTextUnregisterComPlus">正在解除 COM+ 应用程序和组件注册</String>
+<String Id="ProgressTextUnregisterComPlusTemplate">AppId: [1]{{, AppType: [2]}}</String>
+<String Id="ProgressTextUnregisterExtensionInfo">正在解除扩充服务器注册</String>
+<String Id="ProgressTextUnregisterExtensionInfoTemplate">扩展名 [1]</String>
+<String Id="ProgressTextUnregisterFonts">正在解除字体注册</String>
+<String Id="ProgressTextUnregisterFontsTemplate">字体:[1]</String>
+<String Id="ProgressTextUnregisterMIMEInfo">正在解除 MIME 信息注册</String>
+<String Id="ProgressTextUnregisterMIMEInfoTemplate">MIME 内容类型:[1],扩展名:[2]</String>
+<String Id="ProgressTextUnregisterProgIdInfo">正在解除程序标识码注册</String>
+<String Id="ProgressTextUnregisterProgIdInfoTemplate">ProgId: [1]</String>
+<String Id="ProgressTextUnregisterTypeLibraries">正在解除类型库注册</String>
+<String Id="ProgressTextUnregisterTypeLibrariesTemplate">LibID: [1]</String>
+<String Id="ProgressTextWriteEnvironmentStrings">正在更新环境符串</String>
+<String Id="ProgressTextWriteEnvironmentStringsTemplate">名称:[1], 数值:[2], 动作:[3]</String>
+<String Id="ProgressTextWriteIniValues">正在写入 INI 文件数值</String>
+<String Id="ProgressTextWriteIniValuesTemplate">文件:[1], 区段:[2], 机码:[3], 数值:[4]</String>
+<String Id="ProgressTextWriteRegistryValues">正在写入系统注册表</String>
+<String Id="ProgressTextWriteRegistryValuesTemplate">机码:[1],名称:[2],值:[3]</String>
+<String Id="ProgressTextAdvertise">正在宣告应用程序</String>
+<String Id="ProgressTextGenerateScript">正在产生动作的 script 操作:</String>
+<String Id="ProgressTextGenerateScriptTemplate">[1]</String>
+<String Id="ProgressTextInstallSFPCatalogFile">正在安装系统目录</String>
+<String Id="ProgressTextInstallSFPCatalogFileTemplate">文件:[1],依存关系:[2]</String>
+<String Id="ProgressTextMsiPublishAssemblies">正在发布组件信息</String>
+<String Id="ProgressTextMsiPublishAssembliesTemplate">应用程序内容:[1],组件名称:[2]</String>
+<String Id="ProgressTextMsiUnpublishAssemblies">正在取消信息公布</String>
+<String Id="ProgressTextMsiUnpublishAssembliesTemplate">应用程序内容:[1],组件名称:[2]</String>
+<String Id="ProgressTextRollback">恢复动作:</String>
+<String Id="ProgressTextRollbackTemplate">[1]</String>
+<String Id="ProgressTextRollbackCleanup">正在删除备份文件</String>
+<String Id="ProgressTextRollbackCleanupTemplate">文件:[1]</String>
+<String Id="ProgressTextUnmoveFiles">正在删除移动的文件</String>
+<String Id="ProgressTextUnmoveFilesTemplate">文件:[1], 目录:[9]</String>
+<String Id="ProgressTextUnpublishProduct">正在取消发布产品信息</String>
+
+<String Id="UITextbytes">字节</String>
+<String Id="UITextGB">GB</String>
+<String Id="UITextKB">KB</String>
+<String Id="UITextMB">MB</String>
+<String Id="UITextMenuAbsent">整个功能将不可用</String>
+<String Id="UITextMenuAdvertise">需要时将安装的功能</String>
+<String Id="UITextMenuAllCD">整个功能将会安装成从 CD 上执行</String>
+<String Id="UITextMenuAllLocal">整个功能将会安装到本机硬盘</String>
+<String Id="UITextMenuAllNetwork">整个功能将会安装成从网络上执行</String>
+<String Id="UITextMenuCD">将会安装成从 CD 上执行</String>
+<String Id="UITextMenuLocal">将会安装到本机硬盘</String>
+<String Id="UITextMenuNetwork">将会安装成从网络执行</String>
+<String Id="UITextScriptInProgress">正在收集所需的信息...</String>
+<String Id="UITextSelAbsentAbsent">这个功能将保持未安装的状态</String>
+<String Id="UITextSelAbsentAdvertise">这个功能会设置成视需要进行安装</String>
+<String Id="UITextSelAbsentCD">这个功能将会安装成从 CD 执行</String>
+<String Id="UITextSelAbsentLocal">这个功能将会安装在本机硬盘中</String>
+<String Id="UITextSelAbsentNetwork">这个功能将会安装成从网络执行</String>
+<String Id="UITextSelAdvertiseAbsent">这个功能将不能使用</String>
+<String Id="UITextSelAdvertiseAdvertise">将会视需要进行安装</String>
+<String Id="UITextSelAdvertiseCD">这个功能可以从 CD 上执行</String>
+<String Id="UITextSelAdvertiseLocal">这个功能将安装在您的本机硬盘</String>
+<String Id="UITextSelAdvertiseNetwork">这个功能可以从网络执行</String>
+<String Id="UITextSelCDAbsent">这个功能将完整卸载,您将不能从 CD 执行</String>
+<String Id="UITextSelCDAdvertise">这个功能会从 CD 执行更改成视需要进行安装</String>
+<String Id="UITextSelCDCD">这个功能仍将从 CD 执行</String>
+<String Id="UITextSelCDLocal">这个功能将会从 CD 执行更改为安装在本机硬盘中</String>
+<String Id="UITextSelChildCostNeg">这个功能会在您的硬盘释放 [1] 。</String>
+<String Id="UITextSelChildCostPos">这个功能要求 [1] 在您的硬盘上。</String>
+<String Id="UITextSelCostPending">正在编译这个功能的花费...</String>
+<String Id="UITextSelLocalAbsent">这个功能将会完整删除</String>
+<String Id="UITextSelLocalAdvertise">这个功能会从您的本机硬盘上删除,但是会设置成视需要进行安装</String>
+<String Id="UITextSelLocalCD">这个功能将会从您的本机硬盘中删除,但是仍然可以从 CD 执行</String>
+<String Id="UITextSelLocalLocal">这个功能将会保留在您的本机硬盘中</String>
+<String Id="UITextSelLocalNetwork">这个功能将会从您的本机硬盘中删除,但是仍然可从网络上执行</String>
+<String Id="UITextSelNetworkAbsent">这个功能将完整卸载,您将不能从网络执行</String>
+<String Id="UITextSelNetworkAdvertise">这个功能将会从网络执行更改成视需要进行安装</String>
+<String Id="UITextSelNetworkLocal">这个功能将会从网络执行更改为安装在本机硬盘中。</String>
+<String Id="UITextSelNetworkNetwork">这个功能仍将保留成从网络执行</String>
+<String Id="UITextSelParentCostNegNeg">这个功能在您的硬盘释放 [1]。 它已选择 [2] 之 [3] 子功能。 子功能在您的硬盘释放 [4] 。</String>
+<String Id="UITextSelParentCostNegPos">这个功能在您的硬盘释放 [1]。 它已选择 [2] 之 [3] 子功能。 子功能在您的硬盘需要 [4] 。</String>
+<String Id="UITextSelParentCostPosNeg">这个功能在您的硬盘需要 [1]。 它已选择 [2] 之 [3] 子功能。 子功能在您的硬盘释放 [4] 。</String>
+<String Id="UITextSelParentCostPosPos">这个功能在您的硬盘需要 [1]。 它已选择 [2] 之 [3] 子功能。 子功能在您的硬盘需要 [4] 。</String>
+<String Id="UITextTimeRemaining">剩下时间:{[1] 分 }{[2] 秒}</String>
+<String Id="UITextVolumeCostAvailable">可用</String>
+<String Id="UITextVolumeCostDifference">差异</String>
+<String Id="UITextVolumeCostRequired">需求</String>
+<String Id="UITextVolumeCostSize">磁盘空间</String>
+<String Id="UITextVolumeCostVolume">分区</String>
+
+</WixLocalization>
\ No newline at end of file
diff --git a/src/VBox/Installer/win/NLS/zh_TW.wxl b/src/VBox/Installer/win/NLS/zh_TW.wxl
index eaaaf60..aefd522 100644
--- a/src/VBox/Installer/win/NLS/zh_TW.wxl
+++ b/src/VBox/Installer/win/NLS/zh_TW.wxl
@@ -15,7 +15,7 @@
             hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
     -->
 
-    <String Id="LANG">1024</String>
+    <String Id="LANG">1028</String>
     <String Id="LangName">正體中文</String>
 
     <String Id="ButtonText_No">否(&N)</String>
diff --git a/src/VBox/Main/include/DisplayImpl.h b/src/VBox/Main/include/DisplayImpl.h
index 785418e..78ad0ac 100644
--- a/src/VBox/Main/include/DisplayImpl.h
+++ b/src/VBox/Main/include/DisplayImpl.h
@@ -212,9 +212,9 @@ public:
     VIDEORECFEATURES         i_videoRecGetEnabled(void);
     bool                     i_videoRecStarted(void);
 # ifdef VBOX_WITH_AUDIO_VIDEOREC
-    int                      i_videoRecConfigureAudioDriver(const Utf8Str& strAdapter, unsigned uInstance, unsigned uLun, bool fAttach);
+    int                      i_videoRecConfigureAudioDriver(const Utf8Str& strAdapter, unsigned uInstance, unsigned uLUN, bool fAttach);
 # endif
-    static DECLCALLBACK(int) i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg, bool fAttachDetach);
+    static DECLCALLBACK(int) i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg, bool fAttachDetach, unsigned *puLUN);
     int                      i_videoRecSendAudio(const void *pvData, size_t cbData, uint64_t uDurationMs);
     int                      i_videoRecStart(void);
     void                     i_videoRecStop(void);
diff --git a/src/VBox/Main/src-all/win/VBoxProxyStub.c b/src/VBox/Main/src-all/win/VBoxProxyStub.c
index ea307d3..80a44a7 100644
--- a/src/VBox/Main/src-all/win/VBoxProxyStub.c
+++ b/src/VBox/Main/src-all/win/VBoxProxyStub.c
@@ -2297,29 +2297,10 @@ HRESULT STDAPICALLTYPE DllUnregisterServer(void)
 
 
 #ifdef VBOX_WITH_SDS
-
-static BOOL vbpsIsInstalledWindowsService(const WCHAR *pwszServiceName)
-{
-    BOOL fRet = FALSE;
-    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-    if (hSCM != NULL)
-    {
-        SC_HANDLE hService = OpenService(hSCM, pwszServiceName, SERVICE_QUERY_CONFIG);
-        if (hService != NULL)
-        {
-            CloseServiceHandle(hService);
-            fRet = TRUE;
-        }
-        CloseServiceHandle(hSCM);
-    }
-    return fRet;
-}
-
-
 /**
- * Worker for installing a SCM service.
+ * Update a SCM service.
  *
- * @returns Success indicator.
+ * @param   pState              The state.
  * @param   pwszVBoxDir         The VirtualBox install directory (unicode),
  *                              trailing slash.
  * @param   pwszModule          The service module.
@@ -2327,135 +2308,201 @@ static BOOL vbpsIsInstalledWindowsService(const WCHAR *pwszServiceName)
  * @param   pwszDisplayName     The service display name.
  * @param   pwszDescription     The service description.
  */
-static BOOL vbpsInstallWindowsService(const WCHAR *pwszVBoxDir, const WCHAR *pwszModule, const WCHAR *pwszServiceName,
-                                      const WCHAR *pwszDisplayName, const WCHAR *pwszDescription)
+static void vbpsUpdateWindowsService(VBPSREGSTATE *pState, const WCHAR *pwszVBoxDir, const WCHAR *pwszModule,
+                                     const WCHAR *pwszServiceName, const WCHAR *pwszDisplayName, const WCHAR *pwszDescription)
 {
-    BOOL fRet = vbpsIsInstalledWindowsService(pwszServiceName);
-    if (!fRet)
+    SC_HANDLE           hSCM;
+
+    /* Configuration options that are currently standard. */
+    uint32_t const      uServiceType         = SERVICE_WIN32_OWN_PROCESS;
+    uint32_t const      uStartType           = SERVICE_DEMAND_START;
+    uint32_t const      uErrorControl        = SERVICE_ERROR_NORMAL;
+    WCHAR const * const pwszServiceStartName = L"LocalSystem";
+    static WCHAR const  wszzDependencies[]   = L"RPCSS\0";
+
+    /*
+     * Make double quoted executable file path. ASSUMES pwszVBoxDir ends with a slash!
+     */
+    WCHAR wszFilePath[MAX_PATH + 2];
+    int rc = RTUtf16CopyAscii(wszFilePath, RT_ELEMENTS(wszFilePath), "\"");
+    if (RT_SUCCESS(rc))
+        rc = RTUtf16Cat(wszFilePath, RT_ELEMENTS(wszFilePath), pwszVBoxDir);
+    if (RT_SUCCESS(rc))
+        rc = RTUtf16Cat(wszFilePath, RT_ELEMENTS(wszFilePath), pwszModule);
+    if (RT_SUCCESS(rc))
+        rc = RTUtf16CatAscii(wszFilePath, RT_ELEMENTS(wszFilePath), "\"");
+    AssertLogRelRCReturnVoid(rc);
+
+    /*
+     * Open the service manager for the purpose of checking the configuration.
+     */
+    hSCM = OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT);
+    if (hSCM != NULL)
     {
-        /* Make double quoted executable file path. ASSUMES pwszVBoxDir ends with a slash! */
-        WCHAR wszFilePath[MAX_PATH + 2];
-        int rc = RTUtf16CopyAscii(wszFilePath, RT_ELEMENTS(wszFilePath), "\"");
-        if (RT_SUCCESS(rc))
-            rc = RTUtf16Cat(wszFilePath, RT_ELEMENTS(wszFilePath), pwszVBoxDir);
-        if (RT_SUCCESS(rc))
-            rc = RTUtf16Cat(wszFilePath, RT_ELEMENTS(wszFilePath), pwszModule);
-        if (RT_SUCCESS(rc))
-            rc = RTUtf16CatAscii(wszFilePath, RT_ELEMENTS(wszFilePath), "\"");
-        if (RT_SUCCESS(rc))
+        union
+        {
+            QUERY_SERVICE_CONFIGW   Config;
+            SERVICE_STATUS          Status;
+            SERVICE_DESCRIPTION     Desc;
+            uint8_t                 abPadding[sizeof(QUERY_SERVICE_CONFIGW) + 5 * _1K];
+        } uBuf;
+        SC_HANDLE   hService;
+        bool        fCreateIt = pState->fUpdate;
+        bool        fDeleteIt = true;
+
+        /*
+         * Step #1: Open the service and validate the configuration.
+         */
+        if (pState->fUpdate)
         {
-            SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-            if (hSCM != NULL)
+            hService = OpenServiceW(hSCM, pwszServiceName, SERVICE_QUERY_CONFIG);
+            if (hService != NULL)
             {
-                SC_HANDLE hService = CreateService(hSCM, pwszServiceName, pwszDisplayName,
-                                                   SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
-                                                   SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
-                                                   wszFilePath, NULL, NULL, L"RPCSS\0", NULL, NULL);
-                if (hService != NULL)
+                DWORD cbNeeded = 0;
+                if (QueryServiceConfigW(hService, &uBuf.Config, sizeof(uBuf), &cbNeeded))
                 {
-                    SERVICE_DESCRIPTION sd;
-                    sd.lpDescription = (WCHAR *)pwszDescription;
-                    if (ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &sd))
-                        fRet = TRUE;
-                    else
-                        AssertMsgFailed(("Could not set service description for %ls: %u\n", pwszServiceName, GetLastError()));
-                    CloseServiceHandle(hService);
+                    if (uBuf.Config.dwErrorControl)
+                    {
+                        uint32_t cErrors = 0;
+                        if (uBuf.Config.dwServiceType != uServiceType)
+                        {
+                            LogRel(("update service '%ls': dwServiceType %u, expected %u\n",
+                                    pwszServiceName, uBuf.Config.dwServiceType, uServiceType));
+                            cErrors++;
+                        }
+                        if (uBuf.Config.dwStartType != uStartType)
+                        {
+                            LogRel(("update service '%ls': dwStartType %u, expected %u\n",
+                                    pwszServiceName, uBuf.Config.dwStartType, uStartType));
+                            cErrors++;
+                        }
+                        if (uBuf.Config.dwErrorControl != uErrorControl)
+                        {
+                            LogRel(("update service '%ls': dwErrorControl %u, expected %u\n",
+                                    pwszServiceName, uBuf.Config.dwErrorControl, uErrorControl));
+                            cErrors++;
+                        }
+                        if (RTUtf16ICmp(uBuf.Config.lpBinaryPathName, wszFilePath) != 0)
+                        {
+                            LogRel(("update service '%ls': lpBinaryPathName '%ls', expected '%ls'\n",
+                                    pwszServiceName, uBuf.Config.lpBinaryPathName, wszFilePath));
+                            cErrors++;
+                        }
+                        if (   uBuf.Config.lpServiceStartName != NULL
+                            && *uBuf.Config.lpServiceStartName != L'\0'
+                            && RTUtf16ICmp(uBuf.Config.lpServiceStartName, pwszServiceStartName) != 0)
+                        {
+                            LogRel(("update service '%ls': lpServiceStartName '%ls', expected '%ls'\n",
+                                    pwszServiceName, uBuf.Config.lpBinaryPathName, pwszServiceStartName));
+                            cErrors++;
+                        }
+
+                        fDeleteIt = fCreateIt = cErrors > 0;
+                    }
                 }
                 else
-                    AssertMsgFailed(("Could not create service %ls: %u\n", pwszServiceName, GetLastError()));
-                CloseServiceHandle(hSCM);
+                    AssertLogRelMsgFailed(("QueryServiceConfigW returned %u (cbNeeded=%u vs %zu)\n",
+                                           GetLastError(), cbNeeded, sizeof(uBuf)));
             }
             else
-                AssertMsg(GetLastError() == ERROR_ACCESS_DENIED,
-                          ("Could not open service %ls: %u\n", pwszServiceName, GetLastError()));
+            {
+                DWORD dwErr = GetLastError();
+                fDeleteIt = dwErr != ERROR_SERVICE_DOES_NOT_EXIST;
+                AssertLogRelMsg(dwErr == ERROR_SERVICE_DOES_NOT_EXIST, ("OpenServiceW('%ls') -> %u\n", pwszServiceName, dwErr));
+            }
+            CloseServiceHandle(hService);
         }
-        else
-            AssertMsgFailed(("Could not open Service Manager: %u\n", GetLastError()));
-    }
-    return fRet;
-}
-
 
-/**
- * Worker for uninstalling a SCM service.
- *
- * @returns Success indicator.
- * @param   pwszServiceName The name of the SCM service.
- */
-static BOOL vbpsUninstallWindowsService(const WCHAR *pwszServiceName)
-{
-    BOOL fRet = !vbpsIsInstalledWindowsService(pwszServiceName);
-    if (!fRet)
-    {
-        SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-        if (hSCM != NULL)
+        /*
+         * Step #2: Stop and delete the service if needed.
+         *          We can do this without reopening the service manager.
+         */
+        if (fDeleteIt)
         {
-            SC_HANDLE hService = OpenService(hSCM, pwszServiceName, SERVICE_STOP | DELETE);
+            hService = OpenServiceW(hSCM, pwszServiceName, SERVICE_STOP | DELETE);
             if (hService)
             {
-                DWORD          dwErr;
-                SERVICE_STATUS Status;
-                RT_ZERO(Status);
-                fRet = ControlService(hService, SERVICE_CONTROL_STOP, &Status);
+                BOOL            fRet;
+                DWORD           dwErr;
+                RT_ZERO(uBuf.Status);
+                SetLastError(ERROR_SERVICE_NOT_ACTIVE);
+                fRet = ControlService(hService, SERVICE_CONTROL_STOP, &uBuf.Status);
                 dwErr = GetLastError();
                 if (   fRet
                     || dwErr == ERROR_SERVICE_NOT_ACTIVE
                     || (   dwErr == ERROR_SERVICE_CANNOT_ACCEPT_CTRL
-                        && Status.dwCurrentState == SERVICE_STOP_PENDING) )
+                        && uBuf.Status.dwCurrentState == SERVICE_STOP_PENDING) )
                 {
-                    fRet = DeleteService(hService);
-                    AssertMsg(fRet, ("Could not delete service %ls: %u\n", pwszServiceName, GetLastError()));
+                    if (DeleteService(hService))
+                        LogRel(("update service '%ls': deleted\n", pwszServiceName));
+                    else
+                        AssertLogRelMsgFailed(("Failed to not delete service %ls: %u\n", pwszServiceName, GetLastError()));
                 }
                 else
                     AssertMsg(dwErr == ERROR_ACCESS_DENIED,
-                              ("Could not stop service %ls: %u (state=%u)\n", pwszServiceName, dwErr, Status.dwCurrentState));
+                              ("Failed to stop service %ls: %u (state=%u)\n", pwszServiceName, dwErr, uBuf.Status.dwCurrentState));
                 CloseServiceHandle(hService);
             }
             else
-                AssertMsg(GetLastError() == ERROR_ACCESS_DENIED,
-                          ("Could not open service %ls: %u\n", pwszServiceName, GetLastError()));
-            CloseServiceHandle(hSCM);
+            {
+                pState->rc = GetLastError();
+                LogRel(("Failed to not open service %ls for stop+delete: %u\n", pwszServiceName, pState->rc));
+                hService = OpenServiceW(hSCM, pwszServiceName, SERVICE_CHANGE_CONFIG);
+            }
+            CloseServiceHandle(hService);
         }
-        else
-            AssertMsgFailed(("Could not open Service Manager: %u\n", GetLastError()));
-    }
-    return fRet;
-}
-
 
-/**
- * Updates the VBoxSDS service with SCM.
- *
- * @param   pState              The registry modifier state.
- * @param   pwszVBoxDir         The VirtualBox install directory (unicode),
- *                              trailing slash.
- */
-static void vbpsUpdateVBoxSDSWindowsService(VBPSREGSTATE *pState, const WCHAR *pwszVBoxDir)
-{
-    const WCHAR s_wszModuleName[]         = L"VBoxSDS.exe";
-    const WCHAR s_wszServiceName[]        = L"VBoxSDS";
-    const WCHAR s_wszServiceDisplayName[] = L"VirtualBox system service";
-    const WCHAR s_wszServiceDescription[] = L"Used as a COM server for VirtualBox API.";
+        CloseServiceHandle(hSCM);
 
-    if (pState->fUpdate)
-    {
-        if (!vbpsInstallWindowsService(pwszVBoxDir, s_wszModuleName, s_wszServiceName,
-                                       s_wszServiceDisplayName, s_wszServiceDescription))
-        {
-            LogWarnFunc(("Error: Windows service '%ls' cannot be registered\n", s_wszServiceName));
-            pState->rc = E_FAIL;
-        }
-    }
-    else if (pState->fDelete)
-    {
-        if (!vbpsUninstallWindowsService(s_wszServiceName))
+        /*
+         * Step #3: Create the service (if requested).
+         *          Need to have the SC_MANAGER_CREATE_SERVICE access right for this.
+         */
+        if (fCreateIt)
         {
-            LogWarnFunc(("Error: Windows service '%ls' cannot be unregistered\n", s_wszServiceName));
-            pState->rc = E_FAIL;
+            Assert(pState->fUpdate);
+            hSCM = OpenSCManagerW(NULL, NULL, SC_MANAGER_CREATE_SERVICE | SC_MANAGER_CONNECT);
+            if (hSCM)
+            {
+                hService = CreateServiceW(hSCM,
+                                          pwszServiceName,
+                                          pwszDisplayName,
+                                          SERVICE_ALL_ACCESS /* dwDesiredAccess */,
+                                          uServiceType,
+                                          uStartType,
+                                          uErrorControl,
+                                          wszFilePath,
+                                          NULL /* pwszLoadOrderGroup */,
+                                          NULL /* pdwTagId */,
+                                          wszzDependencies,
+                                          NULL /* pwszServiceStartName */,
+                                          NULL /* pwszPassword */);
+                if (hService != NULL)
+                {
+                    uBuf.Desc.lpDescription = (WCHAR *)pwszDescription;
+                    if (ChangeServiceConfig2W(hService, SERVICE_CONFIG_DESCRIPTION, &uBuf.Desc))
+                        LogRel(("update service '%ls': created\n", pwszServiceName));
+                    else
+                        AssertMsgFailed(("Failed to set service description for %ls: %u\n", pwszServiceName, GetLastError()));
+                    CloseServiceHandle(hService);
+                }
+                else
+                {
+                    pState->rc = GetLastError();
+                    AssertMsgFailed(("Failed to create service '%ls': %u\n", pwszServiceName, pState->rc));
+                }
+                CloseServiceHandle(hSCM);
+            }
+            else
+            {
+                pState->rc = GetLastError();
+                LogRel(("Failed to open service manager with create service access: %u\n", pState->rc));
+            }
         }
     }
+    else
+        AssertLogRelMsgFailed(("OpenSCManagerW failed: %u\n", GetLastError()));
 }
-
 #endif /* VBOX_WITH_SDS */
 
 
@@ -2497,7 +2544,8 @@ DECLEXPORT(uint32_t) VbpsUpdateRegistrations(void)
     {
 
 #ifdef VBOX_WITH_SDS
-        vbpsUpdateVBoxSDSWindowsService(&State, wszVBoxDir);
+        vbpsUpdateWindowsService(&State, wszVBoxDir, L"VBoxSDS.exe", L"VBoxSDS",
+                                 L"VirtualBox system service", L"Used as a COM server for VirtualBox API.");
 #endif
         vbpsUpdateTypeLibRegistration(&State, wszVBoxDir, fIs32On64);
         vbpsUpdateProxyStubRegistration(&State, wszVBoxDir, fIs32On64);
@@ -2519,9 +2567,6 @@ DECLEXPORT(uint32_t) VbpsUpdateRegistrations(void)
                          !fIs32On64 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY);
         if (rc == ERROR_SUCCESS && !vbpsIsUpToDate(&State))
         {
-#ifdef VBOX_WITH_SDS
-            vbpsUpdateVBoxSDSWindowsService(&State, wszVBoxDir);
-#endif
             vbpsUpdateTypeLibRegistration(&State, wszVBoxDir, !fIs32On64);
             vbpsUpdateProxyStubRegistration(&State, wszVBoxDir, !fIs32On64);
             vbpsUpdateInterfaceRegistrations(&State);
diff --git a/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/VBox/Main/src-client/ConsoleImpl.cpp
index 575d81c..0c3ef54 100644
--- a/src/VBox/Main/src-client/ConsoleImpl.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl.cpp
@@ -5516,9 +5516,15 @@ HRESULT Console::i_onVideoCaptureChange()
             /* Release lock because the call scheduled on EMT may also try to take it. */
             alock.release();
 
+            const PVIDEORECCFG pCfg = pDisplay->i_videoRecGetConfig();
+# ifdef VBOX_WITH_AUDIO_VIDEOREC
+            const unsigned     uLUN = pCfg->Audio.uLUN; /* Get the currently configured LUN. */
+# else
+            const unsigned     uLUN = 0;
+# endif
             int vrc = VMR3ReqCallWaitU(ptrVM.rawUVM(), VMCPUID_ANY /*idDstCpu*/,
-                                       (PFNRT)Display::i_videoRecConfigure, 3,
-                                       pDisplay, pDisplay->i_videoRecGetConfig(), true /* fAttachDetach */);
+                                       (PFNRT)Display::i_videoRecConfigure, 4,
+                                       pDisplay, pCfg, true /* fAttachDetach */, &uLUN);
             if (RT_SUCCESS(vrc))
             {
                 /* Make sure to acquire the lock again after we're done running in EMT. */
diff --git a/src/VBox/Main/src-client/ConsoleImpl2.cpp b/src/VBox/Main/src-client/ConsoleImpl2.cpp
index 61dbf0a..d3d2ac6 100644
--- a/src/VBox/Main/src-client/ConsoleImpl2.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl2.cpp
@@ -2837,6 +2837,12 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
             AudioCodecType_T audioCodec;
             hrc = audioAdapter->COMGETTER(AudioCodec)(&audioCodec);                         H();
 
+            GetExtraDataBoth(virtualBox, pMachine, "VBoxInternal2/Audio/Debug/Enabled", &strTmp);
+            const uint64_t fDebugEnabled = (strTmp.equalsIgnoreCase("true") || strTmp.equalsIgnoreCase("1")) ? 1 : 0;
+
+            Utf8Str strDebugPathOut;
+            GetExtraDataBoth(virtualBox, pMachine, "VBoxInternal2/Audio/Debug/PathOut", &strDebugPathOut);
+
             switch (audioController)
             {
                 case AudioControllerType_AC97:
@@ -2887,6 +2893,9 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
                     InsertConfigInteger(pInst,    "Trusted",               1); /* boolean */
                     hrc = pBusMgr->assignPCIDevice(strAudioDevice.c_str(), pInst);          H();
                     InsertConfigNode   (pInst,    "Config",                &pCfg);
+
+                        InsertConfigInteger(pCfg, "DebugEnabled", fDebugEnabled);
+                        InsertConfigString (pCfg, "DebugPathOut", strDebugPathOut);
                 }
             }
 
@@ -2977,21 +2986,22 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
                 default: AssertFailedBreak();
             }
 
-            uint8_t u8AudioLUN = 0;
+            unsigned uAudioLUN = 0;
 
-            CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", u8AudioLUN++);
-            InsertConfigString(pLunL0, "Driver", "AUDIO");
-            InsertConfigNode(pLunL0,   "Config", &pCfg);
+            BOOL fAudioEnabledIn = FALSE;
+            hrc = audioAdapter->COMGETTER(EnabledIn)(&fAudioEnabledIn);                     H();
+            BOOL fAudioEnabledOut = FALSE;
+            hrc = audioAdapter->COMGETTER(EnabledOut)(&fAudioEnabledOut);                   H();
 
-                InsertConfigString(pCfg, "DriverName", strAudioDriver.c_str());
+            CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", uAudioLUN++);
+            InsertConfigString(pLunL0, "Driver", "AUDIO");
 
-                BOOL fAudioEnabledIn = FALSE;
-                hrc = audioAdapter->COMGETTER(EnabledIn)(&fAudioEnabledIn);                     H();
+            InsertConfigNode(pLunL0,   "Config", &pCfg);
+                InsertConfigString (pCfg, "DriverName",    strAudioDriver.c_str());
                 InsertConfigInteger(pCfg, "InputEnabled",  fAudioEnabledIn);
-
-                BOOL fAudioEnabledOut = FALSE;
-                hrc = audioAdapter->COMGETTER(EnabledOut)(&fAudioEnabledOut);                   H();
                 InsertConfigInteger(pCfg, "OutputEnabled", fAudioEnabledOut);
+                InsertConfigInteger(pCfg, "DebugEnabled",  fDebugEnabled);
+                InsertConfigString (pCfg, "DebugPathOut",  strDebugPathOut);
 
                 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1);
 
@@ -3006,13 +3016,15 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
             /*
              * The VRDE audio backend driver.
              */
-            CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", u8AudioLUN++);
+            CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", uAudioLUN++);
             InsertConfigString(pLunL0, "Driver", "AUDIO");
 
             InsertConfigNode(pLunL0,   "Config", &pCfg);
                 InsertConfigString (pCfg, "DriverName",    "AudioVRDE");
                 InsertConfigInteger(pCfg, "InputEnabled",  fAudioEnabledIn);
                 InsertConfigInteger(pCfg, "OutputEnabled", fAudioEnabledOut);
+                InsertConfigInteger(pCfg, "DebugEnabled",  fDebugEnabled);
+                InsertConfigString (pCfg, "DebugPathOut",  strDebugPathOut);
 
             InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1);
                 InsertConfigString(pLunL1, "Driver", "AudioVRDE");
@@ -3029,26 +3041,28 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
             {
                 /* Note: Don't do any driver attaching (fAttachDetach) here, as this will
                  *       be done automatically as part of the VM startup process. */
-                pDisplay->i_videoRecConfigure(pDisplay, pDisplay->i_videoRecGetConfig(), false /* fAttachDetach */);
+                rc = pDisplay->i_videoRecConfigure(pDisplay, pDisplay->i_videoRecGetConfig(), false /* fAttachDetach */,
+                                                   &uAudioLUN);
+                if (RT_SUCCESS(rc)) /* Successfully configured, use next LUN for drivers below. */
+                    uAudioLUN++;
             }
 #endif /* VBOX_WITH_AUDIO_VIDEOREC */
 
-            GetExtraDataBoth(virtualBox, pMachine, "VBoxInternal2/Audio/Debug/Enabled", &strTmp);
-
-            if (!strTmp.isEmpty())
+            if (fDebugEnabled)
             {
-                LogRel(("Audio: Debugging enabled\n"));
-
 #ifdef VBOX_WITH_AUDIO_DEBUG
                 /*
                  * The audio debugging backend.
                  */
-                CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", u8AudioLUN++);
+                CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", uAudioLUN++);
                 InsertConfigString(pLunL0, "Driver", "AUDIO");
+
                 InsertConfigNode(pLunL0,   "Config", &pCfg);
-                    InsertConfigString (pCfg, "DriverName", "DebugAudio");
+                    InsertConfigString (pCfg, "DriverName",    "DebugAudio");
                     InsertConfigInteger(pCfg, "InputEnabled",  fAudioEnabledIn);
                     InsertConfigInteger(pCfg, "OutputEnabled", fAudioEnabledOut);
+                    InsertConfigInteger(pCfg, "DebugEnabled",  fDebugEnabled);
+                    InsertConfigString (pCfg, "DebugPathOut",  strDebugPathOut);
 
                 InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1);
 
@@ -3078,12 +3092,14 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
             /*
              * The ValidationKit backend.
              */
-            CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", u8AudioLUN++);
+            CFGMR3InsertNodeF(pInst, &pLunL0, "LUN#%RU8", uAudioLUN++);
             InsertConfigString(pLunL0, "Driver", "AUDIO");
             InsertConfigNode(pLunL0,   "Config", &pCfg);
-                InsertConfigString (pCfg, "DriverName",    "DebugAudio");
+                InsertConfigString (pCfg, "DriverName",    "ValidationKitAudio");
                 InsertConfigInteger(pCfg, "InputEnabled",  fAudioEnabledIn);
                 InsertConfigInteger(pCfg, "OutputEnabled", fAudioEnabledOut);
+                InsertConfigInteger(pCfg, "DebugEnabled",  fDebugEnabled);
+                InsertConfigString (pCfg, "DebugPathOut",  strDebugPathOut);
 
             InsertConfigNode(pLunL0, "AttachedDriver", &pLunL1);
 
diff --git a/src/VBox/Main/src-client/DisplayImpl.cpp b/src/VBox/Main/src-client/DisplayImpl.cpp
index 3c60de3..599b653 100644
--- a/src/VBox/Main/src-client/DisplayImpl.cpp
+++ b/src/VBox/Main/src-client/DisplayImpl.cpp
@@ -2423,15 +2423,15 @@ bool Display::i_videoRecStarted(void)
  * @returns VBox status code.
  * @param   strDevice           The PDM device name.
  * @param   uInstance           The PDM device instance.
- * @param   uLun                The PDM LUN number of the drive.
+ * @param   uLUN                The PDM LUN number of the driver.
  * @param   fAttach             Whether to attach or detach the driver configuration to CFGM.
  *
  * @thread EMT
  */
 int Display::i_videoRecConfigureAudioDriver(const Utf8Str& strDevice,
-                                                unsigned       uInstance,
-                                                unsigned       uLun,
-                                                bool           fAttach)
+                                            unsigned       uInstance,
+                                            unsigned       uLUN,
+                                            bool           fAttach)
 {
     if (strDevice.isEmpty()) /* No audio device configured. Bail out. */
         return VINF_SUCCESS;
@@ -2452,7 +2452,7 @@ int Display::i_videoRecConfigureAudioDriver(const Utf8Str& strDevice,
     PCFGMNODE pDev0   = CFGMR3GetChildF(pRoot, "Devices/%s/%u/", strDevice.c_str(), uInstance);
     AssertPtr(pDev0);
 
-    PCFGMNODE pDevLun = CFGMR3GetChildF(pDev0, "LUN#%u/", uLun);
+    PCFGMNODE pDevLun = CFGMR3GetChildF(pDev0, "LUN#%u/", uLUN);
 
     if (fAttach)
     {
@@ -2461,7 +2461,7 @@ int Display::i_videoRecConfigureAudioDriver(const Utf8Str& strDevice,
             LogRel2(("VideoRec: Attaching audio driver\n"));
 
             PCFGMNODE pLunL0;
-            CFGMR3InsertNodeF(pDev0, &pLunL0, "LUN#%RU8", uLun);
+            CFGMR3InsertNodeF(pDev0, &pLunL0, "LUN#%RU8", uLUN);
             CFGMR3InsertString(pLunL0, "Driver", "AUDIO");
 
             PCFGMNODE pCfg;
@@ -2493,18 +2493,22 @@ int Display::i_videoRecConfigureAudioDriver(const Utf8Str& strDevice,
 #endif
 
 /**
- * Configures video capturing and attaches / detaches the associated driver(s).
+ * Configures video capturing (via CFGM) and attaches / detaches the associated driver.
+ * Currently this only is the audio driver (if available).
  *
  * @returns IPRT status code.
  * @param   pThis               Display instance to configure video capturing for.
  * @param   pCfg                Where to store the configuration into.
  * @param   fAttachDetach       Whether to attach/detach associated drivers or not.
+ * @param   puLUN               On input, this defines the LUN to which the audio driver shall be assigned to.
+ *                              On output, this returns the LUN the audio driver was assigned to.
  */
 /* static */
-DECLCALLBACK(int) Display::i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg, bool fAttachDetach)
+DECLCALLBACK(int) Display::i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg, bool fAttachDetach, unsigned *puLUN)
 {
     AssertPtrReturn(pThis, VERR_INVALID_POINTER);
     AssertPtrReturn(pCfg,  VERR_INVALID_POINTER);
+    AssertPtrReturn(puLUN, VERR_INVALID_POINTER);
 
     AssertPtr(pThis->mParent);
     ComPtr<IMachine> pMachine = pThis->mParent->i_machine();
@@ -2640,20 +2644,21 @@ DECLCALLBACK(int) Display::i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg
 
     } /* while */
 
+    unsigned uLUN = *puLUN;
+
 #ifdef VBOX_WITH_AUDIO_VIDEOREC
     ComPtr<IAudioAdapter> audioAdapter;
     rc = pMachine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
     AssertComRC(rc);
 
+    unsigned uInstance = 0;
+
     Utf8Str strAudioDev = pThis->mParent->i_getAudioAdapterDeviceName(audioAdapter);
     if (!strAudioDev.isEmpty())
     {
         Console::SafeVMPtr ptrVM(pThis->mParent);
         Assert(ptrVM.isOk());
 
-        unsigned uInstance = 0;
-        unsigned uLun      = 2; /** @todo Make this configurable. */
-
         /*
          * Configure + attach audio driver.
          */
@@ -2663,11 +2668,11 @@ DECLCALLBACK(int) Display::i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg
 
         if (pCfg->Audio.fEnabled) /* Enable */
         {
-            vrc2 = pThis->i_videoRecConfigureAudioDriver(strAudioDev, uInstance, uLun, true /* fAttach */);
+            vrc2 = pThis->i_videoRecConfigureAudioDriver(strAudioDev, uInstance, uLUN, true /* fAttach */);
             if (   RT_SUCCESS(vrc2)
                 && fAttachDetach)
             {
-                vrc2 = PDMR3DriverAttach(ptrVM.rawUVM(), strAudioDev.c_str(), uInstance, uLun, 0 /* fFlags */, NULL /* ppBase */);
+                vrc2 = PDMR3DriverAttach(ptrVM.rawUVM(), strAudioDev.c_str(), uInstance, uLUN, 0 /* fFlags */, NULL /* ppBase */);
             }
 
             if (RT_FAILURE(vrc2))
@@ -2676,12 +2681,12 @@ DECLCALLBACK(int) Display::i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg
         else /* Disable */
         {
             if (fAttachDetach)
-                vrc2 = PDMR3DriverDetach(ptrVM.rawUVM(), strAudioDev.c_str(), uInstance, uLun, "AUDIO",
+                vrc2 = PDMR3DriverDetach(ptrVM.rawUVM(), strAudioDev.c_str(), uInstance, uLUN, "AUDIO",
                                          0 /* iOccurance */, 0 /* fFlags */);
 
             if (RT_SUCCESS(vrc2))
             {
-                vrc2 = pThis->i_videoRecConfigureAudioDriver(strAudioDev, uInstance, uLun, false /* fAttach */);
+                vrc2 = pThis->i_videoRecConfigureAudioDriver(strAudioDev, uInstance, uLUN, false /* fAttach */);
             }
 
             if (RT_FAILURE(vrc2))
@@ -2710,6 +2715,9 @@ DECLCALLBACK(int) Display::i_videoRecConfigure(Display *pThis, PVIDEORECCFG pCfg
 
     }
 
+    if (puLUN)
+        *puLUN = uLUN;
+
     return S_OK;
 }
 
diff --git a/src/VBox/Main/src-client/DrvAudioVideoRec.cpp b/src/VBox/Main/src-client/DrvAudioVideoRec.cpp
index eaed062..3bd0679 100644
--- a/src/VBox/Main/src-client/DrvAudioVideoRec.cpp
+++ b/src/VBox/Main/src-client/DrvAudioVideoRec.cpp
@@ -752,10 +752,10 @@ static DECLCALLBACK(int) drvAudioVideoRecStreamPlay(PPDMIHOSTAUDIO pInterface, P
                                            (opus_int16 *)abSrc, csFrame, abDst, (opus_int32)cbDst);
         if (cbWritten > 0)
         {
-# ifdef VBOX_WITH_STATISTICS
             /* Get overall frames encoded. */
             const uint32_t cEncFrames     = opus_packet_get_nb_frames(abDst, cbWritten);
 
+# ifdef VBOX_WITH_STATISTICS
             pSink->Codec.STAM.cEncFrames += cEncFrames;
             pSink->Codec.STAM.msEncTotal += pSink->Codec.Opus.msFrame * cEncFrames;
 
diff --git a/src/VBox/Main/src-client/VideoRec.h b/src/VBox/Main/src-client/VideoRec.h
index ac86395..bb83433 100644
--- a/src/VBox/Main/src-client/VideoRec.h
+++ b/src/VBox/Main/src-client/VideoRec.h
@@ -95,6 +95,8 @@ typedef struct VIDEORECCFG
     {
         /** Whether audio recording is enabled or not. */
         bool                fEnabled;
+        /** The device LUN the audio driver is attached / configured to. */
+        unsigned            uLUN;
         /** Hertz (Hz) rate. */
         uint16_t            uHz;
         /** Bits per sample. */
diff --git a/src/VBox/Runtime/Makefile.kmk b/src/VBox/Runtime/Makefile.kmk
index 88a0dbf..ba4b670 100644
--- a/src/VBox/Runtime/Makefile.kmk
+++ b/src/VBox/Runtime/Makefile.kmk
@@ -2561,11 +2561,7 @@ RuntimeR0Drv_SOURCES.freebsd = \
 
 RuntimeR0Drv_SOURCES.netbsd = \
 	common/misc/thread.cpp \
-	common/string/memchr.asm \
-	common/string/memmove.asm \
 	common/string/strpbrk.cpp \
-	common/string/memcmp.asm \
-	common/string/strchr.asm \
 	generic/RTAssertShouldPanic-generic.cpp \
 	generic/RTLogWriteDebugger-generic.cpp \
 	generic/RTTimerCreate-generic.cpp \
diff --git a/src/VBox/Runtime/common/fs/isomaker.cpp b/src/VBox/Runtime/common/fs/isomaker.cpp
index 6fe103f..a6955aa 100644
--- a/src/VBox/Runtime/common/fs/isomaker.cpp
+++ b/src/VBox/Runtime/common/fs/isomaker.cpp
@@ -5529,6 +5529,12 @@ static DECLCALLBACK(int) rtFsIsoMakerOutFile_Close(void *pvThis)
     RTFsIsoMakerRelease(pThis->pIsoMaker);
     pThis->pIsoMaker = NULL;
 
+    if (pThis->hVfsSrcFile != NIL_RTVFSFILE)
+    {
+        RTVfsFileRelease(pThis->hVfsSrcFile);
+        pThis->hVfsSrcFile = NIL_RTVFSFILE;
+    }
+
     return VINF_SUCCESS;
 }
 
@@ -5822,8 +5828,13 @@ static void rtFsIosMakerOutFile_GenerateRockRidge(PRTFSISOMAKERNAME pName, uint8
             pPX->uid.le         = RT_H2LE_U32((uint32_t)pName->uid);
             pPX->gid.be         = RT_H2BE_U32((uint32_t)pName->gid);
             pPX->gid.le         = RT_H2LE_U32((uint32_t)pName->gid);
+#if 0 /* This is confusing solaris.  Looks like it has code assuming inode numbers are block numbers and ends up mistaking files for the root dir.  Sigh. */
             pPX->INode.be       = RT_H2BE_U32((uint32_t)pName->pObj->idxObj + 1); /* Don't use zero - isoinfo doesn't like it. */
             pPX->INode.le       = RT_H2LE_U32((uint32_t)pName->pObj->idxObj + 1);
+#else
+            pPX->INode.be       = 0;
+            pPX->INode.le       = 0;
+#endif
             pbSys += sizeof(*pPX);
             cbSys -= sizeof(*pPX);
         }
diff --git a/src/VBox/VMM/VMMR3/TM.cpp b/src/VBox/VMM/VMMR3/TM.cpp
index d3b9a9b..5d17069 100644
--- a/src/VBox/VMM/VMMR3/TM.cpp
+++ b/src/VBox/VMM/VMMR3/TM.cpp
@@ -147,6 +147,7 @@
 #include <iprt/asm.h>
 #include <iprt/asm-math.h>
 #include <iprt/assert.h>
+#include <iprt/file.h>
 #include <iprt/thread.h>
 #include <iprt/time.h>
 #include <iprt/timer.h>
@@ -346,6 +347,7 @@ VMM_INT_DECL(int) TMR3Init(PVM pVM)
                               "CatchUpPrecentage4|CatchUpPrecentage5|CatchUpPrecentage6|CatchUpPrecentage7|"
                               "CatchUpPrecentage8|CatchUpPrecentage9|"
                               "UTCOffset|"
+                              "UTCTouchFileOnJump|"
                               "WarpDrivePercentage|"
                               "HostHzMax|"
                               "HostHzFudgeFactorTimerCpu|"
@@ -353,7 +355,8 @@ VMM_INT_DECL(int) TMR3Init(PVM pVM)
                               "HostHzFudgeFactorCatchUp100|"
                               "HostHzFudgeFactorCatchUp200|"
                               "HostHzFudgeFactorCatchUp400|"
-                              "TimerMillies",
+                              "TimerMillies"
+                              ,
                               "",
                               "TM", 0);
     if (RT_FAILURE(rc))
@@ -538,6 +541,15 @@ VMM_INT_DECL(int) TMR3Init(PVM pVM)
         return VMSetError(pVM, rc, RT_SRC_POS,
                           N_("Configuration error: Failed to querying 64-bit integer value \"UTCOffset\""));
 
+    /** @cfgm{/TM/UTCTouchFileOnJump, string, none}
+     * File to be written to everytime the host time jumps.  */
+    rc = CFGMR3QueryStringAlloc(pCfgHandle, "UTCTouchFileOnJump", &pVM->tm.s.pszUtcTouchFileOnJump);
+    if (rc == VERR_CFGM_VALUE_NOT_FOUND)
+        pVM->tm.s.pszUtcTouchFileOnJump = NULL;
+    else if (RT_FAILURE(rc))
+        return VMSetError(pVM, rc, RT_SRC_POS,
+                          N_("Configuration error: Failed to querying string value \"UTCTouchFileOnJump\""));
+
     /*
      * Setup the warp drive.
      */
@@ -2809,7 +2821,9 @@ VMMR3DECL(int) TMR3TimerSetCritSect(PTMTIMERR3 pTimer, PPDMCRITSECT pCritSect)
  */
 VMMR3_INT_DECL(PRTTIMESPEC) TMR3UtcNow(PVM pVM, PRTTIMESPEC pTime)
 {
-    /* Get a stable set of VirtualSync parameters before querying UTC. */
+    /*
+     * Get a stable set of VirtualSync parameters and calc the lag.
+     */
     uint64_t offVirtualSync;
     uint64_t offVirtualSyncGivenUp;
     do
@@ -2821,9 +2835,42 @@ VMMR3_INT_DECL(PRTTIMESPEC) TMR3UtcNow(PVM pVM, PRTTIMESPEC pTime)
     Assert(offVirtualSync >= offVirtualSyncGivenUp);
     uint64_t const offLag = offVirtualSync - offVirtualSyncGivenUp;
 
+    /*
+     * Get current time and adjust for virtual sync lag and do time displacement.
+     */
     RTTimeNow(pTime);
     RTTimeSpecSubNano(pTime, offLag);
     RTTimeSpecAddNano(pTime, pVM->tm.s.offUTC);
+
+    /*
+     * Log details if the time changed radically (also triggers on first call).
+     */
+    int64_t nsPrev = ASMAtomicXchgS64(&pVM->tm.s.nsLastUtcNow, RTTimeSpecGetNano(pTime));
+    int64_t cNsDelta = RTTimeSpecGetNano(pTime) - nsPrev;
+    if ((uint64_t)RT_ABS(cNsDelta) > RT_NS_1HOUR / 2)
+    {
+        RTTIMESPEC NowAgain;
+        RTTimeNow(&NowAgain);
+        LogRel(("TMR3UtcNow: nsNow=%'RI64 nsPrev=%'RI64 -> cNsDelta=%'RI64 (offLag=%'RI64 offVirtualSync=%'RU64 offVirtualSyncGivenUp=%'RU64, NowAgain=%'RI64)\n",
+                RTTimeSpecGetNano(pTime), nsPrev, cNsDelta, offLag, offVirtualSync, offVirtualSyncGivenUp, RTTimeSpecGetNano(&NowAgain)));
+        if (pVM->tm.s.pszUtcTouchFileOnJump && nsPrev != 0)
+        {
+            RTFILE hFile;
+            int rc = RTFileOpen(&hFile, pVM->tm.s.pszUtcTouchFileOnJump,
+                                RTFILE_O_WRITE | RTFILE_O_APPEND | RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_NONE);
+            if (RT_SUCCESS(rc))
+            {
+                char   szMsg[256];
+                size_t cch;
+                cch = RTStrPrintf(szMsg, sizeof(szMsg),
+                                  "TMR3UtcNow: nsNow=%'RI64 nsPrev=%'RI64 -> cNsDelta=%'RI64 (offLag=%'RI64 offVirtualSync=%'RU64 offVirtualSyncGivenUp=%'RU64, NowAgain=%'RI64)\n",
+                                  RTTimeSpecGetNano(pTime), nsPrev, cNsDelta, offLag, offVirtualSync, offVirtualSyncGivenUp, RTTimeSpecGetNano(&NowAgain));
+                RTFileWrite(hFile, szMsg, cch, NULL);
+                RTFileClose(hFile);
+            }
+        }
+    }
+
     return pTime;
 }
 
diff --git a/src/VBox/VMM/include/TMInternal.h b/src/VBox/VMM/include/TMInternal.h
index c913728..a6975de 100644
--- a/src/VBox/VMM/include/TMInternal.h
+++ b/src/VBox/VMM/include/TMInternal.h
@@ -492,6 +492,12 @@ typedef struct TM
      * testing of software and similar.
      * @todo Implement warpdrive on UTC. */
     int64_t                     offUTC;
+    /** The last value TMR3UtcNow returned. */
+    int64_t volatile            nsLastUtcNow;
+    /** File to touch on UTC jump. */
+    R3PTRTYPE(char *)           pszUtcTouchFileOnJump;
+    /** Just to avoid dealing with 32-bit alignment trouble. */
+    R3PTRTYPE(char *)           pszAlignment2b;
 
     /** Timer queues for the different clock types - R3 Ptr */
     R3PTRTYPE(PTMTIMERQUEUE)    paTimerQueuesR3;
diff --git a/src/libs/Makefile.kmk b/src/libs/Makefile.kmk
index 9fa0453..5a64063 100644
--- a/src/libs/Makefile.kmk
+++ b/src/libs/Makefile.kmk
@@ -46,8 +46,8 @@ if  defined(VBOX_WITH_LIBCURL) \
  && !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS) \
  && !defined(VBOX_ONLY_SDK) \
  && !defined(VBOX_ONLY_VALIDATIONKIT) \
- && "$(SDK_VBOX_LIBCURL_INCS)" == "$(PATH_ROOT)/src/libs/curl-7.50.3/include"
- include $(PATH_SUB_CURRENT)/curl-7.50.3/Makefile.kmk
+ && "$(SDK_VBOX_LIBCURL_INCS)" == "$(PATH_ROOT)/src/libs/curl-7.57.0/include"
+ include $(PATH_SUB_CURRENT)/curl-7.57.0/Makefile.kmk
 endif
 
 # The kStuff lib used by IPRT and the debugger.
@@ -59,7 +59,7 @@ endif
 if  !defined(VBOX_ONLY_SDK) \
  && (   "$(SDK_VBOX_OPENSSL_INCS)" == "$(SDK_VBOX_OPENSSL_VBOX_DEFAULT_INCS)" \
      || defined(VBOX_WITH_EXTPACK_PUEL_BUILD))
- include $(PATH_SUB_CURRENT)/openssl-1.1.0f/Makefile.kmk
+ include $(PATH_SUB_CURRENT)/openssl-1.1.0g/Makefile.kmk
 endif
 
 # libjpeg for VRDP video redirection and ExtPack's DrvHostWebcam
diff --git a/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c b/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
index bf672b0..48f2a9f 100644
--- a/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
+++ b/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
@@ -1,4 +1,4 @@
-/* $Id: kLdrModMachO.c 102M 2017-10-17 09:35:49Z (local) $ */
+/* $Id: kLdrModMachO.c 102 2017-10-02 10:45:31Z bird $ */
 /** @file
  * kLdr - The Module Interpreter for the MACH-O format.
  */
@@ -769,7 +769,6 @@ static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_hea
                             case S_INTERPOSING: \
                             case S_GB_ZEROFILL: \
                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNSUPPORTED_SECTION); \
-                                /* fall thru */ \
                             \
                             default: \
                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNKNOWN_SECTION); \
@@ -1060,7 +1059,6 @@ static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_hea
             case LC_PREBIND_CKSUM:
             case LC_SYMSEG:
                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNSUPPORTED_LOAD_COMMAND);
-                /* fall thru */
 
             default:
                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNKNOWN_LOAD_COMMAND);
@@ -2891,9 +2889,6 @@ static int  kldrModMachOFixupSectionGeneric32Bit(PKLDRMODMACHO pModMachO, KU8 *p
                     case MACHO_N_INDR:
                     case MACHO_N_PBUD:
                         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
-#if defined(__GNUC__) && __GNUC__ >= 7
-                        __attribute__((fallthrough));
-#endif
                     default:
                         KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
                 }
@@ -3086,7 +3081,6 @@ static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBi
                         case MACHO_N_INDR:
                         case MACHO_N_PBUD:
                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
-                            /* fall thru */
                         default:
                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
                     }
@@ -3155,7 +3149,6 @@ static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBi
                         case MACHO_N_INDR:
                         case MACHO_N_PBUD:
                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
-                            /* fall thru */
                         default:
                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
                     }
@@ -3189,7 +3182,6 @@ static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBi
                         case MACHO_N_INDR:
                         case MACHO_N_PBUD:
                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
-                            /* fall thru */
                         default:
                             KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
                     }
@@ -3231,7 +3223,6 @@ static int  kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBi
                             case MACHO_N_INDR:
                             case MACHO_N_PBUD:
                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_TODO);
-                                /* fall thru */
                             default:
                                 KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_BAD_SYMBOL);
                         }

-- 
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