diff --git a/api/src/main/java/jakarta/xml/bind/ContextFinder.java b/api/src/main/java/jakarta/xml/bind/ContextFinder.java
index bbb67f0..15fffa4 100644
--- a/api/src/main/java/jakarta/xml/bind/ContextFinder.java
+++ b/api/src/main/java/jakarta/xml/bind/ContextFinder.java
@@ -302,16 +302,18 @@
         String factoryName = classNameFromSystemProperties();
         if (factoryName != null) return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties);
 
-        Object factory = properties.get(factoryId);
-        if (factory != null) {
-            if (factory instanceof String)  {
-                factoryName = (String) factory;
-            } else {
-                throw new JAXBException(Messages.format(Messages.ILLEGAL_CAST, factory.getClass().getName(), "String"));
+        if (properties != null) {
+            Object factory = properties.get(factoryId);
+            if (factory != null) {
+                if (factory instanceof String) {
+                    factoryName = (String) factory;
+                } else {
+                    throw new JAXBException(Messages.format(Messages.ILLEGAL_CAST, factory.getClass().getName(), "String"));
+                }
             }
-        }
-        if (factoryName != null) {
-            return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties);
+            if (factoryName != null) {
+                return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties);
+            }
         }
 
         JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader(
@@ -344,16 +346,18 @@
         String factoryClassName = classNameFromSystemProperties();
         if (factoryClassName != null) return newInstance(classes, properties, factoryClassName);
 
-        Object ctxFactory = properties.get(JAXBContext.JAXB_CONTEXT_FACTORY);
-        if (ctxFactory != null) {
-            if (ctxFactory instanceof String)  {
-                factoryClassName = (String) ctxFactory;
-            } else {
-                throw new JAXBException(Messages.format(Messages.ILLEGAL_CAST, ctxFactory.getClass().getName(), "String"));
+        if (properties != null) {
+            Object ctxFactory = properties.get(JAXBContext.JAXB_CONTEXT_FACTORY);
+            if (ctxFactory != null) {
+                if (ctxFactory instanceof String) {
+                    factoryClassName = (String) ctxFactory;
+                } else {
+                    throw new JAXBException(Messages.format(Messages.ILLEGAL_CAST, ctxFactory.getClass().getName(), "String"));
+                }
             }
-        }
-        if (factoryClassName != null) {
-            return newInstance(classes, properties, factoryClassName);
+            if (factoryClassName != null) {
+                return newInstance(classes, properties, factoryClassName);
+            }
         }
 
         JAXBContextFactory factory =
diff --git a/api/src/main/java/jakarta/xml/bind/ModuleUtil.java b/api/src/main/java/jakarta/xml/bind/ModuleUtil.java
index af02171..8644464 100644
--- a/api/src/main/java/jakarta/xml/bind/ModuleUtil.java
+++ b/api/src/main/java/jakarta/xml/bind/ModuleUtil.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Distribution License v. 1.0, which is available at
@@ -112,6 +112,14 @@
 
         Module jaxbModule = JAXBContext.class.getModule();
 
+        if (!jaxbModule.isNamed()) {
+            //we are not on the module path, so assume class-path mode
+            if (LOGGER.isLoggable(Level.FINE)) {
+                LOGGER.log(Level.FINE, "Using jakarta.xml.bind-api on the class path.");
+            }
+            return;
+        }
+
         for (Class<?> cls : classes) {
             Class<?> jaxbClass = cls.isArray() ?
                     cls.getComponentType() : cls;
