diff --git a/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java b/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
index 4d53b5f..3cb9751 100644
--- a/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
+++ b/framework/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.net.InetAddress;
@@ -296,6 +297,10 @@
                     
                     throw new IOException("Extensions not supported or ambiguous context.");
                 }
+                catch (IOException ex)
+                {
+                    throw ex;
+                }
                 catch (Exception ex)
                 {
                     throw new IOException(ex.getMessage());
@@ -303,6 +308,10 @@
             }
             return (URLConnection) OPEN_CONNECTION.invoke(svc, new Object[]{url});
         } 
+        catch (IOException ex)
+        {
+            throw ex;
+        }
         catch (Exception ex)  
         {
             throw new IllegalStateException("Stream handler unavailable due to: " + ex.getMessage());
@@ -331,9 +340,13 @@
             {
                 m_action.setAccesssible(method);
                 return (URLConnection) method.invoke(svc, new Object[]{url, proxy});
-            } 
+            }
             catch (Exception e) 
             {
+                if (e instanceof IOException)
+                {
+                    throw (IOException) e;
+                }
                 throw new IOException(e.getMessage());
             }
         }
@@ -343,6 +356,10 @@
         } 
         catch (Exception ex)  
         {
+            if (ex instanceof IOException)
+            {
+                throw (IOException) ex;
+            }
             throw new IllegalStateException("Stream handler unavailable due to: " + ex.getMessage());
         }
     }
@@ -435,11 +452,61 @@
         {
             return ((URLStreamHandlerService) svc).toExternalForm(url);
         }
-        try 
+        try
         {
-            return (String) TO_EXTERNAL_FORM.invoke( 
-                svc, new Object[]{url});
-        } 
+            try 
+            {
+                return (String) TO_EXTERNAL_FORM.invoke( 
+                    svc, new Object[]{url});
+            }
+            catch (InvocationTargetException ex)
+            {
+               Throwable t = ex.getTargetException();
+               if (t instanceof Exception)
+               {
+                   throw (Exception) t;
+               }
+               else if (t instanceof Error)
+               {
+                   throw (Error) t;
+               }
+               else
+               {
+                   throw new IllegalStateException("Unknown throwable: " + t);
+               }
+            }
+        }
+        catch (NullPointerException ex)
+        {
+            // workaround for harmony and possibly J9. The issue is that
+            // their implementation of URLStreamHandler.toExternalForm() 
+            // assumes that URL.getFile() doesn't return null but in our
+            // case it can -- hence, we catch the NPE and do the work
+            // ourselvs. The only difference is that we check whether the
+            // URL.getFile() is null or not. 
+            StringBuffer answer = new StringBuffer();
+            answer.append(url.getProtocol());
+            answer.append(':');
+            String authority = url.getAuthority();
+            if (authority != null && authority.length() > 0) 
+            {
+                answer.append("//"); //$NON-NLS-1$
+                answer.append(url.getAuthority());
+            }
+
+            String file = url.getFile();
+            String ref = url.getRef();
+            if (file != null)
+            {
+                answer.append(file);
+            }
+            if (ref != null) 
+            {
+                answer.append('#');
+                answer.append(ref);
+            }
+            return answer.toString();
+        }
         catch (Exception ex)  
         {
             throw new IllegalStateException("Stream handler unavailable due to: " + ex.getMessage());
