Issue #23507 Enabled some context-propagation tests

- resolved cyclic dependencies and side effects (at least partially, so now
  tests pass in maven
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/adaptors/BootstrapUtils.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/adaptors/BootstrapUtils.java
index fa2de04..08317e2 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/adaptors/BootstrapUtils.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/adaptors/BootstrapUtils.java
@@ -91,11 +91,6 @@
 
     public static void bootstrap(WireAdapter wireAdapter) {
         reset();
-        /*
-         * ThreadLocalAccessor tla = Deencapsulation.getField(ContextBootstrap.class,
-         * "threadLocalAccessor");
-         * tla.set(null);
-         */
         ContextBootstrap.configure(new MockLoggerAdapter(), wireAdapter, new MockThreadLocalAccessor(),
             new MockContextAccessController(), "guid");
     }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapFinderTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapFinderTest.java
index 4e62b05..40b5c69 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapFinderTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapFinderTest.java
@@ -20,9 +20,9 @@
 import org.glassfish.contextpropagation.adaptors.BootstrapUtils;
 import org.glassfish.contextpropagation.internal.Utils.AccessControlledMapFinder;
 import org.glassfish.contextpropagation.wireadapters.glassfish.DefaultWireAdapter;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -34,26 +34,28 @@
     @BeforeEach
     public void setup() {
         BootstrapUtils.bootstrap(new DefaultWireAdapter());
-        mapFinder.getMapAndCreateIfNeeded();
     }
 
+    @AfterEach
+    public void reset() {
+        BootstrapUtils.reset();
+    }
 
     @Test
     public void testGetMapIfItExistsButDoesnt() {
-        BootstrapUtils.bootstrap(new DefaultWireAdapter());
         assertNull(mapFinder.getMapIfItExists());
     }
 
 
     @Test
     public void testGetMapIfItExistsWhenItDoes() {
+        mapFinder.getMapAndCreateIfNeeded();
         assertNotNull(mapFinder.getMapIfItExists());
     }
 
 
     @Test
     public void testCreateMapIfItExistsButDoesnt() {
-        BootstrapUtils.bootstrap(new DefaultWireAdapter());
         assertNull(mapFinder.getMapIfItExists());
         assertNotNull(mapFinder.getMapAndCreateIfNeeded());
     }
@@ -61,6 +63,7 @@
 
     @Test
     public void testCreateMapIfItExistsWhenItDoes() {
+        assertNotNull(mapFinder.getMapAndCreateIfNeeded());
         assertEquals(mapFinder.getMapIfItExists(), mapFinder.getMapAndCreateIfNeeded());
     }
 
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapTest.java
index 4fc6a2f..a9479db 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/AccessControlledMapTest.java
@@ -30,6 +30,7 @@
 import org.glassfish.contextpropagation.internal.AccessControlledMap.ContextAccessLevel;
 import org.glassfish.contextpropagation.internal.Entry.ContextType;
 import org.glassfish.contextpropagation.wireadapters.glassfish.DefaultWireAdapter;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -53,38 +54,16 @@
 
     @BeforeAll
     public static void setupClass() {
+        // must be called here too, because isConfigured is initialized in static block
         BootstrapUtils.reset();
         ContextBootstrap.configure(new MockLoggerAdapter(), new DefaultWireAdapter(), new MockThreadLocalAccessor(),
-            new ContextAccessController() {
-
-                @Override
-                public boolean isAccessAllowed(String key, ContextAccessLevel type) {
-                    switch (type) {
-                        case READ:
-                            return key.contains("read") || key.contains("create") || key.contains("delete")
-                                || key.contains("update");
-                        case CREATE:
-                            return key.contains("create");
-                        case DELETE:
-                            return key.contains("delete");
-                        case UPDATE:
-                            return key.contains("update");
-                    }
-                    return false;
-                }
-
-
-                @Override
-                public boolean isEveryoneAllowedToRead(String key) {
-                    if ("put".equals(Thread.currentThread().getStackTrace()[2].getMethodName())) {
-                        return true;
-                    } else {
-                        throw new UnsupportedOperationException();
-                    }
-                }
-            }, "guid");
+            new ContextAccessController4ACMTest(), "guid");
     }
 
+    @AfterAll
+    public static void reset() {
+        BootstrapUtils.reset();
+    }
 
     @BeforeEach
     public void setup() {
@@ -230,4 +209,32 @@
         assertEquals(4, count);
     }
 
+
+    private static final class ContextAccessController4ACMTest extends ContextAccessController {
+
+        @Override
+        public boolean isAccessAllowed(String key, ContextAccessLevel type) {
+            switch (type) {
+                case READ:
+                    return key.contains("read") || key.contains("create") || key.contains("delete")
+                        || key.contains("update");
+                case CREATE:
+                    return key.contains("create");
+                case DELETE:
+                    return key.contains("delete");
+                case UPDATE:
+                    return key.contains("update");
+            }
+            return false;
+        }
+
+        @Override
+        public boolean isEveryoneAllowedToRead(String key) {
+            if ("put".equals(Thread.currentThread().getStackTrace()[2].getMethodName())) {
+                return true;
+            } else {
+                throw new UnsupportedOperationException();
+            }
+        }
+    }
 }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapImplTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapImplTest.java
index 4200a9b..b3d4fc4 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapImplTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapImplTest.java
@@ -33,10 +33,12 @@
 import org.glassfish.contextpropagation.internal.Utils.AccessControlledMapFinder;
 import org.glassfish.contextpropagation.spi.ContextMapHelper;
 import org.glassfish.contextpropagation.wireadapters.glassfish.DefaultWireAdapter;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import static org.glassfish.tests.utils.Utils.getStaticField;
 import static org.glassfish.tests.utils.Utils.setStaticField;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
@@ -49,47 +51,57 @@
 
 public class ContextMapImplTest {
 
-    private static Entry DUMMY_ENTRY;
-    private static EnumSet<PropagationMode> PROP_MODES = PropagationMode.defaultSet();
-    private static ContextMap cm;
-    private static AccessControlledMap acMap;
-    private static AccessControlledMap savedMap;
-    static AccessControlledMapFinder mapFinder = new AccessControlledMapFinder() {
+    private static final Entry DUMMY_ENTRY
+        = new Entry("dummy", PropagationMode.defaultSet(), ContextType.STRING).init(true, true);
+    private static final EnumSet<PropagationMode> PROP_MODES = PropagationMode.defaultSet();
+    private static ContextMap contextMap;
+    private static AccessControlledMap acMapForFinder;
+    private static AccessControlledMap acMapCustom;
+    private static AccessControlledMapFinder originalFinder;
+    private static AccessControlledMapFinder mapFinder = new AccessControlledMapFinder() {
 
         @Override
         protected AccessControlledMap getMapIfItExists() {
             AccessControlledMap map = super.getMapIfItExists();
-            return map == null ? acMap : map;
+            return map == null ? acMapForFinder : map;
         }
     };
 
     @BeforeAll
     public static void setupClass() {
         BootstrapUtils.bootstrap(new DefaultWireAdapter());
-        DUMMY_ENTRY = new Entry("dummy", PropagationMode.defaultSet(), ContextType.STRING).init(true, true);
-        savedMap = new AccessControlledMap();
+        originalFinder = getStaticField(Utils.class, "mapFinder");
         setStaticField(Utils.class, "mapFinder", mapFinder);
-        cm = Utils.getScopeAwareContextMap();
-        savedMap.simpleMap.put("key", DUMMY_ENTRY);
-        savedMap.simpleMap.put("removeMe", DUMMY_ENTRY);
+
+        contextMap = Utils.getScopeAwareContextMap();
+
+        acMapCustom = new AccessControlledMap();
+        acMapCustom.simpleMap.put("key", DUMMY_ENTRY);
+        acMapCustom.simpleMap.put("removeMe", DUMMY_ENTRY);
+
         Entry entry = new Entry(new Location(new ViewImpl(Location.KEY)) {
         }, PropagationMode.defaultSet(), ContextType.VIEW_CAPABLE).init(true, true);
-        savedMap.simpleMap.put(Location.KEY, entry);
+        acMapCustom.simpleMap.put(Location.KEY, entry);
     }
 
 
     @BeforeEach
     public void setup() {
         BootstrapUtils.bootstrap(new DefaultWireAdapter());
-        acMap = null;
+        acMapForFinder = null;
     }
 
+    @AfterAll
+    public static void reset() {
+        BootstrapUtils.reset();
+        setStaticField(Utils.class, "mapFinder", originalFinder);
+    }
 
     @Test
     public void testGet() throws InsufficientCredentialException {
-        assertNull(cm.get("key"));
-        acMap = savedMap;
-        assertEquals("dummy", cm.get("key"));
+        assertNull(contextMap.get("key"));
+        acMapForFinder = acMapCustom;
+        assertEquals("dummy", contextMap.get("key"));
     }
 
 
@@ -97,9 +109,9 @@
     public void testPutString() throws InsufficientCredentialException {
         String key = "a String";
         String origContext = "string";
-        cm.put(key, origContext, PROP_MODES);
+        contextMap.put(key, origContext, PROP_MODES);
         checkPut(key, origContext);
-        assertEquals(origContext, cm.put(key, "new string", PROP_MODES));
+        assertEquals(origContext, contextMap.put(key, "new string", PROP_MODES));
     }
 
 
@@ -114,9 +126,9 @@
     public void testPutNumber() throws InsufficientCredentialException {
         String key = "a long";
         long origContext = 1L;
-        cm.put(key, origContext, PROP_MODES);
+        contextMap.put(key, origContext, PROP_MODES);
         checkPut(key, origContext);
-        assertThat(cm.put(key, 2L, PROP_MODES), equalTo(origContext));
+        assertThat(contextMap.put(key, 2L, PROP_MODES), equalTo(origContext));
     }
 
 
@@ -124,15 +136,15 @@
     public void testPutBoolean() throws InsufficientCredentialException {
         String key = "a boolean";
         boolean origContext = true;
-        cm.put(key, origContext, PROP_MODES);
+        contextMap.put(key, origContext, PROP_MODES);
         checkPut(key, origContext);
-        assertThat(cm.put(key, false, PROP_MODES), equalTo(origContext));
+        assertThat(contextMap.put(key, false, PROP_MODES), equalTo(origContext));
     }
 
 
     @Test
     public void testCreateViewCapable() throws InsufficientCredentialException {
-        acMap = savedMap;
+        acMapForFinder = acMapCustom;
         String prefix = "a view capable";
         ContextMapHelper.registerContextFactoryForPrefixNamed(prefix, new ContextViewFactory() {
 
@@ -148,23 +160,23 @@
                     /* dummy instance */};
             }
         });
-        assertNotNull(cm.createViewCapable(prefix));
+        assertNotNull(contextMap.createViewCapable(prefix));
     }
 
 
     @Test
     public void testGetPropagationModes() throws InsufficientCredentialException {
-        assertNull(cm.getPropagationModes("key"));
-        acMap = savedMap;
-        assertEquals(PropagationMode.defaultSet(), cm.getPropagationModes("key"));
+        assertNull(contextMap.getPropagationModes("key"));
+        acMapForFinder = acMapCustom;
+        assertEquals(PropagationMode.defaultSet(), contextMap.getPropagationModes("key"));
     }
 
 
     @Test
     public void testRemove() throws InsufficientCredentialException {
-        acMap = savedMap;
-        assertNull(cm.remove("nonexistent"));
-        assertNotNull(cm.remove("removeMe"));
+        acMapForFinder = acMapCustom;
+        assertNull(contextMap.remove("nonexistent"));
+        assertNotNull(contextMap.remove("removeMe"));
     }
 
 
