diff --git a/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinter.java b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinter.java
index 69746e0..04d8865 100644
--- a/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinter.java
+++ b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinter.java
@@ -220,7 +220,7 @@
 
     public static String addBundleInfo(Bundle bundle, String prettyMessage) {
         final StringBuilder bundleBuilder = new StringBuilder(1024);
-        bundleBuilder.append("\n").append(prettyMessage);
+        bundleBuilder.append('\n').append(prettyMessage);
         if (bundle != null) {
             bundleBuilder.append('[').append(bundle.getBundleId()).append("] \n");
             bundleBuilder.append("jar = ").append(bundle.getLocation());
@@ -254,11 +254,11 @@
                                  .append(" [")
                                  .append(bundle.getBundleId())
                                  .append("]")
-                                 .append("\n")
+                                 .append('\n')
                                  ;
                 }
             }
-            bundleBuilder.append("\n");
+            bundleBuilder.append('\n');
         }
 
         return bundleIDs;
@@ -329,6 +329,6 @@
         for (int i = 0; i < (indent * 4); i++) {
             messageBuilder.append(" ");
         }
-        messageBuilder.append(message.trim()).append("\n");
+        messageBuilder.append(message.trim()).append('\n');
     }
 }
diff --git a/osgi/adapter/src/test/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinterTest.java b/osgi/adapter/src/test/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinterTest.java
index a212c84..801b011 100644
--- a/osgi/adapter/src/test/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinterTest.java
+++ b/osgi/adapter/src/test/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinterTest.java
@@ -16,16 +16,48 @@
 
 package org.jvnet.hk2.osgiadapter;
 
+import java.util.List;
+
 import org.junit.Test;
 
+import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.stringContainsInOrder;
 import static org.jvnet.hk2.osgiadapter.FelixPrettyPrinter.prettyPrintExceptionMessage;
 
 public class FelixPrettyPrinterTest {
 
     @Test
-    public void test() {
+    public void testFormatting() {
+        String src = "org.osgi.framework.BundleException:"
+            + " Unable to resolve org.glassfish.main.webservices.connector [207](R 207.0):"
+            + " missing requirement [org.glassfish.main.webservices.connector [207](R 207.0)] osgi.wiring.package;"
+            + " (&(osgi.wiring.package=jakarta.xml.ws)(version>=3.0.0)(!(version>=4.0.0))) [caused by:"
+            + " Unable to resolve org.glassfish.metro.webservices-api-osgi [236](R 236.0):"
+            + " missing requirement [org.glassfish.metro.webservices-api-osgi [236](R 236.0)] osgi.wiring.package;"
+            + " (&(osgi.wiring.package=jakarta.xml.bind)(version>=3.0.0)(!(version>=4.0.0)))]"
+            + " Unresolved requirements: [[org.glassfish.main.webservices.connector [207](R 207.0)] osgi.wiring.package;"
+            + " (&(osgi.wiring.package=jakarta.xml.ws)(version>=3.0.0)(!(version>=4.0.0)))]";
+        String message = FelixPrettyPrinter.prettyPrintExceptionMessage(src);
+        assertThat(message,
+            equalTo(
+                "Unable to resolve\n"
+                    + "    org.glassfish.main.webservices.connector [207]\n"
+                    + "    missing requirement\n"
+                    + "        &(package = jakarta.xml.ws) (version >= 3.0.0) (!(version >= 4.0.0))\n"
+                    + "        caused by:\n"
+                    + "            Unable to resolve\n"
+                    + "                org.glassfish.metro.webservices-api-osgi [236]\n"
+                    + "                missing requirement\n"
+                    + "                    &(package = jakarta.xml.bind) (version >= 3.0.0) (!(version >= 4.0.0)))]\n"));
+
+        assertThat(FelixPrettyPrinter.findBundleIds(message), contains(207L, 236L));
+        assertThat(FelixPrettyPrinter.findBundleIds(src), contains(207L, 236L));
+    }
+
+    @Test
+    public void testWeld() {
         String text = prettyPrintExceptionMessage(
             "org.osgi.framework.BundleException:"
             + " Unable to resolve org.glassfish.main.web.weld-integration [41](R 41.0):"
@@ -41,6 +73,23 @@
             stringContainsInOrder("Unable to resolve", "org.glassfish.main.web.weld-integration", "missing requirement",
                 "jakarta.faces.application", "caused by:", "Unable to resolve", "org.glassfish.jakarta.faces",
                 "missing requirement", "jakarta.enterprise.inject", "(version >= 4.1.0) (!(version >= 5.0.0))"));
+        assertThat(FelixPrettyPrinter.findBundleIds(text), contains(41L, 291L));
     }
 
+    @Test
+    public void testFelix() {
+        String src = FelixPrettyPrinter.prettyPrintExceptionMessage("  Unable to resolve"
+            + " org.apache.felix.scr [304](R 304.0):"
+            + " missing requirement [org.apache.felix.scr [304](R 304.0)] osgi.wiring.package;"
+            + " (&(osgi.wiring.package=org.osgi.framework)(version>=1.10.0)(!(version>=2.0.0)))"
+            + " Unresolved requirements: [[org.apache.felix.scr [304](R304.0)] osgi.wiring.package;"
+            + " (&(osgi.wiring.package=org.osgi.framework)(version>=1.10.0)(!(version>=2.0.0)))]\n"
+            + "at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4398) ");
+        String message = FelixPrettyPrinter.prettyPrintExceptionMessage(src);
+        assertThat(message,
+            stringContainsInOrder("Unable to resolve\n", "org.apache.felix.scr [304]\n", "missing requirement\n"));
+
+        List<Long> ids = FelixPrettyPrinter.findBundleIds(message);
+        assertThat(ids, contains(304L));
+    }
 }
