diff --git a/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java b/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
index 514c7c1..b5ded24 100644
--- a/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
+++ b/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
@@ -55,6 +55,9 @@
 import javax.ws.rs.core.Application;
 import javax.xml.bind.Marshaller;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -258,6 +261,9 @@
         }
         destination = (AbstractHTTPDestination) server.getDestination();
 
+        LOGGER.info("REST Application: " + prefix + "  -> " + application.getClass().getName());
+
+        final String base = prefix.substring(0, prefix.length() - wildcard.length());
         final JAXRSServiceImpl service = (JAXRSServiceImpl) factory.getServiceFactory().getService();
         final List<ClassResourceInfo> resources = service.getClassResourceInfos();
         for (final ClassResourceInfo info : resources) {
@@ -265,24 +271,83 @@
                 continue;
             }
 
-            final String address = singleSlash(prefix.substring(0, prefix.length() - wildcard.length()), info.getURITemplate().getValue());
+            final String address = singleSlash(base, info.getURITemplate().getValue());
 
             String clazz = info.getResourceClass().getName();
             if (restEjbs.containsKey(clazz)) {
-                LOGGER.info("REST EJB[" + clazz + "]  -> " + address);
+                LOGGER.info("    Service URI: " + address + " -> EJB " + clazz);
             } else {
-                LOGGER.info("REST Pojo[" + clazz + "]  -> " + address);
+                LOGGER.info("    Service URI: " + address + " -> Pojo " + clazz);
             }
 
-            clazz = info.getResourceClass().getSimpleName(); // the qualified name is already printed just make it clearer
             final MethodDispatcher md = info.getMethodDispatcher();
             for (OperationResourceInfo ori : md.getOperationResourceInfos()) {
-                LOGGER.info("     -> Method[" + clazz + "#" + ori.getMethodToInvoke().getName() + "]"
-                        + "  -> " + ori.getHttpMethod() + " " + singleSlash(address, ori.getURITemplate().getValue()));
+                LOGGER.info("        "
+                        + forceLength(ori.getHttpMethod(), 7) + " " + singleSlash(address, ori.getURITemplate().getValue())
+                        + "-> " + toGenericString(ori.getMethodToInvoke()));
             }
         }
     }
 
+    private static String forceLength(final String httpMethod, final int l) {
+        final StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < l - httpMethod.length(); i++) {
+            builder.append(" ");
+        }
+        return builder.append(httpMethod).toString();
+    }
+
+    public static String toGenericString(final Method mtd) {
+        try {
+            final StringBuilder sb = new StringBuilder();
+            final Type[] typeparms = mtd.getTypeParameters();
+            if (typeparms.length > 0) {
+                boolean first = true;
+                sb.append("<");
+                for(Type typeparm: typeparms) {
+                    if (!first)
+                        sb.append(",");
+                    if (typeparm instanceof Class)
+                        sb.append(((Class)typeparm).getSimpleName());
+                    else
+                        sb.append(typeparm.toString().replace("java.lang.", ""));
+                    first = false;
+                }
+                sb.append("> ");
+            }
+
+            final Type genRetType = mtd.getGenericReturnType();
+            sb.append((genRetType instanceof Class) ?
+                    ((Class) genRetType).getSimpleName()
+                    : genRetType.toString().replace("java.lang.", "")).append(" ");
+
+            sb.append(mtd.getName()).append("(");
+            final Type[] params = mtd.getGenericParameterTypes();
+            for (int j = 0; j < params.length; j++) {
+                sb.append((params[j] instanceof Class)?
+                        ((Class)params[j]).getSimpleName():
+                        (params[j].toString()) );
+                if (j < (params.length - 1))
+                    sb.append(",");
+            }
+            sb.append(")");
+            final Type[] exceptions = mtd.getGenericExceptionTypes();
+            if (exceptions.length > 0) {
+                sb.append(" throws ");
+                for (int k = 0; k < exceptions.length; k++) {
+                    sb.append((exceptions[k] instanceof Class)?
+                            ((Class)exceptions[k]).getName():
+                            exceptions[k].toString());
+                    if (k < (exceptions.length - 1))
+                        sb.append(",");
+                }
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            return "<" + e + ">";
+        }
+    }
+
     private static String singleSlash(final String address, final String value) {
         if (address.endsWith("/") && value.startsWith("/")) {
             return address + value.substring(1);
diff --git a/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java b/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
index 67111eb..1e7df77 100644
--- a/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
+++ b/openejb/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
@@ -385,8 +385,6 @@
         listener.deployApplication(application, address.complete, nopath.substring(NOPATH_PREFIX.length(), nopath.length() - wildcard.length()), additionalProviders, restEjbs, // app config
                 classLoader, injections, context, owbCtx, // injection/webapp context
                 new ServiceConfiguration(configuration, appInfo.services)); // deployment config
-
-        LOGGER.info("REST Application: " + address.complete + "  -> " + application.getClass().getName());
     }
 
     private static String appPrefix(final WebAppInfo info, final Class<?> appClazz) {
