diff a/make/RunTests.gmk b/make/RunTests.gmk
--- a/make/RunTests.gmk
+++ b/make/RunTests.gmk
@@ -298,11 +298,11 @@
 $(eval $(call SetTestOpt,TIMEOUT_FACTOR,JTREG))
 $(eval $(call SetTestOpt,FAILURE_HANDLER_TIMEOUT,JTREG))
 
 $(eval $(call ParseKeywordVariable, JTREG, \
     SINGLE_KEYWORDS := JOBS TIMEOUT_FACTOR FAILURE_HANDLER_TIMEOUT \
-        TEST_MODE ASSERT VERBOSE RETAIN MAX_MEM RUN_PROBLEM_LISTS \
+        TEST_MODE ASSERT VERBOSE RETAIN MAIN_WRAPPER MAX_MEM RUN_PROBLEM_LISTS \
         RETRY_COUNT, \
     STRING_KEYWORDS := OPTIONS JAVA_OPTIONS VM_OPTIONS KEYWORDS \
         EXTRA_PROBLEM_LISTS AOT_MODULES, \
 ))
 
@@ -850,13 +850,19 @@
   else
     JTREG_TIMEOUT_FACTOR ?= 4
   endif
   JTREG_VERBOSE ?= fail,error,summary
   JTREG_RETAIN ?= fail,error
+  JTREG_MAIN_WRAPPER ?=
   JTREG_RUN_PROBLEM_LISTS ?= false
   JTREG_RETRY_COUNT ?= 0
 
+  ifneq ($$(JTREG_MAIN_WRAPPER), )
+    JT_HOME = $$(JT_HOME_MW)
+    $1_JTREG_BASIC_OPTIONS += -mainWrapper:$$(JTREG_MAIN_WRAPPER)
+  endif
+
   ifneq ($$($1_JTREG_MAX_MEM), 0)
     $1_JTREG_BASIC_OPTIONS += -vmoption:-Xmx$$($1_JTREG_MAX_MEM)
     $1_JTREG_LAUNCHER_OPTIONS += -Xmx$$($1_JTREG_MAX_MEM)
   endif
 
diff a/make/autoconf/configure.ac b/make/autoconf/configure.ac
--- a/make/autoconf/configure.ac
+++ b/make/autoconf/configure.ac
@@ -178,10 +178,13 @@
 TOOLCHAIN_MISC_CHECKS
 
 # Setup the JTReg Regression Test Harness.
 TOOLCHAIN_SETUP_JTREG
 
+# Setup the JTReg Regression Test Harness with Wrapper.
+TOOLCHAIN_SETUP_JTREG_MW
+
 # Setup the Java Microbenchmark Harness (JMH)
 LIB_TESTS_SETUP_JMH
 
 # Setup Jib dependency tool
 TOOLCHAIN_SETUP_JIB
diff a/make/autoconf/spec.gmk.in b/make/autoconf/spec.gmk.in
--- a/make/autoconf/spec.gmk.in
+++ b/make/autoconf/spec.gmk.in
@@ -769,10 +769,11 @@
 OBJCOPY:=@OBJCOPY@
 SETFILE:=@SETFILE@
 XATTR:=@XATTR@
 JT_HOME:=@JT_HOME@
 JTREGEXE:=@JTREGEXE@
+JT_HOME_MW:=@JT_HOME_MW@
 JIB_HOME:=@JIB_HOME@
 XCODEBUILD=@XCODEBUILD@
 DTRACE := @DTRACE@
 FIXPATH:=@FIXPATH@
 ULIMIT:=@ULIMIT@
diff a/make/autoconf/toolchain.m4 b/make/autoconf/toolchain.m4
--- a/make/autoconf/toolchain.m4
+++ b/make/autoconf/toolchain.m4
@@ -1153,10 +1153,97 @@
   UTIL_FIXUP_PATH(JT_HOME)
   AC_SUBST(JT_HOME)
   AC_SUBST(JTREGEXE)
 ])
 
