diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/BasicJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/BasicJavaSeBootstrapExample.java
index fd1abc7..f090dcd 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/BasicJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/BasicJavaSeBootstrapExample.java
@@ -19,9 +19,6 @@
 import java.net.URI;
 
 import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
 
 /**
  * Basic Java SE bootstrap example.
@@ -46,21 +43,12 @@
      * @param args unused command line arguments
      * @throws InterruptedException when process is killed
      */
-    public static final void main(final String[] args) throws InterruptedException {
-        final Application application = new HelloWorld();
-
-        final SeBootstrap.Configuration requestedConfiguration = SeBootstrap.Configuration.builder().build();
-
-        SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+    public static void main(final String[] args) throws InterruptedException {
+        SeBootstrap.start(HelloWorld.class).thenAccept(instance -> {
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/ClientAuthenticationJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/ClientAuthenticationJavaSeBootstrapExample.java
index 23b42a9..e169075 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/ClientAuthenticationJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/ClientAuthenticationJavaSeBootstrapExample.java
@@ -19,10 +19,7 @@
 import java.net.URI;
 
 import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
 import jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
 
 /**
  * Java SE Bootstrap Example using TLS Client Authentication.
@@ -58,22 +55,15 @@
      * @param args unused command line arguments
      * @throws InterruptedException when process is killed
      */
-    public static final void main(final String[] args) throws InterruptedException {
-        final Application application = new HelloWorld();
-
+    public static void main(final String[] args) throws InterruptedException {
         final SeBootstrap.Configuration requestedConfiguration = SeBootstrap.Configuration.builder().protocol("HTTPS")
                 .sslClientAuthentication(SSLClientAuthentication.MANDATORY).build();
 
-        SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+        SeBootstrap.start(HelloWorld.class, requestedConfiguration).thenAccept(instance -> {
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/ExplicitJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/ExplicitJavaSeBootstrapExample.java
index 62187fb..3f7df46 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/ExplicitJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/ExplicitJavaSeBootstrapExample.java
@@ -19,10 +19,8 @@
 import java.net.URI;
 
 import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
 import jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication;
 import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
 
 /**
  * Java SE bootstrap example with explicit configuration.
@@ -56,7 +54,7 @@
      * {@code NONE, OPTIONAL, MANDATORY}.
      * @throws InterruptedException when process is killed
      */
-    public static final void main(final String[] args) throws InterruptedException {
+    public static void main(final String[] args) throws InterruptedException {
         final Application application = new HelloWorld();
 
         final String protocol = args[0];
@@ -69,15 +67,10 @@
                 .port(port).rootPath(rootPath).sslClientAuthentication(clientAuth).build();
 
         SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/ExternalConfigJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/ExternalConfigJavaSeBootstrapExample.java
index e02cf81..4642995 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/ExternalConfigJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/ExternalConfigJavaSeBootstrapExample.java
@@ -18,14 +18,11 @@
 
 import java.net.URI;
 
+import jakarta.ws.rs.SeBootstrap;
+import jakarta.ws.rs.core.Application;
 import org.eclipse.microprofile.config.Config;
 import org.eclipse.microprofile.config.ConfigProvider;
 
-import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
-
 /**
  * Java SE bootstrap example utilizing an external configuration system.
  * <p>
@@ -71,7 +68,7 @@
      * @param args unused command line arguments
      * @throws InterruptedException when process is killed
      */
-    public static final void main(final String[] args) throws InterruptedException {
+    public static void main(final String[] args) throws InterruptedException {
         final Application application = new HelloWorld();
 
         final Config config = ConfigProvider.getConfig();
@@ -80,15 +77,10 @@
                 .build();
 
         SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/HttpsJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/HttpsJavaSeBootstrapExample.java
index 6cb7e8a..045bf0b 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/HttpsJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/HttpsJavaSeBootstrapExample.java
@@ -19,9 +19,7 @@
 import java.net.URI;
 
 import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
 import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
 
 /**
  * Java SE bootstrap example using HTTPS.
@@ -53,21 +51,16 @@
      * @param args unused command line arguments
      * @throws InterruptedException when process is killed
      */
-    public static final void main(final String[] args) throws InterruptedException {
+    public static void main(final String[] args) throws InterruptedException {
         final Application application = new HelloWorld();
 
         final SeBootstrap.Configuration requestedConfiguration = SeBootstrap.Configuration.builder().protocol("HTTPS").build();
 
         SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/NativeJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/NativeJavaSeBootstrapExample.java
index b64b8dc..e36f5f3 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/NativeJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/NativeJavaSeBootstrapExample.java
@@ -19,9 +19,7 @@
 import java.net.URI;
 
 import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
 import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
 
 /**
  * Java SE bootstrap example demonstrating the use of native properties.
@@ -56,7 +54,7 @@
      * @throws InterruptedException when process is killed
      * @throws ClassNotFoundException when Jersey's Grizzly backend is not on the classpath
      */
-    public static final void main(final String[] args) throws InterruptedException, ClassNotFoundException {
+    public static void main(final String[] args) throws InterruptedException, ClassNotFoundException {
         final Application application = new HelloWorld();
 
         final SeBootstrap.Configuration requestedConfiguration = SeBootstrap.Configuration.builder()
@@ -65,15 +63,10 @@
                 .build();
 
         SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/PropertyProviderJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/PropertyProviderJavaSeBootstrapExample.java
index af0302f..ee213d1 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/PropertyProviderJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/PropertyProviderJavaSeBootstrapExample.java
@@ -18,14 +18,11 @@
 
 import java.net.URI;
 
+import jakarta.ws.rs.SeBootstrap;
+import jakarta.ws.rs.core.Application;
 import org.eclipse.microprofile.config.Config;
 import org.eclipse.microprofile.config.ConfigProvider;
 
-import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
-
 /**
  * Java SE bootstrap example utilizing a property provider.
  * <p>
@@ -69,7 +66,7 @@
      * @param args unused command line arguments
      * @throws InterruptedException when process is killed
      */
-    public static final void main(final String[] args) throws InterruptedException {
+    public static void main(final String[] args) throws InterruptedException {
         final Application application = new HelloWorld();
 
         final Config config = ConfigProvider.getConfig();
@@ -78,15 +75,10 @@
                 .protocol("HTTPS").build();
 
         SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/examples/src/main/java/jaxrs/examples/bootstrap/TlsJavaSeBootstrapExample.java b/examples/src/main/java/jaxrs/examples/bootstrap/TlsJavaSeBootstrapExample.java
index 32ee38a..88a5f1b 100644
--- a/examples/src/main/java/jaxrs/examples/bootstrap/TlsJavaSeBootstrapExample.java
+++ b/examples/src/main/java/jaxrs/examples/bootstrap/TlsJavaSeBootstrapExample.java
@@ -27,9 +27,7 @@
 import java.security.KeyStore;
 
 import jakarta.ws.rs.SeBootstrap;
-import jakarta.ws.rs.SeBootstrap.Configuration;
 import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.UriBuilder;
 
 /**
  * Java SE bootstrap example using TLS customization.
@@ -56,7 +54,7 @@
      * @throws IOException in case file access fails
      * @throws InterruptedException when process is killed
      */
-    public static final void main(final String[] args)
+    public static void main(final String[] args)
             throws GeneralSecurityException, IOException, InterruptedException {
         final Application application = new HelloWorld();
 
@@ -75,15 +73,10 @@
                 .sslContext(sslContext).build();
 
         SeBootstrap.start(application, requestedConfiguration).thenAccept(instance -> {
-            Runtime.getRuntime()
-                    .addShutdownHook(new Thread(() -> instance.stop()
-                            .thenAccept(stopResult -> System.out.printf("Stop result: %s [Native stop result: %s].%n",
-                                    stopResult, stopResult.unwrap(Object.class)))));
-
-            final Configuration actualConfigurarion = instance.configuration();
-            final URI uri = UriBuilder.newInstance().scheme(actualConfigurarion.protocol().toLowerCase())
-                    .host(actualConfigurarion.host()).port(actualConfigurarion.port())
-                    .path(actualConfigurarion.rootPath()).build();
+            instance.stopOnShutdown(stopResult ->
+                    System.out.printf("Stop result: %s [Native stop result: %s].%n", stopResult,
+                            stopResult.unwrap(Object.class)));
+            final URI uri = instance.configuration().baseUri();
             System.out.printf("Instance %s running at %s [Native handle: %s].%n", instance, uri,
                     instance.unwrap(Object.class));
             System.out.println("Send SIGKILL to shutdown.");
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/SeBootstrap.java b/jaxrs-api/src/main/java/jakarta/ws/rs/SeBootstrap.java
index e342705..fa7a5cc 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/SeBootstrap.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/SeBootstrap.java
@@ -16,13 +16,17 @@
 
 package jakarta.ws.rs;
 
+import java.net.URI;
 import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
 import java.util.function.BiFunction;
+import java.util.function.Consumer;
 
 import javax.net.ssl.SSLContext;
 
 import jakarta.ws.rs.core.Application;
+import jakarta.ws.rs.core.UriBuilder;
 import jakarta.ws.rs.ext.RuntimeDelegate;
 
 /**
@@ -141,6 +145,65 @@
     }
 
     /**
+     * Starts the provided application using a default configuration.
+     *
+     * <p>
+     * This method is intended to be used in Java SE environments only. The outcome of invocations in Jakarta EE container
+     * environments is undefined.
+     * </p>
+     *
+     * @param application The application to start up.
+     * @return {@code CompletionStage} (possibly asynchronously) producing handle of the running application
+     * {@link SeBootstrap.Instance instance}.
+     * @see Configuration
+     * @since 3.1
+     */
+    static CompletionStage<Instance> start(final Application application) {
+        Configuration configuration = Configuration.builder().build();
+        return start(application, configuration);
+    }
+
+    /**
+     * Starts the provided application using the specified configuration. Creates application instance
+     * from class using default constructor. Injection is not supported.
+     *
+     * <p>
+     * This method is intended to be used in Java SE environments only. The outcome of invocations in Jakarta EE container
+     * environments is undefined.
+     * </p>
+     *
+     * @param clazz The application class.
+     * @param configuration Provides information needed for bootstrapping the application.
+     * @return {@code CompletionStage} (possibly asynchronously) producing handle of the running application
+     * {@link SeBootstrap.Instance instance}.
+     * @see Configuration
+     * @since 3.1
+     */
+    static CompletionStage<Instance> start(final Class<? extends Application> clazz, final Configuration configuration) {
+        return RuntimeDelegate.getInstance().bootstrap(clazz, configuration);
+    }
+
+    /**
+     * Starts the provided application using a default configuration. Creates application instance
+     * from class using default constructor. Injection is not supported.
+     *
+     * <p>
+     * This method is intended to be used in Java SE environments only. The outcome of invocations in Jakarta EE container
+     * environments is undefined.
+     * </p>
+     *
+     * @param clazz The application class.
+     * @return {@code CompletionStage} (possibly asynchronously) producing handle of the running application
+     * {@link SeBootstrap.Instance instance}.
+     * @see Configuration
+     * @since 3.1
+     */
+    static CompletionStage<Instance> start(final Class<? extends Application> clazz) {
+        Configuration configuration = Configuration.builder().build();
+        return start(clazz, configuration);
+    }
+
+    /**
      * Provides information needed by the JAX-RS implementation for bootstrapping an application.
      * <p>
      * The configuration essentially consists of a set of parameters. While the set of actually effective keys is product
@@ -151,7 +214,7 @@
      * @author Markus KARG (markus@headcrashing.eu)
      * @since 3.1
      */
-    public static interface Configuration {
+    interface Configuration {
 
         /**
          * Configuration key for the protocol an application is bound to.
@@ -165,7 +228,7 @@
          *
          * @since 3.1
          */
-        static final String PROTOCOL = "jakarta.ws.rs.SeBootstrap.Protocol";
+        String PROTOCOL = "jakarta.ws.rs.SeBootstrap.Protocol";
 
         /**
          * Configuration key for the hostname or IP address an application is bound to.
@@ -182,7 +245,7 @@
          *
          * @since 3.1
          */
-        static final String HOST = "jakarta.ws.rs.SeBootstrap.Host";
+        String HOST = "jakarta.ws.rs.SeBootstrap.Host";
 
         /**
          * Configuration key for the TCP port an application is bound to.
@@ -199,7 +262,7 @@
          *
          * @since 3.1
          */
-        static final String PORT = "jakarta.ws.rs.SeBootstrap.Port";
+        String PORT = "jakarta.ws.rs.SeBootstrap.Port";
 
         /**
          * Configuration key for the root path an application is bound to.
@@ -209,7 +272,7 @@
          *
          * @since 3.1
          */
-        static final String ROOT_PATH = "jakarta.ws.rs.SeBootstrap.RootPath";
+        String ROOT_PATH = "jakarta.ws.rs.SeBootstrap.RootPath";
 
         /**
          * Configuration key for the secure socket configuration to be used.
@@ -219,7 +282,7 @@
          *
          * @since 3.1
          */
-        static final String SSL_CONTEXT = "jakarta.ws.rs.SeBootstrap.SSLContext";
+        String SSL_CONTEXT = "jakarta.ws.rs.SeBootstrap.SSLContext";
 
         /**
          * Configuration key for the secure socket client authentication policy.
@@ -233,7 +296,7 @@
          *
          * @since 3.1
          */
-        static final String SSL_CLIENT_AUTHENTICATION = "jakarta.ws.rs.SeBootstrap.SSLClientAuthentication";
+        String SSL_CLIENT_AUTHENTICATION = "jakarta.ws.rs.SeBootstrap.SSLClientAuthentication";
 
         /**
          * Secure socket client authentication policy
@@ -247,7 +310,7 @@
          * @author Markus KARG (markus@headcrashing.eu)
          * @since 3.1
          */
-        public enum SSLClientAuthentication {
+        enum SSLClientAuthentication {
 
             /**
              * Server will <em>not request</em> client authentication.
@@ -276,14 +339,14 @@
          *
          * @since 3.1
          */
-        static final int FREE_PORT = 0;
+        int FREE_PORT = 0;
 
         /**
          * Special value for {@link #PORT} property indicating that the implementation MUST use its default port.
          *
          * @since 3.1
          */
-        static final int DEFAULT_PORT = -1;
+        int DEFAULT_PORT = -1;
 
         /**
          * Returns the value of the property with the given name, or {@code null} if there is no property of that name.
@@ -361,7 +424,7 @@
          * Same as if calling {@link #property(String) (String) property(ROOT_PATH)}.
          * </p>
          *
-         * @return root path to be used, e. g. {@code "/"}.
+         * @return root path to be used, e.g. {@code "/"}.
          * @throws ClassCastException if root path is not a {@link String}.
          * @see SeBootstrap.Configuration#ROOT_PATH
          * @since 3.1
@@ -401,6 +464,28 @@
         }
 
         /**
+         * Returns a {@link UriBuilder} that includes the application root path.
+         *
+         * @return a {@link UriBuilder} for the application.
+         * @since 3.1
+         */
+        default UriBuilder baseUriBuilder() {
+            return UriBuilder.newInstance().scheme(protocol().toLowerCase())
+                    .host(host()).port(port()).path(rootPath());
+        }
+
+        /**
+         * Convenience method that returns a built the {@link URI} for the application.
+         *
+         * @return a built {@link URI} for the application.
+         * @see Configuration#baseUriBuilder()
+         * @since 3.1
+         */
+        default URI baseUri() {
+            return baseUriBuilder().build();
+        }
+
+        /**
          * Creates a new bootstrap configuration builder instance.
          *
          * @return {@link Builder} for bootstrap configuration.
@@ -408,7 +493,7 @@
          */
         static Builder builder() {
             return RuntimeDelegate.getInstance().createConfigurationBuilder();
-        };
+        }
 
         /**
          * Builder for bootstrap {@link Configuration}.
@@ -416,7 +501,7 @@
          * @author Markus KARG (markus@headcrashing.eu)
          * @since 3.1
          */
-        static interface Builder {
+        interface Builder {
 
             /**
              * Builds a bootstrap configuration instance from the provided property values.
@@ -576,7 +661,7 @@
      * @author Markus KARG (markus@headcrashing.eu)
      * @since 3.1
      */
-    public interface Instance {
+    interface Instance {
 
         /**
          * Provides access to the configuration <em>actually</em> used by the implementation used to create this instance.
@@ -590,7 +675,7 @@
          * @return The configuration actually used to create this instance.
          * @since 3.1
          */
-        public Configuration configuration();
+        Configuration configuration();
 
         /**
          * Initiate immediate shutdown of running application instance.
@@ -598,7 +683,7 @@
          * @return {@code CompletionStage} asynchronously shutting down this application instance.
          * @since 3.1
          */
-        public CompletionStage<StopResult> stop();
+        CompletionStage<StopResult> stop();
 
         /**
          * Result of stopping the application instance.
@@ -606,7 +691,7 @@
          * @author Markus KARG (markus@headcrashing.eu)
          * @since 3.1
          */
-        public interface StopResult {
+        interface StopResult {
 
             /**
              * Provides access to the wrapped native shutdown result.
@@ -622,7 +707,7 @@
              * @throws ClassCastException if the result is not {@code null} or is not assignable to the type {@code T}.
              * @since 3.1
              */
-            public <T> T unwrap(Class<T> nativeClass);
+            <T> T unwrap(Class<T> nativeClass);
         }
 
         /**
@@ -638,7 +723,18 @@
          * @throws ClassCastException if the handle is not {@code null} and is not assignable to the type {@code T}.
          * @since 3.1
          */
-        public <T> T unwrap(Class<T> nativeClass);
+        <T> T unwrap(Class<T> nativeClass);
+
+        /**
+         * Registers a consumer for a {@link StopResult} which will be executed in a new thread
+         * during the JVM shutdown phase.
+         *
+         * @param consumer The consumer.
+         * @since 3.1
+         */
+        default void stopOnShutdown(Consumer<StopResult> consumer) {
+            Runtime.getRuntime().addShutdownHook(new Thread(() -> stop().thenAccept(consumer)));
+        }
     }
 
 }
diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/ext/RuntimeDelegate.java b/jaxrs-api/src/main/java/jakarta/ws/rs/ext/RuntimeDelegate.java
index 8a306c6..06cb469 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/ext/RuntimeDelegate.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/ext/RuntimeDelegate.java
@@ -240,8 +240,8 @@
     /**
      * Perform startup of the application in Java SE environments.
      * <p>
-     * <em>This method is not intended to be invoked by applications. Call {@link SeBootstrap#start(Application, Configuration)}
-     * instead.</em>
+     * <em>This method is not intended to be invoked by applications. Call {@link SeBootstrap#start(Application,
+     * SeBootstrap.Configuration)} instead.</em>
      * </p>
      *
      * @param application The application to start up.
@@ -252,6 +252,20 @@
     public abstract CompletionStage<Instance> bootstrap(Application application, SeBootstrap.Configuration configuration);
 
     /**
+     * Perform startup of the application in Java SE environments.
+     * <p>
+     * <em>This method is not intended to be invoked by applications. Call {@link SeBootstrap#start(Class,
+     * SeBootstrap.Configuration)} instead.</em>
+     * </p>
+     *
+     * @param clazz The application class to instantiate and start.
+     * @param configuration The bootstrap configuration.
+     * @return {@code CompletionStage} asynchronously producing handle of the running application {@link SeBootstrap.Instance
+     * instance}.
+     */
+    public abstract CompletionStage<Instance> bootstrap(Class<? extends Application> clazz, SeBootstrap.Configuration configuration);
+
+    /**
      * Create a new instance of a {@link jakarta.ws.rs.core.EntityPart.Builder}.
      * <p>
      * <em>This method is not intended to be invoked by applications. Call {@link EntityPart#withName(String)} instead.</em>
diff --git a/jaxrs-api/src/test/java/jakarta/ws/rs/SeBootstrapTest.java b/jaxrs-api/src/test/java/jakarta/ws/rs/SeBootstrapTest.java
index aabda6b..bc09f2e 100644
--- a/jaxrs-api/src/test/java/jakarta/ws/rs/SeBootstrapTest.java
+++ b/jaxrs-api/src/test/java/jakarta/ws/rs/SeBootstrapTest.java
@@ -3,12 +3,14 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.sameInstance;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.BDDMockito.given;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
+import java.net.URI;
 import java.util.concurrent.CompletionStage;
 
 import javax.net.ssl.SSLContext;
@@ -17,6 +19,7 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import jakarta.ws.rs.core.UriBuilder;
 import jakarta.ws.rs.SeBootstrap.Configuration;
 import jakarta.ws.rs.SeBootstrap.Configuration.SSLClientAuthentication;
 import jakarta.ws.rs.core.Application;
@@ -35,7 +38,7 @@
      * <em>installed</em> RuntimeDelegate.
      */
     @BeforeEach
-    public final void setUp() {
+    public void setUp() {
         RuntimeDelegate.setInstance(mock(RuntimeDelegate.class));
     }
 
@@ -44,7 +47,7 @@
      * use a possibly cluttered instance.
      */
     @AfterEach
-    public final void tearDown() {
+    public void tearDown() {
         RuntimeDelegate.setInstance(null);
     }
 
@@ -55,7 +58,7 @@
      * @since 3.1
      */
     @Test
-    public final void shouldDelegateApplicationStartupToRuntimeDelegate() {
+    public void shouldDelegateApplicationStartupToRuntimeDelegate() {
         // given
         final Application application = mock(Application.class);
         final Configuration configuration = mock(Configuration.class);
@@ -71,13 +74,37 @@
     }
 
     /**
+     * Assert that {@link SeBootstrap#start(Class, Configuration)} will delegate to
+     * {@link RuntimeDelegate#bootstrap(Class, Configuration)}.
+     *
+     * @since 3.1
+     */
+    @Test
+    public void shouldDelegateClassApplicationStartupToRuntimeDelegate() {
+        // given
+        final Application application = mock(Application.class);
+        final Class<? extends Application> clazz = application.getClass();
+        final Configuration configuration = mock(Configuration.class);
+        @SuppressWarnings("unchecked")
+        final CompletionStage<SeBootstrap.Instance> nativeCompletionStage = mock(CompletionStage.class);
+        given(RuntimeDelegate.getInstance().bootstrap(clazz, configuration))
+                .willReturn(nativeCompletionStage);
+
+        // when
+        final CompletionStage<SeBootstrap.Instance> actualCompletionStage = SeBootstrap.start(clazz, configuration);
+
+        // then
+        assertThat(actualCompletionStage, is(sameInstance(nativeCompletionStage)));
+    }
+
+    /**
      * Assert that {@link SeBootstrap.Configuration#builder()} will delegate to
      * {@link RuntimeDelegate#createConfigurationBuilder()}.
      *
      * @since 3.1
      */
     @Test
-    public final void shouldDelegateConfigurationBuilderCreationToRuntimeDelegate() {
+    public void shouldDelegateConfigurationBuilderCreationToRuntimeDelegate() {
         // given
         final SeBootstrap.Configuration.Builder nativeConfigurationBuilder = mock(SeBootstrap.Configuration.Builder.class);
         given(RuntimeDelegate.getInstance().createConfigurationBuilder()).willReturn(nativeConfigurationBuilder);
@@ -96,7 +123,7 @@
      * @since 3.1
      */
     @Test
-    public final void shouldReturnSameConfigurationBuilderInstanceWhenLoadingExternalConfiguration() {
+    public void shouldReturnSameConfigurationBuilderInstanceWhenLoadingExternalConfiguration() {
         // given
         final SeBootstrap.Configuration.Builder previousConfigurationBuilder = spy(SeBootstrap.Configuration.Builder.class);
         final Object someExternalConfiguration = mock(Object.class);
@@ -118,7 +145,7 @@
      * @since 3.1
      */
     @Test
-    public final void shouldPushCorrespondingPropertiesIntoConfigurationBuilder() {
+    public void shouldPushCorrespondingPropertiesIntoConfigurationBuilder() {
         // given
         final String someProtocolValue = mockString();
         final String someHostValue = mockString();
@@ -153,7 +180,7 @@
      * @since 3.1
      */
     @Test
-    public final void shouldPullCorrespondingPropertiesFromConfiguration() {
+    public void shouldPullCorrespondingPropertiesFromConfiguration() {
         // given
         final String someProtocolValue = mockString();
         final String someHostValue = mockString();
@@ -187,6 +214,53 @@
         assertThat(actualSSLClientAuthenticationValue, is(sameInstance(someSSLClientAuthenticationValue)));
     }
 
+    /**
+     * Assert that a default {@code Configuration} is used when not passed to the
+     * {@code SeBootstrap.start} method.
+     *
+     * @since 3.1
+     */
+    @Test
+    public void shouldUseDefaultConfigurationIfOmitted() {
+        // given
+        final Application application = mock(Application.class);
+        final Configuration configuration = mock(Configuration.class);
+        SeBootstrap.Configuration.Builder builder = mock(SeBootstrap.Configuration.Builder.class);
+        given(SeBootstrap.Configuration.builder()).willReturn(builder);
+        given(builder.build()).willReturn(configuration);
+
+        // when
+        SeBootstrap.start(application);
+
+        // then
+        verify(RuntimeDelegate.getInstance()).bootstrap(application, configuration);
+    }
+
+    /**
+     * Assert that calling {@code Configuration.baseUri} returns the correct URI as set
+     * by the mocked classes.
+     *
+     * @since 3.1
+     */
+    @Test
+    public void shouldReturnSameUri() {
+        // given
+        final URI uri = URI.create("http://localhost:8080/foo");
+        final UriBuilder uriBuilder = mock(UriBuilder.class);
+        given(uriBuilder.build()).willReturn(uri);
+        final Configuration configuration = mock(Configuration.class);
+        given(configuration.baseUri()).willCallRealMethod();
+        given(configuration.baseUriBuilder()).willReturn(uriBuilder);
+        final SeBootstrap.Instance instance = mock(SeBootstrap.Instance.class);
+        given(instance.configuration()).willReturn(configuration);
+
+        // when
+        URI returnedUri = instance.configuration().baseUri();
+
+        // then
+        assertThat(uri, is(returnedUri));
+    }
+
     private static String mockString() {
         return Integer.toString(mockInt());
     }
