--- a/src/app/virtualbox/src/VBox/VMM/VMMR3/PGM.cpp
+++ b/src/app/virtualbox/src/VBox/VMM/VMMR3/PGM.cpp
@@ -2165,8 +2165,8 @@
  */
 VMMR3DECL(int) PGMR3InitFinalize(PVM pVM)
 {
-    int rc = VERR_IPE_UNINITIALIZED_STATUS; /* (MSC incorrectly thinks it can be usused uninitialized) */
-
+    int rc = VINF_SUCCESS; //VERR_IPE_UNINITIALIZED_STATUS; /* (MSC incorrectly thinks it can be usused uninitialized) */
+#if 0
     /*
      * Reserve space for the dynamic mappings.
      * Initialize the dynamic mapping pages with dummy pages to simply the cache.
@@ -2187,6 +2187,7 @@
         rc = PGMMap(pVM, pVM->pgm.s.pbDynPageMapBaseGC + offDynMap, HCPhysDummy, PAGE_SIZE, 0);
         AssertRCReturn(rc, rc);
     }
+#endif /* #if 0 */
 
     /*
      * Determine the max physical address width (MAXPHYADDR) and apply it to
@@ -2384,7 +2385,7 @@
      * (One or more of them have changed, that's why we're here.)
      */
     pVM->pgm.s.pMappingsRC = MMHyperR3ToRC(pVM, pVM->pgm.s.pMappingsR3);
-    for (PPGMMAPPING pCur = pVM->pgm.s.pMappingsR3; pCur->pNextR3; pCur = pCur->pNextR3)
+    for (PPGMMAPPING pCur = pVM->pgm.s.pMappingsR3; pCur && pCur->pNextR3; pCur = pCur->pNextR3)
         pCur->pNextRC = MMHyperR3ToRC(pVM, pCur->pNextR3);
 
     /* Relocate GC addresses of Page Tables. */
@@ -2397,6 +2398,7 @@
         }
     }
 
+#if 0
     /*
      * Dynamic page mapping area.
      */
@@ -2419,6 +2421,7 @@
             paPages[iPage].uPte.pPae    += offDelta;
         }
     }
+#endif /* #if 0 */
 
     /*
      * The Zero page.
--- a/src/app/virtualbox/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
+++ b/src/app/virtualbox/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
@@ -263,6 +263,9 @@
  * @param   pCur    The physical handler.
  * @param   pRam    The RAM range.
  */
+#include <base/log.h>
+extern "C" bool PGMUnmapMemoryGenode(void *, size_t size);
+
 static int pgmHandlerPhysicalSetRamFlagsAndFlushShadowPTs(PVM pVM, PPGMPHYSHANDLER pCur, PPGMRAMRANGE pRam)
 {
     /*
@@ -298,6 +301,13 @@
         i++;
     }
 
+    if (pRam->pvR3 != 0) {
+        if (pCur->cPages != pRam->cb / 4096)
+            Genode::warning("dubious ? phys=", Genode::Hex(pRam->GCPhys));
+
+        PGMUnmapMemoryGenode(pRam->pvR3, pRam->cb);
+    }
+
     if (fFlushTLBs)
     {
         PGM_INVL_ALL_VCPU_TLBS(pVM);
--- a/src/app/virtualbox/include/VBox/vmm/vm.h
+++ b/src/app/virtualbox/include/VBox/vmm/vm.h
@@ -1011,7 +1011,7 @@
 #ifdef ___PGMInternal_h
         struct PGM  s;
 #endif
-        uint8_t     padding[4096*2+6080];      /* multiple of 64 */
+        uint8_t     padding[4096*4 + 6080];      /* multiple of 64 */
     } pgm;
 
     /** HM part. */
--- a/src/app/virtualbox/include/VBox/param.h
+++ b/src/app/virtualbox/include/VBox/param.h
@@ -92,13 +92,13 @@
  */
 /** The number of handy pages.
  * This should be a power of two. */
-#define PGM_HANDY_PAGES             128
+#define PGM_HANDY_PAGES             512
 /** The threshold at which allocation of more handy pages is flagged. */
-#define PGM_HANDY_PAGES_SET_FF      32
+#define PGM_HANDY_PAGES_SET_FF      0
 /** The threshold at which we will allocate more when in ring-3.
  * This is must be smaller than both PGM_HANDY_PAGES_SET_FF and
  * PGM_HANDY_PAGES_MIN. */