+# Setup the JTReg Regression Test Harness.
+AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG_MW],
+[
+  AC_ARG_WITH(jtregMW, [AS_HELP_STRING([--with-jtregMW],
+      [Regression Test Harness @<:@probed@:>@])])
+
+  if test "x$with_jtregMW" = xno; then
+    # jtreg disabled
+    AC_MSG_CHECKING([for jtreg test harness])
+    AC_MSG_RESULT([no, disabled])
+  elif test "x$with_jtregMW" != xyes && test "x$with_jtregMW" != x; then
+    # An explicit path is specified, use it.
+    JT_HOME_MW="$with_jtregMW"
+    UTIL_FIXUP_PATH([JT_HOME_MW])
+    if test ! -d "$JT_HOME_MW"; then
+      AC_MSG_ERROR([jtreg home directory from --with-jtregMW=$with_jtregMW does not exist])
+    fi
+
+    if test ! -e "$JT_HOME_MW/lib/jtreg.jar"; then
+      AC_MSG_ERROR([jtreg home directory from --with-jtregMW=$with_jtregMW is not a valid jtreg home])
+    fi
+
+    JTREGEXE_MW="$JT_HOME_MW/bin/jtreg"
+    if test ! -x "$JTREGEXE_MW"; then
+      AC_MSG_ERROR([jtreg home directory from --with-jtregMW=$with_jtregMW does not contain valid jtreg executable])
+    fi
+
+    AC_MSG_CHECKING([for jtreg test harness])
+    AC_MSG_RESULT([$JT_HOME_MW])
+  else
+    # Try to locate jtreg
+    if test "x$JT_HOME_MW" != x; then
+      # JT_HOME_MW set in environment, use it
+      if test ! -d "$JT_HOME_MW"; then
+        AC_MSG_WARN([Ignoring JT_HOME_MW pointing to invalid directory: $JT_HOME_MW])
+        JT_HOME_MW=
+      else
+        if test ! -e "$JT_HOME_MW/lib/jtreg.jar"; then
+          AC_MSG_WARN([Ignoring JT_HOME_MW which is not a valid jtreg home: $JT_HOME_MW])
+          JT_HOME_MW=
+        elif test ! -x "$JT_HOME_MW/bin/jtreg"; then
+          AC_MSG_WARN([Ignoring JT_HOME_MW which does not contain valid jtreg executable: $JT_HOME_MW])
+          JT_HOME_MW=
+        else
+          JTREGEXE_MW="$JT_HOME_MW/bin/jtreg"
+          AC_MSG_NOTICE([Located jtreg using JT_HOME_MW from environment])
+        fi
+      fi
+    fi
+
+    if test "x$JT_HOME_MW" = x; then
+      # JT_HOME_MW is not set in environment, or was deemed invalid.
+      # Try to find jtreg on path
+      UTIL_PATH_PROGS(JTREGEXE_MW, jtreg)
+      if test "x$JTREGEXE_MW" != x; then
+        # That's good, now try to derive JT_HOME_MW
+        JT_HOME_MW=`(cd $($DIRNAME $JTREGEXE_MW)/.. && pwd)`
+        if test ! -e "$JT_HOME_MW/lib/jtreg.jar"; then
+          AC_MSG_WARN([Ignoring jtreg from path since a valid jtreg home cannot be found])
+          JT_HOME_MW=
+          JTREGEXE_MW=
+        else
+          AC_MSG_NOTICE([Located jtreg using jtreg executable in path])
+        fi
+      fi
+    fi
+
+    AC_MSG_CHECKING([for jtreg test harness])
+    if test "x$JT_HOME_MW" != x; then
+      AC_MSG_RESULT([$JT_HOME_MW])
+    else
+      AC_MSG_RESULT([no, not found])
+
+      if test "x$with_jtregMW" = xyes; then
+        AC_MSG_ERROR([--with-jtregMW was specified, but no jtreg found.])
+      fi
+    fi
+  fi
+
+  UTIL_FIXUP_EXECUTABLE(JTREGEXE_MW)
+  UTIL_FIXUP_PATH(JT_HOME_MW)
+  AC_SUBST(JT_HOME_MW)
+  AC_SUBST(JTREGEXE_MW)
+])
+
+
+
 # Setup the JIB dependency resolver
 AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JIB],
 [
   AC_ARG_WITH(jib, [AS_HELP_STRING([--with-jib],
       [Jib dependency management tool @<:@not used@:>@])])
diff a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js
--- a/make/conf/jib-profiles.js
+++ b/make/conf/jib-profiles.js
@@ -244,11 +244,11 @@
         "linux-aarch64", "linux-arm32", "linux-ppc64le", "linux-s390x"
     ];
 
     // These are the base setttings for all the main build profiles.
     common.main_profile_base = {
-        dependencies: ["boot_jdk", "gnumake", "jtreg", "jib", "autoconf", "jmh", "jcov"],
+        dependencies: ["boot_jdk", "gnumake", "jtreg", "jtregMW", "jib", "autoconf", "jmh", "jcov"],
         default_make_targets: ["product-bundles", "test-bundles", "static-libs-bundles"],
         configure_args: concat(["--enable-jtreg-failure-handler"],
             "--with-exclude-translations=de,es,fr,it,ko,pt_BR,sv,ca,tr,cs,sk,ja_JP_A,ja_JP_HA,ja_JP_HI,ja_JP_I,zh_TW,zh_HK",
             "--disable-manpages",
             "--disable-jvm-feature-shenandoahgc",
@@ -838,11 +838,11 @@
     // Profiles used to run tests.
     var testOnlyProfiles = {
         "run-test": {
             target_os: input.build_os,
             target_cpu: input.build_cpu,
-            dependencies: [ "jtreg", "gnumake", "boot_jdk", "devkit", "jib" ],
+            dependencies: [ "jtreg", "jtregMW", "gnumake", "boot_jdk", "devkit", "jib" ],
             labels: "test",
             environment: {
                 "JT_JAVA": common.boot_jdk_home
             }
         }
@@ -872,11 +872,11 @@
     var testOnlyProfilesPrebuilt = {
         "run-test-prebuilt": {
             target_os: input.build_os,
             target_cpu: input.build_cpu,
             dependencies: [
-                "jtreg", "gnumake", "boot_jdk", "devkit", "jib", "jcov", testedProfileJdk,
+                "jtreg", "jtregMW", "gnumake", "boot_jdk", "devkit", "jib", "jcov", testedProfileJdk,
                 testedProfileTest
             ],
             src: "src.conf",
             make_args: testOnlyMake,
             environment: {
@@ -1060,10 +1060,18 @@
             file: "bundles/jtreg_bin-5.0.zip",
             environment_name: "JT_HOME",
             environment_path: input.get("jtreg", "install_path") + "/jtreg/bin"
         },
 
+        jtregMW: {
+            organization: common.organization,
+            ext: "zip",
+            revision: "5.0-virtual-1.1",
+            environment_name: "JT_HOME_MW",
+            environment_path: input.get("jtreg", "install_path") + "/jtreg/bin"
+        },
+
         jmh: {
             organization: common.organization,
             ext: "tar.gz",
             revision: "1.21+1.0"
         },
diff a/test/hotspot/jtreg/ProblemList-vthread.txt b/test/hotspot/jtreg/ProblemList-vthread.txt
--- /dev/null
+++ b/test/hotspot/jtreg/ProblemList-vthread.txt
@@ -0,0 +1,151 @@
+##########
+## Tests failing when main() is executed in additional vthread or in vthread instead of thread
+
+
+####
+# OOME in unexpected thread
+gc/g1/ihop/TestIHOPStatic.java
+
+
+####
+# Test failing because of incorrect stacktrace for main thread
+
+runtime/Throwable/TestThrowable.java
+runtime/handshake/HandshakeWalkStackTest.java
+runtime/handshake/HandshakeWalkStackFallbackTest.java
+runtime/ErrorHandling/TestCrashOnOutOfMemoryError.java
+runtime/ErrorHandling/TestExitOnOutOfMemoryError.java
+runtime/ErrorHandling/TestHeapDumpPath.java
+runtime/ErrorHandling/TestOnOutOfMemoryError.java
+runtime/Throwable/StackTraceLogging.java
+runtime/Throwable/TestMaxJavaStackTraceDepth.java
+
+
+####
+# TODO check what are the cds issues with vthread
+runtime/cds/serviceability/ReplaceCriticalClasses.java
+runtime/cds/serviceability/ReplaceCriticalClassesForSubgraphs.java
+runtime/cds/TestInterpreterMethodEntries.java#id0
+runtime/cds/TestInterpreterMethodEntries.java#id1
+
+
+####
+# Something wrong with test.jdk/test.src properties
+runtime/Dictionary/ProtectionDomainCacheTest.java
+runtime/jni/checked/TestCheckedEnsureLocalCapacity.java
+runtime/Dictionary/ProtectionDomainCacheTest.java
+
+
+####
+# Don't work with ProcessTools wrapper
+serviceability/sa/ClhsdbCDSCore.java
+serviceability/logging/TestLogRotation.java
+compiler/c2/Test8062950.java
+
+
+####
+# Custom cp adding (overriding -cp)
+
+runtime/verifier/TestMultiANewArray.java
+runtime/verifier/OverriderMsg.java
+runtime/verifier/TestANewArray.java
+runtime/StackTrace/LargeClassTest.java
+runtime/LocalVariableTable/TestLVT.java
+runtime/duplAttributes/DuplAttributesTest.java
+runtime/EnclosingMethodAttr/EnclMethodAttr.java
+runtime/classFileParserBug/TestEmptyBootstrapMethodsAttr.java
+runtime/classFileParserBug/ClassFileParserBug.java
+runtime/ClassFile/UnsupportedClassFileVersion.java
+runtime/ClassFile/JsrRewriting.java
+runtime/ClassFile/OomWhileParsingRepeatedJsr.java
+runtime/cds/appcds/ClassLoaderTest.java
+runtime/cds/appcds/HelloTest.java
+runtime/cds/appcds/sharedStrings/SharedStringsBasic.java
+runtime/cds/BootAppendTests.java
+runtime/BootstrapMethod/BSMCalledTwice.java
+compiler/aot/fingerprint/SelfChangedCDS.java
+compiler/aot/verification/ClassAndLibraryNotMatchTest.java
+
+
+####
+# Fail to run main() in thread
+# Class with main() is not public, or it's outer class is not public
+
+compiler/aot/fingerprint/SelfChangedCDS.java
+compiler/aot/verification/ClassAndLibraryNotMatchTest.java
+gc/TestSmallHeap.java
+gc/TestVerifySilently.java
+gc/TestVerifySubSet.java
+gc/arguments/TestNewSizeThreadIncrease.java
+gc/cms/GuardShrinkWarning.java
+gc/concurrent_phase_control/TestConcurrentPhaseControlG1.java
+gc/ergonomics/TestDynamicNumberOfGCThreads.java
+gc/g1/TestEagerReclaimHumongousRegions.java
+gc/g1/TestEagerReclaimHumongousRegionsClearMarkBits.java
+gc/g1/TestEagerReclaimHumongousRegionsWithRefs.java
+gc/g1/TestHumongousAllocInitialMark.java
+gc/g1/TestHumongousCodeCacheRoots.java
+gc/g1/TestPLABSizeBounds.java
+gc/g1/TestPrintRegionRememberedSetInfo.java
+gc/g1/mixedgc/TestLogging.java
+gc/logging/TestDeprecatedPrintFlags.java
+gc/logging/TestMetaSpaceLog.java
+gc/logging/TestPrintReferences.java
+gc/serial/HeapChangeLogging.java
+serviceability/sa/TestCpoolForInvokeDynamic.java
+gc/TestSmallHeap.java
+runtime/logging/VtablesTest.java
+runtime/BootstrapMethod/TestLambdaExceptionInInitializer.java
+compiler/inlining/InlineAccessors.java
+compiler/jsr292/ContinuousCallSiteTargetChange.java
+compiler/jsr292/MHInlineTest.java
+compiler/jsr292/PollutedTrapCounts.java
+gc/TestAgeOutput.java
+gc/TestNumWorkerOutput.java
+gc/arguments/TestMaxHeapSizeTools.java
+gc/arguments/TestUseCompressedOopsErgoTools.java
+gc/g1/TestEagerReclaimHumongousRegionsLog.java
+gc/g1/TestG1TraceEagerReclaimHumongousObjects.java
+gc/g1/TestGCLogMessages.java
+gc/g1/TestHumongousAllocNearlyFullRegion.java
+gc/g1/TestPLABOutput.java
+gc/g1/TestPeriodicLogMessages.java
+gc/g1/TestRemsetLoggingTools.java
+gc/g1/TestShrinkAuxiliaryData.java
+gc/g1/TestShrinkDefragmentedHeap.java
+gc/g1/TestStringDeduplicationTools.java
+gc/g1/ihop/TestIHOPStatic.java
+gc/logging/TestGCId.java
+gc/parallel/AdaptiveGCBoundary.java
+gc/z/TestHighUsage.java
+runtime/Dictionary/CleanProtectionDomain.java
+runtime/Dictionary/ProtectionDomainCacheTest.java
+runtime/ErrorHandling/ProblematicFrameTest.java
+runtime/MemberName/MemberNameLeak.java
+runtime/Shutdown/ShutdownTest.java
+runtime/condy/CondyBadLDC.jasm
+runtime/condy/CondyBadLDC2_W.jasm
+runtime/condy/CondyUseLDC_W.jasm
+runtime/condy/CondyUsesIndyBSM.jcod
+runtime/condy/IndyUsesCondyBSM.jcod
+runtime/execstack/Test.java
+runtime/execstack/TestMT.java
+runtime/handshake/HandshakeTransitionTest.java
+runtime/logging/ClassLoadUnloadTest.java
+
+
+####
+# dont run classname (-version/empty)
+
+runtime/symboltable/ShortLivedSymbolCleanup.java
+runtime/logging/LoaderConstraintsTest.java
+
+
+#####
+# Seems module patching doesn't work with wrapper
+
+runtime/modules/PatchModule/PatchModuleTestJarDir.java
+runtime/modules/PatchModule/PatchModuleJavaBase.java
+runtime/modules/PatchModule/PatchModuleTestJar.java
+runtime/modules/PatchModule/PatchModuleTest.java
+runtime/modules/PatchModule/PatchModuleClassList.java
diff a/test/jdk/ProblemList-vthread.txt b/test/jdk/ProblemList-vthread.txt
--- /dev/null
+++ b/test/jdk/ProblemList-vthread.txt
@@ -0,0 +1,153 @@
+##########
+## Tests failing when main() is executed in additional vthread or in vthread instead of thread
+#
+
+
+####
+# Incorrect stackwalking epxectations for main thread stack trace
+
+java/lang/StackWalker/VerifyStackTrace.java
+java/lang/StackWalker/GetCallerClassTest.java
+java/lang/StackWalker/DumpStackTest.java
+java/lang/StackTraceElement/WithClassLoaderName.java
+runtime/Throwable/TestThrowable.java
+java/lang/StackWalker/ReflectionFrames.java
+java/lang/StackWalker/NativeMethod.java
+
+
+####
+# ThreadGroup owner is not main
+
+java/lang/Thread/MainThreadTest.java
+
+
+####
+# JFR tests check events for test main thread only
+
+jdk/jfr/event/io/TestFileStreamEvents.java
+jdk/jfr/event/compiler/TestAllocInNewTLAB.java
+
+
+####
+# OOME in unextpected thread
+
+java/lang/ref/OOMEInReferenceHandler.java
+
+
+####
+# incorrect using of 'test.jdk' by wrapper
+
+runtime/jni/checked/TestCheckedEnsureLocalCapacity.java
+
+
+####
+# jcoder fails
+java/lang/invoke/condy/CondyNestedResolutionTest.java
+
+
+####
+# Tests failing while setting custom Permissions
+
+java/util/Properties/LoadAndStoreXML.java
+sun/reflect/ReflectionFactory/ReflectionFactoryTest.java
+java/lang/System/SecurityRace.java
+java/lang/System/LoggerFinder/jdk/DefaultLoggerBridgeTest/DefaultLoggerBridgeTest.java
+java/lang/System/LoggerFinder/jdk/DefaultPlatformLoggerTest/DefaultPlatformLoggerTest.java
+java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/PlatformLoggerBridgeTest.java
+java/lang/System/LoggerFinder/internal/LoggerFinderLoaderTest/LoggerFinderLoaderTest.java
+java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java
+java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java
+java/lang/System/LoggerFinder/internal/BasePlatformLoggerTest/BasePlatformLoggerTest.java
+java/lang/System/LoggerFinder/internal/BaseLoggerBridgeTest/BaseLoggerBridgeTest.java
+java/lang/System/LoggerFinder/internal/BaseDefaultLoggerFinderTest/BaseDefaultLoggerFinderTest.java
+java/lang/System/LoggerFinder/DefaultLoggerFinderTest/DefaultLoggerFinderTest.java
+java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinderTest.java
+java/lang/System/Logger/default/DefaultLoggerTest.java
+java/lang/System/Logger/custom/CustomLoggerTest.java
+java/lang/StackWalker/SecurityExceptions.java
+java/lang/StackWalker/CallerSensitiveMethod/Main.java
+java/lang/SecurityManager/CheckSecurityProvider.java
+java/lang/SecurityManager/PackageAccessTest.java
+java/lang/reflect/Proxy/nonPublicProxy/NonPublicProxyClass.java
+java/lang/ProcessHandle/PermissionTest.java
+java/lang/ProcessBuilder/SecurityManagerClinit.java
+java/lang/ProcessBuilder/Basic.java#id1
+java/lang/ProcessBuilder/Basic.java#id0
+java/lang/ModuleTests/WithSecurityManager.java
+java/lang/module/ModuleFinderWithSecurityManager.java
+java/lang/invoke/MethodTypeSecurityManager.java
+java/lang/invoke/MethodHandleConstants.java
+java/lang/invoke/InvokeDynamicPrintArgs.java
+java/util/ServiceLoader/security/SecurityTest.java
+java/util/PluggableLocale/PermissionTest.java
+java/util/logging/TestLoggerBundleSync.java
+java/util/logging/TestLogConfigurationDeadLockWithConf.java
+java/util/logging/TestLogConfigurationDeadLock.java
+java/util/logging/TestGetLoggerNPE.java
+java/util/logging/TestConfigurationListeners.java
+java/util/logging/TestAppletLoggerContext.java
+java/util/logging/SystemLoggerConfigTest.java
+java/util/logging/FileHandlerPatternExceptions.java
+java/util/logging/FileHandlerPath.java
+java/util/logging/FileHandlerLongLimit.java
+java/util/logging/RootLogger/RootLevelInConfigFile.java
+java/util/logging/LogManager/RootLogger/setLevel/TestRootLoggerLevel.java
+java/util/logging/LogManager/Configuration/TestConfigurationLock.java
+java/util/logging/LogManager/Configuration/ParentLoggerWithHandlerGC.java
+java/util/logging/LogManager/Configuration/updateConfiguration/UpdateConfigurationTest.java
+java/util/logging/LogManager/Configuration/updateConfiguration/SimpleUpdateConfigWithInputStreamTest.java
+java/util/logging/LogManager/Configuration/updateConfiguration/SimpleUpdateConfigurationTest.java
+java/util/logging/LogManager/Configuration/updateConfiguration/HandlersOnComplexResetUpdate.java
+java/util/logging/LogManager/Configuration/updateConfiguration/HandlersOnComplexUpdate.java
+java/util/logging/LogManager/Configuration/rootLoggerHandlers/RootLoggerHandlers.java
+java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java
+java/util/logging/Logger/setResourceBundle/TestSetResourceBundle.java
+java/util/logging/LogManager/Configuration/rootLoggerHandlers/BadRootLoggerHandlers.java
+java/util/logging/Logger/getGlobal/TestGetGlobalConcurrent.java
+java/util/logging/Logger/getGlobal/TestGetGlobalByName.java
+java/util/logging/Logger/getGlobal/TestGetGlobal.java
+runtime/Dictionary/ProtectionDomainCacheTest.java
+java/util/concurrent/Executors/PrivilegedCallables.java
+java/lang/constant/methodTypeDesc/ResolveConstantDesc.java
+java/lang/ClassLoader/forNameLeak/ClassForNameLeak.java
+com/sun/crypto/provider/Cipher/AES/TestAESCiphers/TestAESWithRemoveAddProvider.java
+com/sun/crypto/provider/Cipher/AES/TestAESCiphers/TestAESWithProviderChange.java
+jdk/jfr/startupargs/TestDumpOnExit.java
+java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java
+java/lang/Class/getDeclaredField/ClassDeclaredFieldsTest.java
+java/lang/annotation/ParameterAnnotations.java
+
+
+#####
+# Tests failing because of ProcessTools wrapper
+
+com/sun/jdi/ProcessAttachTest.java
+java/util/ResourceBundle/modules/cache/CacheTest.java
+java/util/logging/modules/GetResourceBundleTest.java
+
+
+#####
+# Following tests failing of ProcessTools wrapper
+# cutom classpath, jars, no main class etc
+
+jdk/modules/etc/DefaultModules.java
+jdk/internal/misc/VM/RuntimeArguments.java
+java/lang/StackWalker/CallerFromMain.java
+java/lang/Package/PackageFromManifest.java
+java/lang/Package/IsCompatibleWithDriver.java
+java/lang/invoke/condy/CondyNestedResolutionTest.java
+java/lang/ClassLoader/GetSystemPackage.java
+java/lang/ClassLoader/securityManager/ClassLoaderTest.java
+java/lang/ClassLoader/getResource/modules/ResourcesTest.java
+java/lang/ClassLoader/getResource/automaticmodules/Driver.java
+java/lang/Class/getResource/ResourcesTest.java
+java/lang/Class/forName/modules/TestDriver.java
+java/lang/ClassLoader/getResource/modules/ResourcesTest.java
+
+
+####
+# Main class is not public
+
+jdk/java/lang/invoke/condy/CondyNestedResolution.jcod
+jdk/java/util/logging/SystemLoggerConfigTest.java
+jdk/jdk/jfr/startupargs/TestDumpOnExit.java
diff a/test/langtools/ProblemList-vthread.txt b/test/langtools/ProblemList-vthread.txt
--- /dev/null
+++ b/test/langtools/ProblemList-vthread.txt
@@ -0,0 +1,20 @@
+##########
+## Tests failing when main() is executed in additional vthread or in vthread instead of thread
+
+
+####
+# Failed because jtreg wrapper can't catch exceptions in thread groups
+# or incorrently process negative tests
+
+tools/javac/NullQualifiedNew.java
+tools/javac/NullQualifiedSuper2.java
+tools/javac/generics/T5094318.java
+tools/javac/api/T6395981.java
+jdk/javadoc/tool/sourceOption/SourceOption.java
+
+####
+# result: Error. Agent communication error: java.io.EOFException; check console log for any additional details
+
+tools/javac/lambda/T8031967.java
+tools/javac/lambda/LambdaParserTest.java
+jdk/javadoc/doclet/testLinkOption/TestRedirectLinks.java
diff a/test/lib/jdk/test/lib/process/ProcessTools.java b/test/lib/jdk/test/lib/process/ProcessTools.java
--- a/test/lib/jdk/test/lib/process/ProcessTools.java
+++ b/test/lib/jdk/test/lib/process/ProcessTools.java
@@ -1,4 +1,6 @@
+
 /*
  * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,10 +28,11 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.nio.charset.Charset;
+import java.lang.reflect.Method;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.concurrent.CountDownLatch;
@@ -293,11 +295,73 @@
 
         if (addTestVmAndJavaOptions) {
             Collections.addAll(args, Utils.getTestJavaOpts());
         }
 
-        Collections.addAll(args, command);
+        boolean noModule = true;
+        for (String cmd: command) {
+            if (cmd.equals("-m")) {
+                noModule = false;
+            }
+        }
+
+        String[] doubleWordArgs = {"-cp", "-classpath", "--add-opens", "--class-path", "--upgrade-module-path",
+                                   "--add-modules", "-d", "--add-exports", "--patch-module", "--module-path"};
+
+        if (noModule && System.getProperty("main.wrapper") != null) {
+            boolean skipNext = false;
+            boolean added = false;
+            for (String cmd : command) {
+                if (added) {
+                    args.add(cmd);
+                    continue;
+                }
+
+                if (skipNext) {
+                    skipNext = false;
+                    args.add(cmd);
+                    continue;
+                }
+                for (String dWArg : doubleWordArgs) {
+                    if (cmd.equals(dWArg)) {
+                        skipNext = true;
+                        args.add(cmd);
+                        continue;
+                    }
+                }
+                if (skipNext) {
+                    continue;
+                }
+                if (cmd.startsWith("-cp")) {
+                    skipNext = true;
+                    args.add(cmd);
+                    continue;
+                }
+                if (cmd.startsWith("--add-exports")) {
+                    skipNext = true;
+                    args.add(cmd);
+                    continue;
+                }
+                if (cmd.startsWith("--patch-module")) {
+                    skipNext = true;
+                    args.add(cmd);
+                    continue;
+                }
+                if (cmd.startsWith("-")) {
+                    args.add(cmd);
+                    continue;
+                }
+                args.add("jdk.test.lib.process.ProcessTools");
+                args.add(System.getProperty("main.wrapper"));
+                added = true;
+                // Should be main
+                // System.out.println("Wrapped TOFIND: " + cmd);
+                args.add(cmd);
+            }
+        } else {
+            Collections.addAll(args, command);
+        }
 
         // Reporting
         StringBuilder cmdLine = new StringBuilder();
         for (String cmd : args)
             cmdLine.append(cmd).append(' ');
@@ -622,6 +686,61 @@
                 stderrTask.get();
             } catch (ExecutionException e) {
             }
         }
     }
+
+    // ProcessTools as a wrapper
+    public static void main(String[] args) throws Throwable {
+        String wrapper = args[0];
+        String className = args[1];
+        String[] classArgs = new String[args.length - 2];
+        System.arraycopy(args, 2, classArgs, 0, args.length - 2);
+        Class c = Class.forName(className);
+        Method mainMethod = c.getMethod("main", new Class[] { String[].class });
+
+        if (wrapper.equals("Virtual")) {
+            MainThreadGroup tg = new MainThreadGroup();
+            // TODO fix to set virtual scheduler group when become available
+            Thread vthread = Thread.builder().virtual().task(() -> {
+                    try {
+                        mainMethod.invoke(null, new Object[] { classArgs });
+                    } catch (Throwable error) {
+                        tg.uncaughtThrowable = error;
+                    }
+                }).build();
+            vthread.start();
+            vthread.join();
+        } else if (wrapper.equals("Kernel")) {
+            MainThreadGroup tg = new MainThreadGroup();
+            Thread t = new Thread(tg, () -> {
+                    try {
+                        mainMethod.invoke(null, new Object[] { classArgs });
+                    } catch (Throwable error) {
+                        tg.uncaughtThrowable = error;
+                    }
+                });
+            t.start();
+            t.join();
+            if (tg.uncaughtThrowable != null) {
+                throw new RuntimeException(tg.uncaughtThrowable);
+            }
+        } else {
+            mainMethod.invoke(null, new Object[] { classArgs });
+        }
+    }
+
+    static class MainThreadGroup extends ThreadGroup {
+        MainThreadGroup() {
+            super("MainThreadGroup");
+        }
+
+        public void uncaughtException(Thread t, Throwable e) {
+            if (e instanceof ThreadDeath) {
+                return;
+            }
+            e.printStackTrace(System.err);
+            uncaughtThrowable = e;
+        }
+        Throwable uncaughtThrowable = null;
+    }
 }