@@ -172,36 +184,36 @@
     public void testPutCharacter() throws InsufficientCredentialException {
         String key = "a Character";
         char origContext = 'c';
-        cm.put(key, origContext, PROP_MODES);
+        contextMap.put(key, origContext, PROP_MODES);
         checkPut(key, origContext);
-        assertThat(cm.put(key, 'd', PROP_MODES), equalTo(origContext));
+        assertThat(contextMap.put(key, 'd', PROP_MODES), equalTo(origContext));
     }
 
 
     @Test
     public void testGetLocationNormalCase() {
-        acMap = savedMap;
-        Location location = cm.getLocation();
+        acMapForFinder = acMapCustom;
+        Location location = contextMap.getLocation();
         assertNotNull(location);
     }
 
 
     @Test
     public void testIsEmpty() {
-        assertTrue(cm.isEmpty());
-        acMap = new AccessControlledMap();
-        assertTrue(cm.isEmpty());
-        acMap = savedMap;
-        assertFalse(cm.isEmpty());
+        assertTrue(contextMap.isEmpty());
+        acMapForFinder = new AccessControlledMap();
+        assertTrue(contextMap.isEmpty());
+        acMapForFinder = acMapCustom;
+        assertFalse(contextMap.isEmpty());
     }
 
 
     @Test
     public void testNames() {
-        Iterator<?> iter = cm.names();
+        Iterator<?> iter = contextMap.names();
         assertNull(iter);
-        acMap = savedMap;
-        iter = cm.names();
+        acMapForFinder = acMapCustom;
+        iter = contextMap.names();
         while (iter.hasNext()) {
             MockLoggerAdapter.debug((String) iter.next());
         }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapPropagatorTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapPropagatorTest.java
index 82bc170..a9acc0f 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapPropagatorTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ContextMapPropagatorTest.java
@@ -32,6 +32,7 @@
 import org.glassfish.contextpropagation.internal.Utils.AccessControlledMapFinder;
 import org.glassfish.contextpropagation.spi.ContextMapPropagator;
 import org.glassfish.contextpropagation.wireadapters.WireAdapter;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -90,6 +91,10 @@
         soapEntry = simpleMap.getEntry("soap");
     }
 
