Added proxy throwing of ServiceException as defined by OSGi remote service spec.
diff --git a/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RemoteServiceImpl.java b/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RemoteServiceImpl.java
index 6f74922..983bac0 100644
--- a/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RemoteServiceImpl.java
+++ b/providers/bundles/org.eclipse.ecf.provider.remoteservice/src/org/eclipse/ecf/provider/remoteservice/generic/RemoteServiceImpl.java
@@ -18,6 +18,7 @@
 import org.eclipse.equinox.concurrent.future.IFuture;
 import org.eclipse.equinox.concurrent.future.IProgressRunnable;
 import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.ServiceException;
 
 public class RemoteServiceImpl implements IRemoteService, InvocationHandler {
 
@@ -88,38 +89,43 @@
 
 	public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
 		// methods declared by Object
-		if (method.getName().equals("toString")) { //$NON-NLS-1$
-			final String[] clazzes = registration.getClasses();
-			String proxyClass = (clazzes.length == 1) ? clazzes[0] : Arrays.asList(clazzes).toString();
-			return proxyClass + ".proxy@" + registration.getID(); //$NON-NLS-1$
-		} else if (method.getName().equals("hashCode")) { //$NON-NLS-1$
-			return new Integer(hashCode());
-		} else if (method.getName().equals("equals")) { //$NON-NLS-1$
-			if (args == null || args.length == 0)
-				return Boolean.FALSE;
-			try {
-				return new Boolean(Proxy.getInvocationHandler(args[0]).equals(this));
-			} catch (IllegalArgumentException e) {
-				return Boolean.FALSE;
+		try {
+			if (method.getName().equals("toString")) { //$NON-NLS-1$
+				final String[] clazzes = registration.getClasses();
+				String proxyClass = (clazzes.length == 1) ? clazzes[0] : Arrays.asList(clazzes).toString();
+				return proxyClass + ".proxy@" + registration.getID(); //$NON-NLS-1$
+			} else if (method.getName().equals("hashCode")) { //$NON-NLS-1$
+				return new Integer(hashCode());
+			} else if (method.getName().equals("equals")) { //$NON-NLS-1$
+				if (args == null || args.length == 0)
+					return Boolean.FALSE;
+				try {
+					return new Boolean(Proxy.getInvocationHandler(args[0]).equals(this));
+				} catch (IllegalArgumentException e) {
+					return Boolean.FALSE;
+				}
+				// This handles the use of IRemoteServiceProxy.getRemoteService method
+			} else if (method.getName().equals("getRemoteService")) { //$NON-NLS-1$
+				return this;
 			}
-			// This handles the use of IRemoteServiceProxy.getRemoteService method
-		} else if (method.getName().equals("getRemoteService")) { //$NON-NLS-1$
-			return this;
+			return this.callSync(new IRemoteCall() {
+
+				public String getMethod() {
+					return method.getName();
+				}
+
+				public Object[] getParameters() {
+					return args;
+				}
+
+				public long getTimeout() {
+					return DEFAULT_TIMEOUT;
+				}
+			});
+		} catch (Throwable t) {
+			// rethrow as service exception
+			throw new ServiceException("Service exception on remote service proxy rsid=" + registration.getID(), ServiceException.REMOTE, t); //$NON-NLS-1$
 		}
-		return this.callSync(new IRemoteCall() {
-
-			public String getMethod() {
-				return method.getName();
-			}
-
-			public Object[] getParameters() {
-				return args;
-			}
-
-			public long getTimeout() {
-				return DEFAULT_TIMEOUT;
-			}
-		});
 	}
 
 }