-#define PGM_HANDY_PAGES_R3_ALLOC    8
+#define PGM_HANDY_PAGES_R3_ALLOC    0
 /** The threshold at which we will allocate more when in ring-0 or raw mode.
  * The idea is that we should never go below this threshold while in ring-0 or
  * raw mode because of PGM_HANDY_PAGES_RZ_TO_R3. However, should this happen and
@@ -107,16 +107,16 @@
  *
  * This is must be smaller than both PGM_HANDY_PAGES_SET_FF and
  * PGM_HANDY_PAGES_MIN. */
-#define PGM_HANDY_PAGES_RZ_ALLOC    8
+#define PGM_HANDY_PAGES_RZ_ALLOC    0
 /** The threshold at which we force return to R3 ASAP.
  * The idea is that this should be large enough to get out of any code and up to
  * the main EM loop when we are out of memory.
  * This must be less or equal to PGM_HANDY_PAGES_MIN. */
-#define PGM_HANDY_PAGES_RZ_TO_R3    24
+#define PGM_HANDY_PAGES_RZ_TO_R3    0
 /** The minimum number of handy pages (after allocation).
  * This must be greater or equal to PGM_HANDY_PAGES_SET_FF.
  * Another name would be PGM_HANDY_PAGES_EXTRA_RESERVATION or _PARANOIA. :-) */
-#define PGM_HANDY_PAGES_MIN         32
+#define PGM_HANDY_PAGES_MIN         0
 /** @} */
 
 
--- a/src/app/virtualbox/src/VBox/VMM/VMMR3/PGMPhys.cpp
+++ b/src/app/virtualbox/src/VBox/VMM/VMMR3/PGMPhys.cpp
@@ -4518,6 +4518,14 @@
         if (pVM->pgm.s.aHandyPages[i].idPage == idPage)
         {
             pVM->pgm.s.aHandyPages[i].idPage = NIL_GMM_PAGEID;
+            /**
+              * Required to avoid assertion during reboot of a VM on Genode.
+              * could be it solves the
+              * "todo re-test this later. Appeared to be a PGM init bug." in
+              * src/VBox/VMM/VMMR0/GMMR0.cpp of VBox 5.0.12
+              * - todo: send email to vbox mailing list about that
+              */
+            pVM->pgm.s.aHandyPages[i].HCPhysGCPhys = NIL_RTHCPHYS;
             break;
         }
         if (pVM->pgm.s.aHandyPages[i].idSharedPage == idPage)
--- a/src/app/virtualbox/src/VBox/VMM/VMMR3/IEMR3.cpp
+++ b/src/app/virtualbox/src/VBox/VMM/VMMR3/IEMR3.cpp
@@ -195,8 +195,10 @@
     for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++)
     {
         pVM->aCpus[idCpu].iem.s.pCtxRC = VM_RC_ADDR(pVM, pVM->aCpus[idCpu].iem.s.pCtxR3);
+#if defined(VBOX_WITH_STATISTICS)
         if (pVM->aCpus[idCpu].iem.s.pStatsRC)
             pVM->aCpus[idCpu].iem.s.pStatsRC = MMHyperR3ToRC(pVM, pVM->aCpus[idCpu].iem.s.pStatsCCR3);
+#endif
     }
 }
 
--- a/src/app/virtualbox/src/VBox/VMM/include/IEMInternal.h
+++ b/src/app/virtualbox/src/VBox/VMM/include/IEMInternal.h
@@ -83,7 +83,7 @@
 
 //#define IEM_WITH_CODE_TLB// - work in progress
 
-
+#if defined(VBOX_WITH_STATISTICS)
 #if !defined(IN_TSTVMSTRUCT) && !defined(DOXYGEN_RUNNING)
 /** Instruction statistics.   */
 typedef struct IEMINSTRSTATS
@@ -98,6 +98,7 @@
 #endif
 /** Pointer to IEM instruction statistics. */
 typedef IEMINSTRSTATS *PIEMINSTRSTATS;
+#endif
 
 /** Finish and move to types.h */
 typedef union
@@ -727,6 +728,7 @@
     /** Pointer to the CPU context - raw-mode context. */
     RCPTRTYPE(PCPUMCTX)     pCtxRC;
 
+#if defined(VBOX_WITH_STATISTICS)
     /** Pointer to instruction statistics for raw-mode context (same as R0). */
     RCPTRTYPE(PIEMINSTRSTATS) pStatsRC;
     /** Pointer to instruction statistics for ring-0 context (same as RC). */
@@ -735,6 +737,7 @@
     R3PTRTYPE(PIEMINSTRSTATS) pStatsCCR3;
     /** Pointer to instruction statistics for ring-3 context. */
     R3PTRTYPE(PIEMINSTRSTATS) pStatsR3;
+#endif
 
 #ifdef IEM_VERIFICATION_MODE_FULL
     /** The event verification records for what IEM did (LIFO). */