+    @AfterAll
+    public static void reset() {
+        BootstrapUtils.reset();
+    }
 
     @Test
     public void testSendRequest() throws Exception {
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/SimpleMapTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/SimpleMapTest.java
index dde6656..e3a7d8f 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/SimpleMapTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/SimpleMapTest.java
@@ -36,6 +36,7 @@
 import org.glassfish.contextpropagation.internal.Entry.ContextType;
 import org.glassfish.contextpropagation.internal.SimpleMap.Filter;
 import org.glassfish.contextpropagation.wireadapters.glassfish.DefaultWireAdapter;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -110,13 +111,19 @@
 
 
     @BeforeAll
-    public static void setupClass() {
-        logger = new RecordingLoggerAdapter();
+    public static void bootstrap() {
+        // must be called here too, because isConfigured is initialized in static block
         BootstrapUtils.reset();
+        logger = new RecordingLoggerAdapter();
         ContextBootstrap.configure(logger, new DefaultWireAdapter(), new MockThreadLocalAccessor(),
             new MockContextAccessController(), "guid");
     }
 
+    @AfterAll
+    public static void reset() {
+        BootstrapUtils.reset();
+    }
+
 
     @BeforeEach
     public void setup() {
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/UtilsTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/UtilsTest.java
index 72a553d..1845773 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/UtilsTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/UtilsTest.java
@@ -32,6 +32,7 @@
 import org.glassfish.contextpropagation.bootstrap.LoggerAdapter.Level;
 import org.glassfish.contextpropagation.bootstrap.LoggerAdapter.MessageID;
 import org.glassfish.contextpropagation.wireadapters.glassfish.DefaultWireAdapter;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
@@ -42,10 +43,15 @@
 public class UtilsTest {
 
     @BeforeAll
-    public static void setupClass() {
+    public static void bootstrap() {
         BootstrapUtils.bootstrap(new DefaultWireAdapter());
     }
 
+    @AfterAll
+    public static void reset() {
+        BootstrapUtils.reset();
+    }
+
 
     @Test
     public void testGetScopeAwarePropagator() {
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ViewImplTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ViewImplTest.java
index 05a73ba..bb0d6db 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ViewImplTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/internal/ViewImplTest.java
@@ -29,8 +29,8 @@
 
 public class ViewImplTest {
 
-    static ViewImpl view;
-    static SimpleMap sm;
+    private static ViewImpl view;
+    private static SimpleMap sm;
 
     @BeforeAll
     public static void setupClass() {
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/weblogic/workarea/PropagationTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/weblogic/workarea/PropagationTest.java
index 14d48dd..8d6bc8d 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/weblogic/workarea/PropagationTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/weblogic/workarea/PropagationTest.java
@@ -17,95 +17,99 @@
 
 package org.glassfish.contextpropagation.weblogic.workarea;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.glassfish.contextpropagation.adaptors.MockLoggerAdapter;
+import org.glassfish.contextpropagation.adaptors.TestableThread;
+import org.glassfish.contextpropagation.internal.Utils;
+import org.glassfish.contextpropagation.weblogic.workarea.spi.WorkContextMapInterceptor;
+import org.glassfish.contextpropagation.weblogic.workarea.utils.WorkContextInputAdapter;
+import org.glassfish.contextpropagation.weblogic.workarea.utils.WorkContextOutputAdapter;
+import org.glassfish.contextpropagation.wireadapters.wls.MySerializable;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class PropagationTest {
-//  public static WorkContextMap wcMap;
-//
-//  @BeforeClass
-//  public static void setup() throws PropertyReadOnlyException, IOException {
-//    wcMap = WorkContextHelper.getWorkContextHelper().getWorkContextMap();
-//    wcMap.put("long", PrimitiveContextFactory.create(1L));
-//    wcMap.put("string", PrimitiveContextFactory.create("string"));
-//    wcMap.put("ascii", PrimitiveContextFactory.createASCII("ascii"));
-//    wcMap.put("serializable", PrimitiveContextFactory.createMutable(new MySerializable()));
-//    wcMap.put("workcontext", new MyWorkContext());
-//  }
-//
-//  @Test
-//  public void testRequestPropagation() throws IOException, InterruptedException {
-//    final byte[] bytes = serialize();
-//    //MockLoggerAdaper.debug(Utils.toString(bytes));
-//    new TestableThread() {
-//      @Override public void runTest() throws Exception {
-//        final WorkContextMap map = WorkContextHelper.getWorkContextHelper().getWorkContextMap();
-//        assertTrue(map.isEmpty());
-//        deserialize(bytes);
-//        Set<?> expectedSet = map2Set(wcMap);
-//        Set<?> resultSet = map2Set(map);
-//        assertEquals(expectedSet, resultSet);
-//      }
-//
-//      @SuppressWarnings("serial")
-//      private HashSet<?> map2Set(final WorkContextMap map) {
-//        return new HashSet<Object>() {{
-//          Iterator<?> it = map.iterator();
-//          while (it.hasNext()) {
-//            add(it.next());
-//          }
-//        }};
-//      }
-//    }.startJoinAndCheckForFailures();
-//    MockLoggerAdapter.debug(Utils.toString(bytes));
-//  }
-//
-//  @Ignore("there seems to be a problem with jmockit")
-//  @Test public void fromGlassfish() throws InsufficientCredentialException, IOException, InterruptedException {
-//    WorkContextMapInterceptor interceptor = WorkContextHelper.getWorkContextHelper().createInterceptor();
-//    //byte[] gBytes = getFirstBytes();
-//    byte[] bytes = WLSWireAdapterTest.toWLSBytes();
-//    //MockLoggerAdaper.debug(">>>" + Utils.toString(gBytes) + "<<<");
-//    //MockLoggerAdaper.debug(">>>" + Utils.toString(bytes) + "<<<");
-//    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    WorkContextInput wci = new WorkContextInputAdapter(new ObjectInputStream(bais));
-//    interceptor.receiveRequest(wci);
-//    WorkContextMap map = (WorkContextMap) interceptor;
-//    @SuppressWarnings("unchecked")
-//    Iterator<String> keys = map.keys();
-//    while(keys.hasNext()) {
-//      String key = keys.next();
-//      MockLoggerAdapter.debug(key + ": " + map.get(key));
-//    }
-//    assertEquals("ascii", ((PrimitiveWorkContext) map.get("ascii")).get());
-//    assertEquals("string", ((PrimitiveWorkContext)map.get("string")).get());
-//    assertEquals(1L, ((PrimitiveWorkContext)map.get("one")).get());
-//    assertEquals(MyWorkContext.class, map.get("workcontext").getClass());
-//    SerializableWorkContext swc = (SerializableWorkContext) map.get("serializable");
-//    MockLoggerAdapter.debug("Serializable contents: " + swc.get().getClass() + swc.get());
-//    Set<?> set = (Set<?>) swc.get();
-//    assertEquals(1,  set.size());
-//  }
-//
-//  public static byte[] serialize() throws IOException {
-//    WorkContextMapInterceptor wcInterceptor = WorkContextHelper.getWorkContextHelper().getLocalInterceptor();
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ObjectOutput oo = new ObjectOutputStream(baos);
-//    WorkContextOutput wco = new WorkContextOutputAdapter(oo);
-//    wcInterceptor.sendRequest(wco, PropagationMode.RMI);
-//    oo.flush();
-//    return baos.toByteArray();
-//  }
-//
-//  public static void deserialize(byte[] bytes) {
-//    try {
-//      //WorkContextHelper.getWorkContextHelper().
-//      WorkContextMapInterceptor wcInterceptor = WorkContextHelper.getWorkContextHelper().getInterceptor();
-//      ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//      ObjectInput oi = new ObjectInputStream(bais);
-//      WorkContextInput wci = new WorkContextInputAdapter(oi);
-//      wcInterceptor.receiveRequest(wci);
-//    } catch (IOException ioe) {
-//      throw new RuntimeException(ioe);
-//    }
-//  }
+
+    private static WorkContextMap wcMap;
+
+    @BeforeAll
+    public static void setup() throws Exception {
+        wcMap = WorkContextHelper.getWorkContextHelper().getWorkContextMap();
+        wcMap.put("long", PrimitiveContextFactory.create(1L));
+        wcMap.put("string", PrimitiveContextFactory.create("string"));
+        wcMap.put("ascii", PrimitiveContextFactory.createASCII("ascii"));
+        wcMap.put("serializable", PrimitiveContextFactory.createMutable(new MySerializable()));
+        wcMap.put("workcontext", new MyWorkContext());
+    }
 
 
+    @Test
+    public void testRequestPropagation() throws IOException, InterruptedException {
+        final byte[] bytes = serialize();
+        // MockLoggerAdaper.debug(Utils.toString(bytes));
+        new TestableThread() {
+
+            @Override
+            public void runTest() throws Exception {
+                final WorkContextMap map = WorkContextHelper.getWorkContextHelper().getWorkContextMap();
+                assertTrue(map.isEmpty());
+                deserialize(bytes);
+                Set<?> expectedSet = map2Set(wcMap);
+                Set<?> resultSet = map2Set(map);
+                assertEquals(expectedSet, resultSet);
+            }
+
+
+            @SuppressWarnings("serial")
+            private HashSet<?> map2Set(final WorkContextMap map) {
+                return new HashSet<>() {
+
+                    {
+                        Iterator<?> it = map.iterator();
+                        while (it.hasNext()) {
+                            add(it.next());
+                        }
+                    }
+                };
+            }
+        }.startJoinAndCheckForFailures();
+        MockLoggerAdapter.debug(Utils.toString(bytes));
+    }
+
+
+    public static byte[] serialize() throws IOException {
+        WorkContextMapInterceptor wcInterceptor = WorkContextHelper.getWorkContextHelper().getLocalInterceptor();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutput oo = new ObjectOutputStream(baos);
+        WorkContextOutput wco = new WorkContextOutputAdapter(oo);
+        wcInterceptor.sendRequest(wco, PropagationMode.RMI);
+        oo.flush();
+        return baos.toByteArray();
+    }
+
+
+    private static void deserialize(byte[] bytes) {
+        try {
+            WorkContextMapInterceptor wcInterceptor = WorkContextHelper.getWorkContextHelper().getInterceptor();
+            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+            ObjectInput oi = new ObjectInputStream(bais);
+            WorkContextInput wci = new WorkContextInputAdapter(oi);
+            wcInterceptor.receiveRequest(wci);
+        } catch (IOException ioe) {
+            throw new IllegalStateException(ioe);
+        }
+    }
 }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/CatalogTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/CatalogTest.java
index 3c2b6c3..b87a3f1 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/CatalogTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/CatalogTest.java
@@ -23,28 +23,29 @@
 
 public class CatalogTest {
 
-  @Test
-  public void testUpdateMeta() {
-    byte dot = '.';
-    Catalog cat = new Catalog();
-    cat.add((short) 5);
-    cat.add((short) 0x02FF);
-    byte[] bytes = "..xxxx....".getBytes();
-    cat.updateCatalogMetadata(bytes);
-    assertEquals(dot, bytes[0]);
-    assertEquals(dot, bytes[1]);
-    assertEquals((byte) 0, bytes[2]);
-    assertEquals((byte) 5, bytes[3]);
-    assertEquals((byte) 2, bytes[4]);
-    assertEquals((byte) 0xFF, bytes[5]);
-  }
+    @Test
+    public void testUpdateMeta() {
+        byte dot = '.';
+        Catalog cat = new Catalog();
+        cat.add((short) 5);
+        cat.add((short) 0x02FF);
+        byte[] bytes = "..xxxx....".getBytes();
+        cat.updateCatalogMetadata(bytes);
+        assertEquals(dot, bytes[0]);
+        assertEquals(dot, bytes[1]);
+        assertEquals((byte) 0, bytes[2]);
+        assertEquals((byte) 5, bytes[3]);
+        assertEquals((byte) 2, bytes[4]);
+        assertEquals((byte) 0xFF, bytes[5]);
+    }
 
-  @Test
-  public void testSetMeta() {
-    Catalog cat = new Catalog();
-    cat.setMeta(0xABCD1234);
-    assertEquals((short) 0xABCD, cat.start);
-    assertEquals((short) 0x1234, cat.end);
-  }
+
+    @Test
+    public void testSetMeta() {
+        Catalog cat = new Catalog();
+        cat.setMeta(0xABCD1234);
+        assertEquals((short) 0xABCD, cat.start);
+        assertEquals((short) 0x1234, cat.end);
+    }
 
 }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/PositionAwareObjectOutputStreamTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/PositionAwareObjectOutputStreamTest.java
index 8453208..a498544 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/PositionAwareObjectOutputStreamTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/PositionAwareObjectOutputStreamTest.java
@@ -17,90 +17,129 @@
 
 package org.glassfish.contextpropagation.wireadapters;
 
-//import mockit.Deencapsulation;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.util.LinkedList;
+import java.util.List;
 
+import org.glassfish.contextpropagation.adaptors.MockLoggerAdapter;
+import org.glassfish.contextpropagation.internal.Utils;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 
 public class PositionAwareObjectOutputStreamTest {
-//
-//  @Test
-//  public void testSimple() throws IOException {
-//    Populateable p = new Populateable() {
-//      @Override  public void populate(ObjectOutputStream oos, List<Short> positions) throws IOException {
-//        oos.writeLong(1);
-//        oos.writeObject("foo");
-//        oos.writeLong(2);
-//        oos.writeObject("bar");
-//      }
-//    };
-//    assertArrayEquals(populate(ObjectOutputStream.class, p, null),
-//        populate(PositionAwareObjectOutputStream.class, p, null));
-//  }
-//
-//  @Test public void testPositions() throws IOException {
-//    LinkedList<Short> positions = new LinkedList<Short>();
-//    Populateable p = new Populateable() {
-//      @Override  public void populate(ObjectOutputStream oos, List<Short> positions) throws IOException {
-//        byte[] buf = "Some Bytes".getBytes();
-//        addPosition(positions, oos); oos.writeObject("foo");
-//        addPosition(positions, oos); oos.writeShort(1);
-//        addPosition(positions, oos); oos.writeLong(2);
-//        addPosition(positions, oos); oos.writeBoolean(true);
-//        addPosition(positions, oos); oos.writeDouble(2.1E5);
-//        addPosition(positions, oos); oos.writeFloat(2.1F);
-//        addPosition(positions, oos); oos.write(buf);
-//        addPosition(positions, oos); oos.writeByte((byte) 'b');
-//        addPosition(positions, oos); oos.writeChar('c');
-//        addPosition(positions, oos); oos.writeChars("chars");
-//        addPosition(positions, oos); oos.writeInt(1);
-//        addPosition(positions, oos); oos.writeObject("bar");
-//        addPosition(positions, oos);
-//      }
-//    };
-//    byte[] bytes = populate(PositionAwareObjectOutputStream.class, p, positions);
-//    MockLoggerAdapter.debug("bytes size: " + bytes.length + ", positions: " + positions);
-//    byte [] expectedBytes = populate(ObjectOutputStream.class, p, null);
-//    MockLoggerAdapter.debug(Utils.toString(expectedBytes));
-//    MockLoggerAdapter.debug(Utils.toString(bytes));
-//    assertArrayEquals(expectedBytes, bytes);
-//  }
-//
-//
-//  private void addPosition(List<Short> positions, ObjectOutputStream oos) throws IOException {
-//    if (oos instanceof PositionAwareObjectOutputStream) {
-//      positions.add(((PositionAwareObjectOutputStream) oos).position());
-//    }
-//  }
-//
-//  private interface Populateable {
-//    void populate(ObjectOutputStream oos, List<Short> positions) throws IOException;
-//  }
-//
-//  private <T extends ObjectOutputStream> byte[] populate(Class<T> clz, Populateable p, List<Short> positions) throws IOException {
-//    StreamWrapper<T> sw = new StreamWrapper<T>(clz);
-//    ObjectOutputStream oos = sw.getObjectOutputStream();
-//    p.populate(oos, positions);
-//    return sw.getBytes();
-//  }
-//
-//  private static class StreamWrapper<T extends ObjectOutputStream> {
-//    ByteArrayOutputStream baos;
-//    ObjectOutputStream oos;
-//
-//    private StreamWrapper(Class<T> clz) throws IOException {
-//    baos = new ByteArrayOutputStream();
-//    //oos = clz == PositionAwareObjectOutputStream.class ? new PositionAwareObjectOutputStream(baos) : new ObjectOutputStream(baos);
-//    oos = Deencapsulation.newInstance(clz, baos); // Above approach produces the same results. Something strange with the instantiation of this stream.
-//    }
-//
-//    private ObjectOutputStream getObjectOutputStream() {
-//      return oos;
-//    }
-//
-//    private byte[] getBytes() throws IOException {
-//      oos.flush();
-//      return baos.toByteArray();
-//    }
-//  }
+
+    @Test
+    public void testSimple() throws IOException {
+        Populateable p = new Populateable() {
+
+            @Override
+            public void populate(ObjectOutputStream oos, List<Short> positions) throws IOException {
+                oos.writeLong(1);
+                oos.writeObject("foo");
+                oos.writeLong(2);
+                oos.writeObject("bar");
+            }
+        };
+        assertArrayEquals(
+            populate(ObjectOutputStream.class, p, null),
+            populate(PositionAwareObjectOutputStream.class, p, null)
+        );
+    }
+
+
+    @Test
+    public void testPositions() throws IOException {
+        LinkedList<Short> positions = new LinkedList<>();
+        Populateable p = new Populateable() {
+
+            @Override
+            public void populate(ObjectOutputStream oos, List<Short> positions) throws IOException {
+                byte[] buf = "Some Bytes".getBytes();
+                addPosition(positions, oos);
+                oos.writeObject("foo");
+                addPosition(positions, oos);
+                oos.writeShort(1);
+                addPosition(positions, oos);
+                oos.writeLong(2);
+                addPosition(positions, oos);
+                oos.writeBoolean(true);
+                addPosition(positions, oos);
+                oos.writeDouble(2.1E5);
+                addPosition(positions, oos);
+                oos.writeFloat(2.1F);
+                addPosition(positions, oos);
+                oos.write(buf);
+                addPosition(positions, oos);
+                oos.writeByte((byte) 'b');
+                addPosition(positions, oos);
+                oos.writeChar('c');
+                addPosition(positions, oos);
+                oos.writeChars("chars");
+                addPosition(positions, oos);
+                oos.writeInt(1);
+                addPosition(positions, oos);
+                oos.writeObject("bar");
+                addPosition(positions, oos);
+            }
+        };
+        byte[] bytes = populate(PositionAwareObjectOutputStream.class, p, positions);
+        MockLoggerAdapter.debug("bytes size: " + bytes.length + ", positions: " + positions);
+        byte[] expectedBytes = populate(ObjectOutputStream.class, p, null);
+        MockLoggerAdapter.debug(Utils.toString(expectedBytes));
+        MockLoggerAdapter.debug(Utils.toString(bytes));
+        assertArrayEquals(expectedBytes, bytes);
+    }
+
+
+    private void addPosition(List<Short> positions, ObjectOutputStream oos) throws IOException {
+        if (oos instanceof PositionAwareObjectOutputStream) {
+            positions.add(((PositionAwareObjectOutputStream) oos).position());
+        }
+    }
+
+    private interface Populateable {
+
+        void populate(ObjectOutputStream oos, List<Short> positions) throws IOException;
+    }
+
+    private <T extends ObjectOutputStream> byte[] populate(Class<T> clz, Populateable p, List<Short> positions)
+        throws IOException {
+        StreamWrapper<T> sw = new StreamWrapper<>(clz);
+        ObjectOutputStream oos = sw.getObjectOutputStream();
+        p.populate(oos, positions);
+        return sw.getBytes();
+    }
+
+    private static class StreamWrapper<T extends ObjectOutputStream> {
+
+        private final ByteArrayOutputStream baos;
+        private ObjectOutputStream oos;
+
+        private StreamWrapper(Class<T> clz) throws IOException {
+            baos = new ByteArrayOutputStream();
+            // oos = clz == PositionAwareObjectOutputStream.class ? new PositionAwareObjectOutputStream(baos) : new ObjectOutputStream(baos);
+            // Above approach produces the same results. Something strange with the instantiation of this stream.
+            try {
+                oos = clz.getConstructor(OutputStream.class).newInstance(baos);
+            } catch (ReflectiveOperationException e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+
+
+        private ObjectOutputStream getObjectOutputStream() {
+            return oos;
+        }
+
+
+        private byte[] getBytes() throws IOException {
+            oos.flush();
+            return baos.toByteArray();
+        }
+    }
 
 }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/DefaultWireAdapterTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/DefaultWireAdapterTest.java
index 16a9192..bb4767e 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/DefaultWireAdapterTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/DefaultWireAdapterTest.java
@@ -17,132 +17,179 @@
 
 package org.glassfish.contextpropagation.wireadapters.glassfish;
 
-//import mockit.Deencapsulation;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Map;
 
+import org.glassfish.contextpropagation.ContextMap;
+import org.glassfish.contextpropagation.InsufficientCredentialException;
+import org.glassfish.contextpropagation.PropagationMode;
+import org.glassfish.contextpropagation.SerializableContextFactory;
+import org.glassfish.contextpropagation.adaptors.BootstrapUtils;
+import org.glassfish.contextpropagation.adaptors.MockLoggerAdapter;
+import org.glassfish.contextpropagation.adaptors.TestableThread;
+import org.glassfish.contextpropagation.internal.Utils;
+import org.glassfish.contextpropagation.spi.ContextMapHelper;
+import org.glassfish.contextpropagation.spi.ContextMapPropagator;
+import org.glassfish.contextpropagation.weblogic.workarea.PropagationTest;
+import org.glassfish.contextpropagation.weblogic.workarea.PropertyReadOnlyException;
+import org.glassfish.contextpropagation.wireadapters.AbstractWireAdapter;
+import org.glassfish.contextpropagation.wireadapters.Catalog;
+import org.glassfish.contextpropagation.wireadapters.WireAdapter;
+import org.glassfish.contextpropagation.wireadapters.wls.MyWLSContext;
+import org.glassfish.contextpropagation.wireadapters.wls.WLSWireAdapter;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import static org.glassfish.tests.utils.Utils.getField;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 public class DefaultWireAdapterTest {
-//  ContextMap wcMap;
-//
-//  @Before
-//  public void setup() throws InsufficientCredentialException {
-//    BootstrapUtils.reset();
-//    BootstrapUtils.bootstrap(new DefaultWireAdapter());
-//    BootstrapUtils.populateMap();
-//    wcMap = ContextMapHelper.getScopeAwareContextMap();
-//  }
-//
-//  @Test
-//  public void testWrite() throws IOException, InterruptedException {
-//    ByteArrayOutputStream out = new ByteArrayOutputStream();
-//    ContextMapHelper.getScopeAwarePropagator().sendRequest(out, PropagationMode.RMI);
-//    byte[] bytes = out.toByteArray();
-//    MockLoggerAdapter.debug("length: " + bytes.length + ", "  + Utils.toString(bytes));
-//
-//    // Move to its own test
-//    final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    new TestableThread() {
-//      @Override public void runTest() throws Exception {
-//          ContextMap map = ContextMapHelper.getScopeAwareContextMap();
-//          assertNull(map.get("one"));
-//          ContextMapHelper.getScopeAwarePropagator().receiveRequest(bais);
-//          assertNotNull(map.get("one"));
-//      }
-//    }.startJoinAndCheckForFailures();
-//  }
-//
-//  @Test
-//  public void testPropagateOpaque() throws PropertyReadOnlyException, IOException, InsufficientCredentialException {
-//    BootstrapUtils.reset();
-//    WireAdapter adapter = new WLSWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    // Receive data using WLS adaptor but lacking the necessary factory to instantiate the opaque. Make sure the object is opaque
-//    PropagationTest.setup();
-//    byte[] bytes = PropagationTest.serialize();
-//    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    registerWorkContextFactory();
-//    ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
-//    propagator.useWireAdapter(adapter);
-//    propagator.receiveRequest(bais);
-//    ContextMap cm = Utils.getScopeAwareContextMap();
-//    assertNotNull(cm.get("workcontext"));
-//
-//    // Propagate and receive using Default adaptors, but this time the factory is available. Make sure the object is properly instantiated.
-//    // Propagate to a process where there is no factory for workcontext
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    propagator = Utils.getScopeAwarePropagator();
-//    adapter = new DefaultWireAdapter();
-//    propagator.useWireAdapter(adapter);
-//    propagator.sendRequest(baos, PropagationMode.RMI);
-//
-//    // Receive on a process where the factory is not registered
-//    Map<String, SerializableContextFactory> contextFactoriesByContextName =
-//        Deencapsulation.getField(WireAdapter.HELPER, "contextFactoriesByContextName");
-//    contextFactoriesByContextName.remove("workcontext");
-//    BootstrapUtils.reset();
-//    adapter = new DefaultWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    bytes = baos.toByteArray();
-//    bais = new ByteArrayInputStream(bytes);
-//    propagator.useWireAdapter(adapter);
-//    propagator.receiveRequest(bais);
-//    assertNotNull(cm.get("workcontext"));
-//    // Then propagate again to a process where the library is registered
-//    baos = new ByteArrayOutputStream();
-//    propagator = Utils.getScopeAwarePropagator();
-//    adapter = new DefaultWireAdapter();
-//    propagator.useWireAdapter(adapter);
-//    propagator.sendRequest(baos, PropagationMode.RMI);
-//    BootstrapUtils.reset();
-//    adapter = new DefaultWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    bytes = baos.toByteArray();
-//    bais = new ByteArrayInputStream(bytes);
-//    propagator.useWireAdapter(adapter);
-//    registerWorkContextFactory();
-//    propagator.receiveRequest(bais);
-//    MyWLSContext mwc = cm.get("workcontext");
-//    assertNotNull(mwc);
-//    assertEquals((long) 200, (long) mwc.l);
-//  }
-//
-//  private void registerWorkContextFactory() {
-//    WireAdapter.HELPER.registerContextFactoryForContextNamed("workcontext", null,
-//        new SerializableContextFactory() {
-//          @Override
-//          public WLSContext createInstance() {
-//            return new MyWLSContext();
-//          }
-//    });
-//  }
-//
-//  @Test public void testWithCatalog() throws PropertyReadOnlyException, IOException {
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
-//    WireAdapter adapter = new DefaultWireAdapter();
-//    propagator.useWireAdapter(adapter);
-//    propagator.sendRequest(baos, PropagationMode.RMI);
-//    Catalog catalog = Deencapsulation.getField((AbstractWireAdapter) adapter, "catalog");
-//    BootstrapUtils.reset();
-//    adapter = new DefaultWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    byte[] bytes = baos.toByteArray();
-//    MockLoggerAdapter.debug(Utils.toString(bytes));
-//    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    propagator.useWireAdapter(adapter);
-//    propagator.receiveRequest(bais);
-//    Catalog newCatalog = Deencapsulation.getField(adapter, "catalog");
-//    assertEquals(catalog, newCatalog);
-//  }
-//
-//  @Test public void testObjectInputStream() throws IOException {
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ObjectOutputStream oos = new ObjectOutputStream(baos);
-//    oos.write("Some data".getBytes());
-//    oos.flush();
-//    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-//    ObjectInputStream ois = new ObjectInputStream(bais);
-//    assertFalse(ois.markSupported());
-//  }
+
+    ContextMap wcMap;
+
+    @BeforeEach
+    public void setup() throws InsufficientCredentialException {
+        BootstrapUtils.bootstrap(new DefaultWireAdapter());
+        BootstrapUtils.populateMap();
+        wcMap = ContextMapHelper.getScopeAwareContextMap();
+    }
+
+
+    @AfterEach
+    public void reset() {
+        BootstrapUtils.reset();
+    }
+
+
+    @Test
+    public void testWrite() throws IOException, InterruptedException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ContextMapHelper.getScopeAwarePropagator().sendRequest(out, PropagationMode.RMI);
+        byte[] bytes = out.toByteArray();
+        MockLoggerAdapter.debug("length: " + bytes.length + ", " + Utils.toString(bytes));
+
+        // Move to its own test
+        final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        new TestableThread() {
+
+            @Override
+            public void runTest() throws Exception {
+                ContextMap map = ContextMapHelper.getScopeAwareContextMap();
+                assertNull(map.get("one"));
+                ContextMapHelper.getScopeAwarePropagator().receiveRequest(bais);
+                assertNotNull(map.get("one"));
+            }
+        }.startJoinAndCheckForFailures();
+    }
+
+
+    @Test
+    public void testPropagateOpaque() throws Exception {
+        BootstrapUtils.reset();
+        WireAdapter adapter = new WLSWireAdapter();
+        BootstrapUtils.bootstrap(adapter);
+        // Receive data using WLS adaptor but lacking the necessary factory to instantiate the
+        // opaque. Make sure the object is opaque
+        PropagationTest.setup();
+        byte[] bytes = PropagationTest.serialize();
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        registerWorkContextFactory();
+        ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
+        propagator.useWireAdapter(adapter);
+        propagator.receiveRequest(bais);
+        ContextMap cm = Utils.getScopeAwareContextMap();
+        assertNotNull(cm.get("workcontext"));
+
+        // Propagate and receive using Default adaptors, but this time the factory is available.
+        // Make sure the object is properly instantiated.
+        // Propagate to a process where there is no factory for workcontext
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        propagator = Utils.getScopeAwarePropagator();
+        adapter = new DefaultWireAdapter();
+        propagator.useWireAdapter(adapter);
+        propagator.sendRequest(baos, PropagationMode.RMI);
+
+        // Receive on a process where the factory is not registered
+        Map<String, SerializableContextFactory> contextFactoriesByContextName = getField(WireAdapter.HELPER,
+            "contextFactoriesByContextName");
+        contextFactoriesByContextName.remove("workcontext");
+        BootstrapUtils.reset();
+        adapter = new DefaultWireAdapter();
+        BootstrapUtils.bootstrap(adapter);
+        bytes = baos.toByteArray();
+        bais = new ByteArrayInputStream(bytes);
+        propagator.useWireAdapter(adapter);
+        propagator.receiveRequest(bais);
+        assertNotNull(cm.get("workcontext"));
+        // Then propagate again to a process where the library is registered
+        baos = new ByteArrayOutputStream();
+        propagator = Utils.getScopeAwarePropagator();
+        adapter = new DefaultWireAdapter();
+        propagator.useWireAdapter(adapter);
+        propagator.sendRequest(baos, PropagationMode.RMI);
+        BootstrapUtils.reset();
+        adapter = new DefaultWireAdapter();
+        BootstrapUtils.bootstrap(adapter);
+        bytes = baos.toByteArray();
+        bais = new ByteArrayInputStream(bytes);
+        propagator.useWireAdapter(adapter);
+        registerWorkContextFactory();
+        propagator.receiveRequest(bais);
+        MyWLSContext mwc = cm.get("workcontext");
+        assertNotNull(mwc);
+        assertEquals(200, mwc.l);
+    }
+
+
+    private void registerWorkContextFactory() {
+        WireAdapter.HELPER.registerContextFactoryForContextNamed("workcontext", null, new SerializableContextFactory() {
+
+            @Override
+            public WLSContext createInstance() {
+                return new MyWLSContext();
+            }
+        });
+    }
+
+
+    @Test
+    public void testWithCatalog() throws PropertyReadOnlyException, IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
+        WireAdapter adapter = new DefaultWireAdapter();
+        propagator.useWireAdapter(adapter);
+        propagator.sendRequest(baos, PropagationMode.RMI);
+        Catalog catalog = getField(adapter, "catalog", AbstractWireAdapter.class);
+        BootstrapUtils.reset();
+        adapter = new DefaultWireAdapter();
+        BootstrapUtils.bootstrap(adapter);
+        byte[] bytes = baos.toByteArray();
+        MockLoggerAdapter.debug(Utils.toString(bytes));
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        propagator.useWireAdapter(adapter);
+        propagator.receiveRequest(bais);
+        Catalog newCatalog = getField(adapter, "catalog", AbstractWireAdapter.class);
+        assertEquals(catalog, newCatalog);
+    }
+
+
+    @Test
+    public void testObjectInputStream() throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.write("Some data".getBytes());
+        oos.flush();
+        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+        ObjectInputStream ois = new ObjectInputStream(bais);
+        assertFalse(ois.markSupported());
+    }
 
 }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/WirePropagationTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/WirePropagationTest.java
index e2ab71d..dbff179 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/WirePropagationTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/glassfish/WirePropagationTest.java
@@ -17,19 +17,37 @@
 
 package org.glassfish.contextpropagation.wireadapters.glassfish;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.glassfish.contextpropagation.PropagationMode;
+import org.glassfish.contextpropagation.adaptors.BootstrapUtils;
+import org.glassfish.contextpropagation.adaptors.MockLoggerAdapter;
+import org.glassfish.contextpropagation.internal.Utils;
+import org.glassfish.contextpropagation.spi.ContextMapHelper;
+import org.glassfish.contextpropagation.spi.ContextMapPropagator;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 public class WirePropagationTest {
 
-//  @BeforeClass
-//  public static void setup() throws InsufficientCredentialException {
-//    BootstrapUtils.bootstrap(new DefaultWireAdapter());
-//    BootstrapUtils.populateMap();
-//  }
-//
-//  @Test
-//  public void testPropagateOverWire() throws IOException {
-//    ContextMapPropagator wcPropagator = ContextMapHelper.getScopeAwarePropagator();
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    wcPropagator.sendRequest(baos, PropagationMode.SOAP);
-//    MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
-//  }
+    @BeforeEach
+    public void setup() throws Exception {
+        BootstrapUtils.bootstrap(new DefaultWireAdapter());
+        BootstrapUtils.populateMap();
+    }
+
+    @AfterEach
+    public void reset() {
+        BootstrapUtils.reset();
+    }
+
+    @Test
+    public void testPropagateOverWire() throws IOException {
+        ContextMapPropagator wcPropagator = ContextMapHelper.getScopeAwarePropagator();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        wcPropagator.sendRequest(baos, PropagationMode.SOAP);
+        MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
+    }
 }
diff --git a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/wls/WLSWireAdapterTest.java b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/wls/WLSWireAdapterTest.java
index b4e972b..98726cc 100644
--- a/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/wls/WLSWireAdapterTest.java
+++ b/nucleus/core/context-propagation/src/test/java/org/glassfish/contextpropagation/wireadapters/wls/WLSWireAdapterTest.java
@@ -17,340 +17,369 @@
 
 package org.glassfish.contextpropagation.wireadapters.wls;
 
-//import mockit.Deencapsulation;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.EnumSet;
 
+import org.glassfish.contextpropagation.ContextMap;
+import org.glassfish.contextpropagation.InsufficientCredentialException;
+import org.glassfish.contextpropagation.PropagationMode;
+import org.glassfish.contextpropagation.SerializableContextFactory;
+import org.glassfish.contextpropagation.SerializableContextFactory.WLSContext;
+import org.glassfish.contextpropagation.adaptors.BootstrapUtils;
+import org.glassfish.contextpropagation.adaptors.MockLoggerAdapter;
+import org.glassfish.contextpropagation.internal.AccessControlledMap;
+import org.glassfish.contextpropagation.internal.Entry;
+import org.glassfish.contextpropagation.internal.Utils;
+import org.glassfish.contextpropagation.internal.Utils.PrivilegedWireAdapterAccessor;
+import org.glassfish.contextpropagation.spi.ContextMapHelper;
+import org.glassfish.contextpropagation.spi.ContextMapPropagator;
+import org.glassfish.contextpropagation.weblogic.workarea.PropagationTest;
+import org.glassfish.contextpropagation.weblogic.workarea.PropertyReadOnlyException;
+import org.glassfish.contextpropagation.wireadapters.AbstractWireAdapter;
+import org.glassfish.contextpropagation.wireadapters.Catalog;
+import org.glassfish.contextpropagation.wireadapters.WireAdapter;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.glassfish.tests.utils.Utils.getField;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 
 public class WLSWireAdapterTest {
-//  WLSWireAdapter adapter = new WLSWireAdapter();
-//
-//  @BeforeClass
-//  public static void setupClass() {
-//    BootstrapUtils.bootstrap(new WLSWireAdapter());
-//    WLSWireAdapter.HELPER.registerContextFactoryForClass(MyWLSContext.class,
-//        "org.glassfish.contextpropagation.weblogic.workarea.MyContext",
-//        new SerializableContextFactory() {
-//      @Override
-//      public WLSContext createInstance() {
-//        return new MyWLSContext();
-//      }
-//    });
-//  }
-//
-//  @Before public void before() {
-//    BootstrapUtils.reset();
-//    BootstrapUtils.bootstrap(new WLSWireAdapter());
-//  }
-//
-//  @Test
-//  public void testFromWLS() throws IOException, PropertyReadOnlyException, ClassNotFoundException {
-//    PropagationTest.setup();
-//    byte[] bytes = PropagationTest.serialize();
-//    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    WireAdapter adapter = new WLSWireAdapter();
-//    adapter.prepareToReadFrom(bais);
-//    for(String key = adapter.readKey(); key != null; key = adapter.readKey()) {
-//      adapter.readEntry();
-//    }
-//  }
-//
-//  @Test public void testWithCatalog() throws PropertyReadOnlyException, IOException, InsufficientCredentialException {
-//    BootstrapUtils.populateMap();
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
-//    WLSWireAdapter adapter = new WLSWireAdapter();
-//    propagator.useWireAdapter(adapter);
-//    propagator.sendRequest(baos, PropagationMode.RMI);
-//    Catalog catalog = Deencapsulation.getField((AbstractWireAdapter) adapter, "catalog");
-//    BootstrapUtils.reset();
-//    adapter = new WLSWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    byte[] bytes = baos.toByteArray();
-//    MockLoggerAdapter.debug(Utils.toString(bytes));
-//    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    propagator.useWireAdapter(adapter);
-//    propagator.receiveRequest(bais);
-//    Catalog newCatalog = Deencapsulation.getField(adapter, "wlsCatalog");
-//    assertEquals(catalog, newCatalog);
-//    //MockLoggerAdapter.debug("start: " + Deencapsulation.getField(newCatalog, "start") + ", end: " + Deencapsulation.getField(newCatalog, "end"));
-//  }
-//
-//  @Test
-//  public void testResilientWithBadSerializableInsertFirst() throws IOException, InsufficientCredentialException {
-//    badSerializable(true);
-//  }
-//
-//  @Test
-//  public void testResilientWithBadSerializableInsertLast() throws IOException, InsufficientCredentialException {
-//    badSerializable(false);
-//  }
-//
-//  private void badSerializable(boolean insertFirst) throws IOException, InsufficientCredentialException {
-//    ContextMap wcMap = ContextMapHelper.getScopeAwareContextMap();
-//    String key = "faulty serializable";
-//    @SuppressWarnings("serial")
-//    Serializable faultySerializable = new Serializable() {
-//      @SuppressWarnings("unused")
-//      transient String s = "";
-//      private void writeObject(ObjectOutputStream out)
-//          throws IOException {
-//        out.writeLong(1L);
-//        out.writeUTF("a string");
-//      }
-//      private void readObject(ObjectInputStream in)
-//          throws IOException, ClassNotFoundException {
-//        MockLoggerAdapter.debug("*******");
-//        in.readFully(new byte[25]); // expected to fail since we should be reading a long and produce stack traces
-//        MockLoggerAdapter.debug(" -- done");
-//      }
-//    };
-//    if (insertFirst) Deencapsulation.invoke(wcMap, "putSerializable", key, faultySerializable, PropagationMode.defaultSet());
-//    BootstrapUtils.populateMap();
-//    if (!insertFirst) Deencapsulation.invoke(wcMap, "putSerializable", key, faultySerializable, PropagationMode.defaultSet());
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
-//    WLSWireAdapter adapter = new WLSWireAdapter();
-//    propagator.useWireAdapter(adapter);
-//    propagator.sendRequest(baos, PropagationMode.RMI);
-//    Catalog catalog = Deencapsulation.getField((AbstractWireAdapter) adapter, "catalog");
-//    BootstrapUtils.reset();
-//    adapter = new WLSWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    byte[] bytes = baos.toByteArray();
-//    MockLoggerAdapter.debug(Utils.toString(bytes));
-//    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    propagator.useWireAdapter(adapter);
-//    propagator.receiveRequest(bais);
-//    Catalog newCatalog = Deencapsulation.getField(adapter, "wlsCatalog");
-//    assertNull(wcMap.get(key));
-//    assertEquals(catalog, newCatalog); // Check that the catalog is read since the faulty context is read before it.
-//  }
-//
-//  @Test(expected = IOException.class) public void markReset() throws IOException {
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ObjectOutputStream oos = new ObjectOutputStream(baos);
-//    oos.write("Some data".getBytes());
-//    oos.flush();
-//    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-//    bais.mark(100);
-//    bais.read();
-//    bais.reset();
-//    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(bais));
-//    ois.mark(100);
-//    ois.read();
-//    ois.skip(5); // It can skip but cannot reset
-//    assertEquals(false, ois.markSupported());
-//    ois.reset(); // ObjectOutputStream does not support reset even if we give it a BufferedInputStream
-//  }
-//
-//  @Test
-//  public void testResilientWithBadWorkContext() throws IOException, InsufficientCredentialException {
-//    ContextMap wcMap = ContextMapHelper.getScopeAwareContextMap();
-//    AccessControlledMap acm = ((PrivilegedWireAdapterAccessor) wcMap).getAccessControlledMap(true);
-//    String key = "bad work context";
-//    WLSContext ctx = new WLSContext() {
-//      @Override
-//      public void writeContext(ObjectOutput out) throws IOException {
-//        out.writeUTF("a string");
-//      }
-//      @Override
-//      public void readContext(ObjectInput in) throws IOException {
-//        in.readLong(); // Expected to fail
-//      }
-//    };
-//    acm.put(key, Entry.createOpaqueEntryInstance(ctx, PropagationMode.defaultSet(), ctx.getClass().getName()).init(
-//        true, false));
-//    BootstrapUtils.populateMap();
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
-//    WLSWireAdapter adapter = new WLSWireAdapter();
-//    propagator.useWireAdapter(adapter);
-//    propagator.sendRequest(baos, PropagationMode.RMI);
-//    Catalog catalog = Deencapsulation.getField((AbstractWireAdapter) adapter, "catalog");
-//    BootstrapUtils.reset();
-//    adapter = new WLSWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    byte[] bytes = baos.toByteArray();
-//    MockLoggerAdapter.debug(Utils.toString(bytes));
-//    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
-//    propagator.useWireAdapter(adapter);
-//    propagator.receiveRequest(bais);
-//    Catalog newCatalog = Deencapsulation.getField(adapter, "wlsCatalog");
-//    assertEquals(catalog, newCatalog);
-//    assertNull(wcMap.get(key));
-//  }
-//
-//  public static byte[] toWLSBytes() throws InsufficientCredentialException, IOException {
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    WireAdapter adapter = new WLSWireAdapter();
-//    BootstrapUtils.bootstrap(adapter);
-//    BootstrapUtils.populateMap();
-//    //adapter.prepareToWriteTo(baos);
-//    ContextMapPropagator propagator = ContextMapHelper.getScopeAwarePropagator();
-//    Deencapsulation.setField(WLSWireAdapter.class, "WLS_CARRIER_CLASS_NAME",
-//        "org.glassfish.contextpropagation.weblogic.workarea.SerializableWorkContext$Carrier");
-//    Deencapsulation.setField(ClassNames.class, "ASCII",
-//        "org.glassfish.contextpropagation.weblogic.workarea.AsciiWorkContext".getBytes());
-//    Deencapsulation.setField(ClassNames.class, "LONG",
-//        "org.glassfish.contextpropagation.weblogic.workarea.LongWorkContext".getBytes());
-//    Deencapsulation.setField(ClassNames.class, "STRING",
-//        "org.glassfish.contextpropagation.weblogic.workarea.StringWorkContext".getBytes());
-//    Deencapsulation.setField(ClassNames.class, "SERIALIZABLE",
-//        "org.glassfish.contextpropagation.weblogic.workarea.SerializableWorkContext".getBytes());
-//    propagator.sendRequest(baos, PropagationMode.RMI);
-//    //MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
-//    return baos.toByteArray();
-//  }
-//
-//  @Test @Ignore("moved functionality to Carrier, check if duplicate test or needs rework")
-//  public void testObjectOutputStreamWriteObject() throws IOException {
-//    /*
-//     * checks the capability to change the class name on the wire when serializing objects.
-//     */
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    SerializableContextFactory contextFactory = new SerializableContextFactory() {
-//      @Override
-//      public WLSContext createInstance() {
-//        //  Auto-generated method stub
-//        return null;
-//      }};
-//      Serializable s = new MySerializable();
-//      WLSWireAdapter.HELPER.registerContextFactoryForClass(MySerializable.class,
-//          "workarea.String", contextFactory);
-//      WLSWireAdapter.HELPER.registerContextFactoryForContextNamed(
-//          "foo", "workarea.Foo", contextFactory);
-//      Object oois = Deencapsulation.newInstance(
-//          "weblogic.workarea.WLSWireAdapter$ObjectOutputInterceptorStream", baos);
-//      Deencapsulation.invoke(oois, "writeObject", s);
-//      Deencapsulation.invoke(oois, "setContextName", "foo");
-//      Deencapsulation.invoke(oois, "writeObject", new MySerializable2());
-//      Deencapsulation.invoke(oois, "flush");
-//      String output = new String(baos.toByteArray());
-//      assertTrue(output.contains("workarea.String"));
-//      assertTrue(output.contains("workarea.Foo"));
-//  }
-//
-//  @Test public void convertPropagationMode() {
-//    // LOCAL, WORK, RMI, TRANSACTION, JMS_QUEUE, JMS_TOPIC, SOAP, MIME_HEADER, ONEWAY
-//    checkPropModeConversion(EnumSet.of(PropagationMode.LOCAL),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.LOCAL);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.THREAD),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.RMI),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.RMI);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.TRANSACTION),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.TRANSACTION);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.JMS_QUEUE),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_QUEUE);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.JMS_TOPIC),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_TOPIC);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.SOAP),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.SOAP);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.MIME_HEADER),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.MIME_HEADER);
-//    checkPropModeConversion(EnumSet.of(PropagationMode.ONEWAY),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.ONEWAY);
-//    /*
-//     * Glassfish's default includes all of the WLS default plus THREAD (which
-//     * is equivalent to the WLS propagation mode WORK)
-//     */
-//    checkPropModeConversion(PropagationMode.defaultSet(),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.DEFAULT +
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
-//    checkPropModeConversion(PropagationMode.defaultSet(),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.GLOBAL +
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
-//  }
-//
-//  private void checkPropModeConversion(EnumSet<PropagationMode> propagationModes, int expectedWLSPropMode) {
-//    assertEquals(expectedWLSPropMode, WLSWireAdapter.toWlsPropagationMode(propagationModes));
-//  }
-//
-//  @Test public void toPropagationMode() {
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.LOCAL),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.LOCAL);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.THREAD),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.RMI),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.RMI);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.TRANSACTION),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.TRANSACTION);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.JMS_QUEUE),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_QUEUE);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.JMS_TOPIC),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_TOPIC);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.SOAP),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.SOAP);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.MIME_HEADER),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.MIME_HEADER);
-//    checkReversePropModeConversion(EnumSet.of(PropagationMode.ONEWAY),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.ONEWAY);
-//    checkReversePropModeConversion(PropagationMode.defaultSet(),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.DEFAULT +
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
-//    checkReversePropModeConversion(PropagationMode.defaultSet(),
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.GLOBAL +
-//        org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
-//  }
-//
-//  private void checkReversePropModeConversion(
-//      EnumSet<PropagationMode> modes, int mode) {
-//    assertEquals(modes, WLSWireAdapter.toPropagationMode(mode));
-//
-//  }
-//
-//  void foo(Object o) {System.out.println(o);}
-//
-//  @Test public void testFoo() {
-//    foo(1);
-//  }
-//
-//  @Test public void testStreams() throws IOException {
-//    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-//    ObjectOutputStream oos = new ObjectOutputStream(baos);
-//    oos.write("foo".getBytes());
-//    oos.write("bar".getBytes());
-//    oos.flush();
-//    MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
-//
-//    baos = new ByteArrayOutputStream();
-//    oos = new ObjectOutputStream(baos);
-//    oos.write("foo".getBytes());
-//    ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
-//    ObjectOutputStream oos2 = new ObjectOutputStream(baos2);
-//    oos2.write("bar".getBytes());
-//    oos2.flush();
-//    oos.write(baos2.toByteArray());
-//    oos.flush();
-//    MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
-//
-//    baos = new ByteArrayOutputStream();
-//    oos = new ObjectOutputStream(baos);
-//    oos.write("foo".getBytes());
-//    baos2 = new ByteArrayOutputStream();
-//    oos2 = new ObjectOutputStream(baos2);
-//    oos2.write("bar".getBytes());
-//    oos2.flush();
-//    oos.flush();
-//    baos.write(baos2.toByteArray());
-//    MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
-//
-//    baos = new ByteArrayOutputStream();
-//    baos.write("foo".getBytes());
-//    MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
-//
-//    baos = new ByteArrayOutputStream();
-//    oos = new ObjectOutputStream(baos);
-//    oos.write("foo".getBytes());
-//    baos2 = new ByteArrayOutputStream();
-//    oos2 = new ObjectOutputStream(baos2);
-//    oos2.write("bar".getBytes());
-//    oos2.flush();
-//    byte[] bytes = baos2.toByteArray();
-//    oos.write(bytes, 6, bytes.length - 6);
-//    oos.flush();
-//    MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
-//  }
+
+    private WLSWireAdapter adapter;
+
+    @BeforeAll
+    public static void setupClass() {
+        WireAdapter.HELPER.registerContextFactoryForClass(MyWLSContext.class,
+            "org.glassfish.contextpropagation.weblogic.workarea.MyContext", new SerializableContextFactory() {
+
+                @Override
+                public WLSContext createInstance() {
+                    return new MyWLSContext();
+                }
+            });
+    }
 
 
+    @BeforeEach
+    public void before() {
+        BootstrapUtils.bootstrap(new WLSWireAdapter());
+        adapter = new WLSWireAdapter();
+    }
+
+
+    @AfterEach
+    public void after() {
+        BootstrapUtils.reset();
+    }
+
+
+    @Test
+    public void testFromWLS() throws Exception {
+        PropagationTest.setup();
+        byte[] bytes = PropagationTest.serialize();
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        WireAdapter adapter = new WLSWireAdapter();
+        adapter.prepareToReadFrom(bais);
+        for (String key = adapter.readKey(); key != null; key = adapter.readKey()) {
+            adapter.readEntry();
+        }
+    }
+
+
+    @Test
+    public void testWithCatalog() throws PropertyReadOnlyException, IOException, InsufficientCredentialException {
+        BootstrapUtils.populateMap();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
+        WLSWireAdapter adapter = new WLSWireAdapter();
+        propagator.useWireAdapter(adapter);
+        propagator.sendRequest(baos, PropagationMode.RMI);
+        Catalog catalog = getField(adapter, "catalog", AbstractWireAdapter.class);
+        BootstrapUtils.reset();
+        adapter = new WLSWireAdapter();
+        BootstrapUtils.bootstrap(adapter);
+        byte[] bytes = baos.toByteArray();
+        MockLoggerAdapter.debug(Utils.toString(bytes));
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        propagator.useWireAdapter(adapter);
+        propagator.receiveRequest(bais);
+        Catalog newCatalog = getField(adapter, "wlsCatalog");
+        assertEquals(catalog, newCatalog);
+        // MockLoggerAdapter.debug("start: " + Deencapsulation.getField(newCatalog, "start") + ",
+        // end: " + Deencapsulation.getField(newCatalog, "end"));
+    }
+
+
+    @Test
+    public void testResilientWithBadSerializableInsertFirst() throws Exception {
+        badSerializable(true);
+    }
+
+
+    @Test
+    public void testResilientWithBadSerializableInsertLast() throws Exception {
+        badSerializable(false);
+    }
+
+
+    private void badSerializable(boolean insertFirst) throws Exception {
+        ContextMap wcMap = ContextMapHelper.getScopeAwareContextMap();
+        String key = "faulty serializable";
+        @SuppressWarnings("serial")
+        Serializable faultySerializable = new Serializable() {
+
+            @SuppressWarnings("unused")
+            transient String s = "";
+
+            private void writeObject(ObjectOutputStream out) throws IOException {
+                out.writeLong(1L);
+                out.writeUTF("a string");
+            }
+
+
+            private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+                MockLoggerAdapter.debug("*******");
+                in.readFully(new byte[25]); // expected to fail since we should be reading a long
+                                            // and produce stack traces
+                MockLoggerAdapter.debug(" -- done");
+            }
+        };
+        Method method = wcMap.getClass().getDeclaredMethod("putSerializable", String.class, Serializable.class, EnumSet.class);
+        method.setAccessible(true);
+        if (insertFirst) {
+            method.invoke(wcMap, key, faultySerializable, PropagationMode.defaultSet());
+        }
+        BootstrapUtils.populateMap();
+        if (!insertFirst) {
+            method.invoke(wcMap, key, faultySerializable, PropagationMode.defaultSet());
+        }
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
+        WLSWireAdapter adapter = new WLSWireAdapter();
+        propagator.useWireAdapter(adapter);
+        propagator.sendRequest(baos, PropagationMode.RMI);
+        Catalog catalog = getField(adapter, "catalog", AbstractWireAdapter.class);
+        BootstrapUtils.reset();
+        adapter = new WLSWireAdapter();
+        BootstrapUtils.bootstrap(adapter);
+        byte[] bytes = baos.toByteArray();
+        MockLoggerAdapter.debug(Utils.toString(bytes));
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        propagator.useWireAdapter(adapter);
+        propagator.receiveRequest(bais);
+        Catalog newCatalog = getField(adapter, "wlsCatalog");
+        assertNull(wcMap.get(key));
+        // Check that the catalog is read since the faulty context is read before it.
+        assertEquals(catalog, newCatalog);
+    }
+
+
+    @Test
+    public void markReset() throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.write("Some data".getBytes());
+        oos.flush();
+        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+        bais.mark(100);
+        bais.read();
+        bais.reset();
+        ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(bais));
+        ois.mark(100);
+        ois.read();
+        ois.skip(5); // It can skip but cannot reset
+        assertEquals(false, ois.markSupported());
+        // ObjectOutputStream does not support reset even if we give it a BufferedInputStream
+        assertThrows(IOException.class, ois::reset);
+    }
+
+
+    @Test
+    public void testResilientWithBadWorkContext() throws IOException, InsufficientCredentialException {
+        ContextMap wcMap = ContextMapHelper.getScopeAwareContextMap();
+        AccessControlledMap acm = ((PrivilegedWireAdapterAccessor) wcMap).getAccessControlledMap(true);
+        String key = "bad work context";
+        WLSContext ctx = new WLSContext() {
+
+            @Override
+            public void writeContext(ObjectOutput out) throws IOException {
+                out.writeUTF("a string");
+            }
+
+
+            @Override
+            public void readContext(ObjectInput in) throws IOException {
+                in.readLong(); // Expected to fail
+            }
+        };
+        acm.put(key, Entry.createOpaqueEntryInstance(ctx, PropagationMode.defaultSet(), ctx.getClass().getName())
+            .init(true, false));
+        BootstrapUtils.populateMap();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ContextMapPropagator propagator = Utils.getScopeAwarePropagator();
+        WLSWireAdapter adapter = new WLSWireAdapter();
+        propagator.useWireAdapter(adapter);
+        propagator.sendRequest(baos, PropagationMode.RMI);
+        Catalog catalog = getField(adapter, "catalog", AbstractWireAdapter.class);
+        BootstrapUtils.reset();
+        adapter = new WLSWireAdapter();
+        BootstrapUtils.bootstrap(adapter);
+        byte[] bytes = baos.toByteArray();
+        MockLoggerAdapter.debug(Utils.toString(bytes));
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        propagator.useWireAdapter(adapter);
+        propagator.receiveRequest(bais);
+        Catalog newCatalog = getField(adapter, "wlsCatalog");
+        assertEquals(catalog, newCatalog);
+        assertNull(wcMap.get(key));
+    }
+
+
+    @Test
+    public void convertPropagationMode() {
+        // LOCAL, WORK, RMI, TRANSACTION, JMS_QUEUE, JMS_TOPIC, SOAP, MIME_HEADER, ONEWAY
+        checkPropModeConversion(EnumSet.of(PropagationMode.LOCAL),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.LOCAL);
+        checkPropModeConversion(EnumSet.of(PropagationMode.THREAD),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
+        checkPropModeConversion(EnumSet.of(PropagationMode.RMI),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.RMI);
+        checkPropModeConversion(EnumSet.of(PropagationMode.TRANSACTION),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.TRANSACTION);
+        checkPropModeConversion(EnumSet.of(PropagationMode.JMS_QUEUE),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_QUEUE);
+        checkPropModeConversion(EnumSet.of(PropagationMode.JMS_TOPIC),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_TOPIC);
+        checkPropModeConversion(EnumSet.of(PropagationMode.SOAP),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.SOAP);
+        checkPropModeConversion(EnumSet.of(PropagationMode.MIME_HEADER),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.MIME_HEADER);
+        checkPropModeConversion(EnumSet.of(PropagationMode.ONEWAY),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.ONEWAY);
+        /*
+         * Glassfish's default includes all of the WLS default plus THREAD (which
+         * is equivalent to the WLS propagation mode WORK)
+         */
+        checkPropModeConversion(PropagationMode.defaultSet(),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.DEFAULT
+                + org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
+        checkPropModeConversion(PropagationMode.defaultSet(),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.GLOBAL
+                + org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
+    }
+
+
+    private void checkPropModeConversion(EnumSet<PropagationMode> propagationModes, int expectedWLSPropMode) {
+        assertEquals(expectedWLSPropMode, WLSWireAdapter.toWlsPropagationMode(propagationModes));
+    }
+
+
+    @Test
+    public void toPropagationMode() {
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.LOCAL),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.LOCAL);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.THREAD),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.RMI),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.RMI);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.TRANSACTION),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.TRANSACTION);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.JMS_QUEUE),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_QUEUE);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.JMS_TOPIC),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.JMS_TOPIC);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.SOAP),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.SOAP);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.MIME_HEADER),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.MIME_HEADER);
+        checkReversePropModeConversion(EnumSet.of(PropagationMode.ONEWAY),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.ONEWAY);
+        checkReversePropModeConversion(PropagationMode.defaultSet(),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.DEFAULT
+                + org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
+        checkReversePropModeConversion(PropagationMode.defaultSet(),
+            org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.GLOBAL
+                + org.glassfish.contextpropagation.weblogic.workarea.PropagationMode.WORK);
+    }
+
+
+    private void checkReversePropModeConversion(EnumSet<PropagationMode> modes, int mode) {
+        assertEquals(modes, WLSWireAdapter.toPropagationMode(mode));
+
+    }
+
+
+    void foo(Object o) {
+        System.out.println(o);
+    }
+
+
+    @Test
+    public void testFoo() {
+        foo(1);
+    }
+
+
+    @Test
+    public void testStreams() throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.write("foo".getBytes());
+        oos.write("bar".getBytes());
+        oos.flush();
+        MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        oos = new ObjectOutputStream(baos);
+        oos.write("foo".getBytes());
+        ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
+        ObjectOutputStream oos2 = new ObjectOutputStream(baos2);
+        oos2.write("bar".getBytes());
+        oos2.flush();
+        oos.write(baos2.toByteArray());
+        oos.flush();
+        MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        oos = new ObjectOutputStream(baos);
+        oos.write("foo".getBytes());
+        baos2 = new ByteArrayOutputStream();
+        oos2 = new ObjectOutputStream(baos2);
+        oos2.write("bar".getBytes());
+        oos2.flush();
+        oos.flush();
+        baos.write(baos2.toByteArray());
+        MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        baos.write("foo".getBytes());
+        MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        oos = new ObjectOutputStream(baos);
+        oos.write("foo".getBytes());
+        baos2 = new ByteArrayOutputStream();
+        oos2 = new ObjectOutputStream(baos2);
+        oos2.write("bar".getBytes());
+        oos2.flush();
+        byte[] bytes = baos2.toByteArray();
+        oos.write(bytes, 6, bytes.length - 6);
+        oos.flush();
+        MockLoggerAdapter.debug(Utils.toString(baos.toByteArray()));
+    }
 }
