diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 4b200eb..1201542 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -2905,6 +2905,7 @@
         // Check that the bundle has permission to get at least
         // one of the service interfaces; the objectClass property
         // of the service stores its service interfaces.
+// TODO: SECURITY - This check does not look complete.
         String[] objectClass = (String[])
             ref.getProperty(Constants.OBJECTCLASS);
         if (objectClass == null)
@@ -2912,7 +2913,16 @@
             return null;
         }
 
-        return m_registry.getService(bundle, ref);
+        try
+        {
+            return m_registry.getService(bundle, ref);
+        }
+        catch (ServiceException ex)
+        {
+            fireFrameworkEvent(FrameworkEvent.ERROR, ref.getBundle(), ex);
+        }
+
+        return null;
     }
 
     protected boolean ungetService(Bundle bundle, ServiceReference ref)
diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
index 8c47b37..8673eb6 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
@@ -19,6 +19,7 @@
 package org.apache.felix.framework;
 
 import java.security.AccessController;
+import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.util.*;
 
@@ -194,25 +195,33 @@
         // let it create the service object.
         if (m_factory != null)
         {
+            Object svcObj = null;
             try
             {
                 if (System.getSecurityManager() != null)
                 {
-                    return AccessController.doPrivileged(
+                    svcObj = AccessController.doPrivileged(
                         new ServiceFactoryPrivileged(acqBundle, null));
                 }
                 else
                 {
-                    return getFactoryUnchecked(acqBundle);
+                    svcObj = getFactoryUnchecked(acqBundle);
                 }
             }
-            catch (Exception ex)
+            catch (PrivilegedActionException ex)
             {
-                m_registry.getLogger().log(
-                    Logger.LOG_ERROR,
-                    "ServiceRegistrationImpl: Error getting service.", ex);
-                return null;
+                if (ex.getException() instanceof ServiceException)
+                {
+                    throw (ServiceException) ex.getException();
+                }
+                else
+                {
+                    throw new ServiceException(
+                        "Service factory exception: " + ex.getException().getMessage(),
+                        ServiceException.FACTORY_EXCEPTION, ex.getException());
+                }
             }
+            return svcObj;
         }
         else
         {
@@ -279,7 +288,17 @@
 
     private Object getFactoryUnchecked(Bundle bundle)
     {
-        Object svcObj = m_factory.getService(bundle, this);
+        Object svcObj = null;
+        try
+        {
+            svcObj = m_factory.getService(bundle, this);
+        }
+        catch (Throwable th)
+        {
+            throw new ServiceException(
+                "Service factory exception: " + th.getMessage(),
+                ServiceException.FACTORY_EXCEPTION, th);
+        }
         if (svcObj != null)
         {
             for (int i = 0; i < m_classes.length; i++)
@@ -287,10 +306,26 @@
                 Class clazz = Util.loadClassUsingClass(svcObj.getClass(), m_classes[i]);
                 if ((clazz == null) || !clazz.isAssignableFrom(svcObj.getClass()))
                 {
-                    return null;
+                    if (clazz == null)
+                    {
+                        throw new ServiceException(
+                            "Service cannot be cast due to missing class: " + m_classes[i],
+                            ServiceException.FACTORY_ERROR);
+                    }
+                    else
+                    {
+                        throw new ServiceException(
+                            "Service cannot be cast: " + m_classes[i],
+                            ServiceException.FACTORY_ERROR);
+                    }
                 }
             }
         }
+        else
+        {
+            throw new ServiceException(
+                "Service factory returned null.", ServiceException.FACTORY_ERROR);
+        }
         return svcObj;
     }
 