diff --git a/nucleus/test-utils/utils/src/main/java/org/glassfish/tests/utils/Utils.java b/nucleus/test-utils/utils/src/main/java/org/glassfish/tests/utils/Utils.java
index 3794965..0237282 100644
--- a/nucleus/test-utils/utils/src/main/java/org/glassfish/tests/utils/Utils.java
+++ b/nucleus/test-utils/utils/src/main/java/org/glassfish/tests/utils/Utils.java
@@ -138,11 +138,11 @@
         }
     }
 
-    public static void getStaticField(Class<?> clazz, String fieldName) {
+    public static <T> T getStaticField(Class<?> clazz, String fieldName) {
         try {
             Field field = clazz.getDeclaredField(fieldName);
             field.setAccessible(true);
-            field.get(null);
+            return (T) field.get(null);
         } catch (Exception e) {
             throw new IllegalStateException("Failed to get static field " + fieldName + " of " + clazz, e);
         }
@@ -159,8 +159,12 @@
     }
 
     public static <T> T getField(Object instance, String fieldName) {
+        return getField(instance, fieldName, instance.getClass());
+    }
+
+    public static <T> T getField(Object instance, String fieldName, Class<?> parentOfInstance) {
         try {
-            Field field = instance.getClass().getDeclaredField(fieldName);
+            Field field = parentOfInstance.getDeclaredField(fieldName);
             field.setAccessible(true);
             return (T) field.get(instance);
         } catch (Exception e) {