Enhancement for new Endpoint Discovery view to show Network Discovery
information for network-discovered endpoints.

Change-Id: I8cb77df234171e13f28efc66e33166ef3e6fe225
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/icons/obj16/IHost.gif b/framework/bundles/org.eclipse.ecf.remoteservice.ui/icons/obj16/IHost.gif
new file mode 100644
index 0000000..b51ae39
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/icons/obj16/IHost.gif
Binary files differ
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/icons/obj16/IServiceID.gif b/framework/bundles/org.eclipse.ecf.remoteservice.ui/icons/obj16/IServiceID.gif
new file mode 100644
index 0000000..d3dc5a9
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/icons/obj16/IServiceID.gif
Binary files differ
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Activator.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Activator.java
index 035d1d7..c3f1254 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Activator.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Activator.java
@@ -20,7 +20,7 @@
 public class Activator extends AbstractUIPlugin {
 
 	public static final String PLUGIN_ID = "org.eclipse.ecf.remoteservice.ui"; //$NON-NLS-1$
-	
+
 	private volatile ServiceTracker containerManagerTracker;
 	// The shared instance
 	private volatile static Activator plugin;
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/DiscoveryComponent.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/DiscoveryComponent.java
index 5990db1..bb28aa7 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/DiscoveryComponent.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/DiscoveryComponent.java
@@ -99,7 +99,8 @@
 			if (b.getSymbolicName().equals(RSA_SYMBOLICNAME))
 				rsaBundle = b;
 		if (rsaBundle == null)
-			throw new BundleException(Messages.DiscoveryComponent_ERROR_MSG_CANNOT_FIND_RSA_BUNDLE);
+			throw new BundleException(
+					Messages.DiscoveryComponent_ERROR_MSG_CANNOT_FIND_RSA_BUNDLE);
 		rsaBundle.start();
 	}
 
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/EndpointDiscoveryView.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/EndpointDiscoveryView.java
index 40f2bef..c865dcd 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/EndpointDiscoveryView.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/EndpointDiscoveryView.java
@@ -14,6 +14,7 @@
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.ecf.discovery.identity.IServiceID;
 import org.eclipse.ecf.osgi.services.remoteserviceadmin.EndpointDescription;
 import org.eclipse.ecf.osgi.services.remoteserviceadmin.EndpointDescriptionReader;
 import org.eclipse.ecf.osgi.services.remoteserviceadmin.IEndpointDescriptionLocator;
@@ -25,14 +26,15 @@
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointConfigTypesNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointConnectTargetIDNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointContentProvider;
+import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointDiscoveryGroupNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointFrameworkIDNode;
+import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointHostGroupNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointIDNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointIntentsNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointInterfacesNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointNamespaceNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointPackageVersionNode;
-import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointPropertyGroupNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointPropertyNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointRemoteServiceFilterNode;
 import org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model.EndpointRemoteServiceIDNode;
@@ -100,7 +102,7 @@
 		viewer.setLabelProvider(new WorkbenchLabelProvider());
 		viewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
 		viewer.setInput(viewSite);
-		
+
 		makeActions();
 		hookContextMenu();
 		contributeToActionBars();
@@ -118,21 +120,22 @@
 		// depends upon the RegistryBrowser.showGroupBy method to
 		// be added by PDE committers.
 		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=270684#c33
-//		try {
-//			IWorkbenchWindow window = PlatformUI.getWorkbench()
-//					.getActiveWorkbenchWindow();
-//			if (window != null) {
-//				IWorkbenchPage page = window.getActivePage();
-//				if (page != null) {
-//					IViewPart view = page
-//							.findView("org.eclipse.pde.runtime.RegistryBrowser");
-//					if (view != null) 
-//						return ((RegistryBrowser) view).showGroupBy(RegistryBrowser.SERVICES);
-//				}
-//			}
-//		} catch (Exception e) {
-//			logError("Could not show services in PDE Plugin view", e);
-//		}
+		// try {
+		// IWorkbenchWindow window = PlatformUI.getWorkbench()
+		// .getActiveWorkbenchWindow();
+		// if (window != null) {
+		// IWorkbenchPage page = window.getActivePage();
+		// if (page != null) {
+		// IViewPart view = page
+		// .findView("org.eclipse.pde.runtime.RegistryBrowser");
+		// if (view != null)
+		// return ((RegistryBrowser)
+		// view).showGroupBy(RegistryBrowser.SERVICES);
+		// }
+		// }
+		// } catch (Exception e) {
+		// logError("Could not show services in PDE Plugin view", e);
+		// }
 		return RegistryBrowser.BUNDLES;
 	}
 
@@ -207,7 +210,9 @@
 						discovery.startRSA();
 						startRSAAction.setEnabled(false);
 					} catch (BundleException e) {
-						logError(Messages.EndpointDiscoveryView_ERROR_RSA_START_FAILED, e);
+						logError(
+								Messages.EndpointDiscoveryView_ERROR_RSA_START_FAILED,
+								e);
 						showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_START_PREFIX
 								+ e.getMessage()
 								+ Messages.EndpointDiscoveryView_ERROR_MSG_SUFFIX);
@@ -215,7 +220,8 @@
 			}
 		};
 		startRSAAction.setText(Messages.EndpointDiscoveryView_START_RSA);
-		startRSAAction.setToolTipText(Messages.EndpointDiscoveryView_START_RSA_SERVICE);
+		startRSAAction
+				.setToolTipText(Messages.EndpointDiscoveryView_START_RSA_SERVICE);
 		startRSAAction.setEnabled(discovery.getRSA() == null);
 
 		copyValueAction = new Action() {
@@ -230,8 +236,10 @@
 				}
 			}
 		};
-		copyValueAction.setText(Messages.EndpointDiscoveryView_COPY_PROPERTY_VALUE);
-		copyValueAction.setToolTipText(Messages.EndpointDiscoveryView_COPY_PROPERTY_VALUE);
+		copyValueAction
+				.setText(Messages.EndpointDiscoveryView_COPY_PROPERTY_VALUE);
+		copyValueAction
+				.setToolTipText(Messages.EndpointDiscoveryView_COPY_PROPERTY_VALUE);
 		copyValueAction.setImageDescriptor(RSAImageRegistry.DESC_PROPERTY_OBJ);
 
 		copyNameAction = new Action() {
@@ -245,8 +253,10 @@
 				}
 			}
 		};
-		copyNameAction.setText(Messages.EndpointDiscoveryView_COPY_PROPERTY_NAME);
-		copyNameAction.setToolTipText(Messages.EndpointDiscoveryView_COPY_PROPERTY_NAME);
+		copyNameAction
+				.setText(Messages.EndpointDiscoveryView_COPY_PROPERTY_NAME);
+		copyNameAction
+				.setToolTipText(Messages.EndpointDiscoveryView_COPY_PROPERTY_NAME);
 		copyNameAction.setImageDescriptor(RSAImageRegistry.DESC_PROPERTY_OBJ);
 
 		importAction = new Action() {
@@ -265,7 +275,9 @@
 						// Check if import exception
 						Throwable exception = reg.getException();
 						if (exception != null) {
-							logError(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IMPORTSERVICE_FAILED, exception);
+							logError(
+									Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IMPORTSERVICE_FAILED,
+									exception);
 							showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_RSA_IMPORTSERVICE_FAILED_PREFIX
 									+ exception.getMessage()
 									+ Messages.EndpointDiscoveryView_ERROR_MSG_SUFFIX);
@@ -279,7 +291,8 @@
 				}
 			}
 		};
-		importAction.setText(Messages.EndpointDiscoveryView_IMPORT_REMOTE_SERVICE);
+		importAction
+				.setText(Messages.EndpointDiscoveryView_IMPORT_REMOTE_SERVICE);
 		importAction
 				.setToolTipText(Messages.EndpointDiscoveryView_IMPORT_REMOTE_SERVICE_TT);
 		importAction.setImageDescriptor(RSAImageRegistry.DESC_RSPROXY_CO);
@@ -296,7 +309,9 @@
 						edNode.setImportReg(null);
 						viewer.refresh();
 					} catch (Exception e) {
-						logError(Messages.EndpointDiscoveryView_ERROR_MSG_CANNOT_CLOSE_IR, e);
+						logError(
+								Messages.EndpointDiscoveryView_ERROR_MSG_CANNOT_CLOSE_IR,
+								e);
 						showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_CANNOT_CLOSE_IR_PREFIX
 								+ e.getMessage()
 								+ Messages.EndpointDiscoveryView_ERROR_MSG_SUFFIX);
@@ -304,7 +319,8 @@
 				}
 			}
 		};
-		unimportAction.setText(Messages.EndpointDiscoveryView_CLOSE_IMPORTED_REMOTE_SERVICE);
+		unimportAction
+				.setText(Messages.EndpointDiscoveryView_CLOSE_IMPORTED_REMOTE_SERVICE);
 		unimportAction
 				.setToolTipText(Messages.EndpointDiscoveryView_CLOSE_IMPORTED_REMOTE_SERVICE_TT);
 
@@ -329,7 +345,9 @@
 									locator.discoverEndpoint(eds[i]);
 							}
 						} catch (IOException e) {
-							logError(Messages.EndpointDiscoveryView_ERROR_MSG_ENDPOINT_PARSING_FAILED, e);
+							logError(
+									Messages.EndpointDiscoveryView_ERROR_MSG_ENDPOINT_PARSING_FAILED,
+									e);
 							showMessage(Messages.EndpointDiscoveryView_ERROR_MSG_ENDPOINT_PARSING_FAILED_PREFIX
 									+ e.getMessage()
 									+ Messages.EndpointDiscoveryView_ERROR_MSG_SUFFIX);
@@ -337,7 +355,8 @@
 				}
 			}
 		};
-		edefDiscoverAction.setText(Messages.EndpointDiscoveryView_OPEN_EDEF_FILE_DIALOG);
+		edefDiscoverAction
+				.setText(Messages.EndpointDiscoveryView_OPEN_EDEF_FILE_DIALOG);
 		edefDiscoverAction
 				.setToolTipText(Messages.EndpointDiscoveryView_OPEN_EDEF_FILE_DIALOG_TT);
 		edefDiscoverAction.setEnabled(discovery.getRSA() != null);
@@ -354,16 +373,19 @@
 							.getEndpointDescriptionLocator();
 					if (l != null
 							&& MessageDialog
-									.openQuestion(viewer.getControl()
-											.getShell(), Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_QUESTION_TITLE,
+									.openQuestion(
+											viewer.getControl().getShell(),
+											Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_QUESTION_TITLE,
 											Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_QUESTION))
 						l.undiscoverEndpoint(endpoint.getEndpointDescription());
 
 				}
 			}
 		};
-		undiscoverAction.setText(Messages.EndpointDiscoveryView_REMOVE_ENDPOINT);
-		undiscoverAction.setToolTipText(Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_TT);
+		undiscoverAction
+				.setText(Messages.EndpointDiscoveryView_REMOVE_ENDPOINT);
+		undiscoverAction
+				.setToolTipText(Messages.EndpointDiscoveryView_REMOVE_ENDPOINT_TT);
 	}
 
 	EndpointNode getEDNodeSelected() {
@@ -412,7 +434,7 @@
 					root.removeChild(new EndpointNode(ed));
 					break;
 				}
-				viewer.setExpandedState(root,true);
+				viewer.setExpandedState(root, true);
 				viewer.refresh();
 			}
 		});
@@ -456,7 +478,7 @@
 		// ID
 		edo.addChild(new EndpointIDNode());
 		// Remote Service Host
-		EndpointPropertyGroupNode idp = new EndpointPropertyGroupNode(
+		EndpointHostGroupNode idp = new EndpointHostGroupNode(
 				Messages.EndpointDiscoveryView_REMOTE_HOST_NAME);
 		// Host children
 		idp.addChild(new EndpointNamespaceNode());
@@ -474,6 +496,16 @@
 		if (filter != null)
 			idp.addChild(new EndpointRemoteServiceFilterNode());
 		edo.addChild(idp);
+
+		IEndpointDescriptionLocator locator = discovery
+				.getEndpointDescriptionLocator();
+		IServiceID serviceID = (locator == null)?null:locator.getNetworkDiscoveredService(ed);
+
+		if (serviceID != null)
+			edo.addChild(new EndpointDiscoveryGroupNode(
+					Messages.EndpointDiscoveryView_DISCOVERY_GROUP_NAME,
+					serviceID));
+
 		return edo;
 	}
 
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Messages.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Messages.java
index 2c2eec9..42b06e7 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Messages.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/Messages.java
@@ -24,6 +24,12 @@
 
 	public static String EndpointContainerIDNode_CONTAINER_ID_PROP_NAME;
 
+	public static String EndpointDiscoveryGroupNode_DISCOVERY_LOCATION;
+
+	public static String EndpointDiscoveryGroupNode_DISCOVERY_NAMESPACE;
+
+	public static String EndpointDiscoveryGroupNode_DISCOVERY_SERVICE_TYPE_ID;
+
 	public static String EndpointDiscoveryView_CLOSE_IMPORTED_REMOTE_SERVICE;
 
 	public static String EndpointDiscoveryView_CLOSE_IMPORTED_REMOTE_SERVICE_TT;
@@ -32,6 +38,8 @@
 
 	public static String EndpointDiscoveryView_COPY_PROPERTY_VALUE;
 
+	public static String EndpointDiscoveryView_DISCOVERY_GROUP_NAME;
+
 	public static String EndpointDiscoveryView_ENDPOINT_MSGBOX_TITLE;
 
 	public static String EndpointDiscoveryView_ENDPOINT_ROOT_NAME;
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RSAImageRegistry.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RSAImageRegistry.java
index 3534cd3..5c607e0 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RSAImageRegistry.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RSAImageRegistry.java
@@ -64,6 +64,12 @@
 	public static final ImageDescriptor DESC_RSPROXY_CO = create(PATH_OVR,
 			"rsvcproxy_co_alpha.gif"); //$NON-NLS-1$
 
+	public static final ImageDescriptor DESC_HOST_OBJ = create(PATH_OBJ,
+			"IHost.gif");
+
+	public static final ImageDescriptor DESC_SERVICEID_OBJ = create(PATH_OBJ,
+			"IServiceID.gif");
+
 	private static final void initialize() {
 		PLUGIN_REGISTRY = Activator.getDefault().getImageRegistry();
 		manage(IMG_INTERFACE_OBJ, INTERFACE_OBJ);
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServiceHandlerUtil.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServiceHandlerUtil.java
index 77b602a..891c39f 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServiceHandlerUtil.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServiceHandlerUtil.java
@@ -151,7 +151,9 @@
 
 	// XXX FIX...this has to use proper container factory type.
 	private static String getContainerFactory(IServiceInfo serviceInfo) {
-		return serviceInfo.getServiceProperties().getPropertyString(
-				org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_IMPORTED_CONFIGS);
+		return serviceInfo
+				.getServiceProperties()
+				.getPropertyString(
+						org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_IMPORTED_CONFIGS);
 	}
 }
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServicePerspective.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServicePerspective.java
index e5c109f..e6108b4 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServicePerspective.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/RemoteServicePerspective.java
@@ -44,23 +44,28 @@
 		IFolderLayout bottom = layout.createFolder("bottom", //$NON-NLS-1$
 				IPageLayout.BOTTOM, 0.60f, editorArea);
 		// Folder for views at left bottom
-		IFolderLayout leftBottom = layout.createFolder("leftBottom", IPageLayout.LEFT, 0.30f, "bottom"); //$NON-NLS-1$ //$NON-NLS-2$
+		IFolderLayout leftBottom = layout.createFolder(
+				"leftBottom", IPageLayout.LEFT, 0.30f, "bottom"); //$NON-NLS-1$ //$NON-NLS-2$
 		// The ECF Endpoint Discovery view
 		leftBottom.addView(EndpointDiscoveryView.ID_VIEW);
 		// The ECF Service Discovery view
 		leftBottom.addView("org.eclipse.ecf.discovery.ui.DiscoveryView");
 		// Create folder for right bottom
-		IFolderLayout rightBottom = layout.createFolder("rightBottom", IPageLayout.RIGHT, 0.5f, "bottom");
+		IFolderLayout rightBottom = layout.createFolder("rightBottom",
+				IPageLayout.RIGHT, 0.5f, "bottom");
 		// Add the registry browser on right bottom
 		rightBottom.addView("org.eclipse.pde.runtime.RegistryBrowser");
 		// Add properties view in the middle
 		bottom.addView(IPageLayout.ID_PROP_SHEET);
-		// Create folder for left side above Endpoint Discover/Service Discovery views
-		IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, 0.30f, editorArea); //$NON-NLS-1$
+		// Create folder for left side above Endpoint Discover/Service Discovery
+		// views
+		IFolderLayout left = layout.createFolder(
+				"left", IPageLayout.LEFT, 0.30f, editorArea); //$NON-NLS-1$
 		// Add Project Explorer view
 		left.addView("org.eclipse.ui.navigator.ProjectExplorer"); //$NON-NLS-1$
 		// Top right.
-		IFolderLayout topRight = layout.createFolder("topRight", IPageLayout.RIGHT, 0.70f, editorArea); //$NON-NLS-1$
+		IFolderLayout topRight = layout.createFolder(
+				"topRight", IPageLayout.RIGHT, 0.70f, editorArea); //$NON-NLS-1$
 		// Add Outline view
 		topRight.addView(IPageLayout.ID_OUTLINE);
 	}
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/handlers/ReflectiveRemoteServiceHandler.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/handlers/ReflectiveRemoteServiceHandler.java
index a7a3d3e..0eb20ee 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/handlers/ReflectiveRemoteServiceHandler.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/handlers/ReflectiveRemoteServiceHandler.java
@@ -212,8 +212,7 @@
 				Arrays.asList(remoteCall.getParameters()), display };
 		Display.getDefault().asyncExec(new Runnable() {
 			public void run() {
-				MessageDialog.openInformation(
-						null,
+				MessageDialog.openInformation(null,
 						"Received Response", //$NON-NLS-1$
 						NLS.bind(
 								"Service Interface:\n{0}\n\nMethod: {1}\nParameters: {2}\n\nResult:  {3}", //$NON-NLS-1$
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/messages.properties b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/messages.properties
index 27508fb..2391c3e 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/messages.properties
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/internal/remoteservices/ui/messages.properties
@@ -12,6 +12,9 @@
 EndpointConfigTypesNode_0=Supported Configs
 EndpointConnectTargetIDNode_CONNECT_TARGET_ID_PROP_NAME=Connect Target ID
 EndpointContainerIDNode_CONTAINER_ID_PROP_NAME=Container ID
+EndpointDiscoveryGroupNode_DISCOVERY_LOCATION=Location
+EndpointDiscoveryGroupNode_DISCOVERY_NAMESPACE=Namespace
+EndpointDiscoveryGroupNode_DISCOVERY_SERVICE_TYPE_ID=Service Type
 EndpointDiscoveryView_CLOSE_IMPORTED_REMOTE_SERVICE_TT=Unimport the Previously-Imported Remote Service
 EndpointDiscoveryView_COPY_PROPERTY_NAME=Copy Property Name
 EndpointDiscoveryView_COPY_PROPERTY_VALUE=Copy Property Value
@@ -32,7 +35,7 @@
 EndpointDiscoveryView_OPEN_EDEF_FILE=Load Endpoints from File
 EndpointDiscoveryView_OPEN_EDEF_FILE_DIALOG=Load Endpoints from File...
 EndpointDiscoveryView_OPEN_EDEF_FILE_DIALOG_TT=Load Endpoints by reading EDEF file
-EndpointDiscoveryView_REMOTE_HOST_NAME=Remote Host
+EndpointDiscoveryView_REMOTE_HOST_NAME=Host
 EndpointDiscoveryView_REMOVE_ENDPOINT=Undiscover Endpoint
 EndpointDiscoveryView_REMOVE_ENDPOINT_QUESTION=Are you sure you want to remove this endpoint?
 EndpointDiscoveryView_REMOVE_ENDPOINT_QUESTION_TITLE=Remove Endpoint
@@ -40,6 +43,7 @@
 EndpointDiscoveryView_START_RSA=Start RSA
 EndpointDiscoveryView_START_RSA_SERVICE=Start RemoteServiceAdmin Service
 EndpointDiscoveryView_CLOSE_IMPORTED_REMOTE_SERVICE=Unimport Remote Service
+EndpointDiscoveryView_DISCOVERY_GROUP_NAME=Service Discovery
 EndpointFrameworkIDNode_FRAMEWORK_ID_PROP_NAME=Framework ID
 EndpointIDNode_ENDPOINT_ID_PROP_NAME=Endpoint ID
 EndpointIntentsNode_INTENTS_PROP_NAME=Intents
@@ -47,8 +51,8 @@
 EndpointPackageVersionNode_VERSION_PROP_NAME=Version
 EndpointRemoteServiceFilterNode_REMOTE_SERVICE_FILTER_PROP_NAME=Remote Service Filter
 EndpointRemoteServiceIDNode_REMOTE_SERVICE_ID_PROP_NAME=Remote Service Id
-EndpointServiceIDNode_SERVICE_ID_PROP_NAME=Service Id
-EndpointTimestampNode_TIMESTAMP_PROP_NAME=Timestamp
+EndpointServiceIDNode_SERVICE_ID_PROP_NAME=OSGi Service Id
+EndpointTimestampNode_TIMESTAMP_PROP_NAME=Export Timestamp
 MethodInvocationDialog_ShellTitle = Invoke Remote Method
 MethodInvocationDialog_AvailableMethodsLabel = Available Methods:
 MethodInvocationDialog_ArgumentsLabel  = Arguments:
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointAdapterFactory.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointAdapterFactory.java
index 9dedcc5..8a4a9a4 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointAdapterFactory.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointAdapterFactory.java
@@ -25,6 +25,8 @@
 	private EndpointInterfacesNodeWorkbenchAdapter endpointInterfacesNodeAdapter = new EndpointInterfacesNodeWorkbenchAdapter();
 	private EndpointAsyncInterfacesNodeWorkbenchAdapter endpointAsyncInterfacesNodeAdapter = new EndpointAsyncInterfacesNodeWorkbenchAdapter();
 	private EndpointPackageVersionNodeWorkbenchAdapter endpointPackageVersionNodeAdapter = new EndpointPackageVersionNodeWorkbenchAdapter();
+	private EndpointHostGroupNodeWorkbenchAdapter endpointHostGroupNodeAdapter = new EndpointHostGroupNodeWorkbenchAdapter();
+	private EndpointDiscoveryGroupNodeWorkbenchAdapter endpointDiscoveryGroupNodeAdapter = new EndpointDiscoveryGroupNodeWorkbenchAdapter();
 
 	@Override
 	public Object getAdapter(Object adaptableObject,
@@ -53,6 +55,10 @@
 			return endpointPropertyGroupNodeAdapter;
 		if (adaptableObject instanceof EndpointPropertyNode)
 			return endpointPropertyNodeAdapter;
+		if (adaptableObject instanceof EndpointHostGroupNode)
+			return endpointHostGroupNodeAdapter;
+		if (adaptableObject instanceof EndpointDiscoveryGroupNode)
+			return endpointDiscoveryGroupNodeAdapter;
 		if (adaptableObject instanceof EndpointGroupNode)
 			return endpointGroupNodeAdapter;
 		return null;
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointDiscoveryGroupNode.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointDiscoveryGroupNode.java
new file mode 100644
index 0000000..c52b1d8
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointDiscoveryGroupNode.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Composent, Inc. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: Scott Lewis - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model;
+
+import org.eclipse.ecf.discovery.identity.IServiceID;
+import org.eclipse.ecf.internal.remoteservices.ui.Messages;
+
+/**
+ * @since 3.2
+ */
+public class EndpointDiscoveryGroupNode extends EndpointGroupNode {
+
+	public EndpointDiscoveryGroupNode(String groupName, IServiceID serviceID) {
+		super(groupName);
+		addChild(new EndpointNameValueNode(
+				Messages.EndpointDiscoveryGroupNode_DISCOVERY_LOCATION,
+				serviceID.getLocation().toString()));
+		addChild(new EndpointNameValueNode(
+				Messages.EndpointDiscoveryGroupNode_DISCOVERY_SERVICE_TYPE_ID,
+				serviceID.getServiceTypeID().getName()));
+		addChild(new EndpointNameValueNode(
+				Messages.EndpointDiscoveryGroupNode_DISCOVERY_NAMESPACE,
+				serviceID.getNamespace().getName()));
+	}
+
+}
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointDiscoveryGroupNodeWorkbenchAdapter.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointDiscoveryGroupNodeWorkbenchAdapter.java
new file mode 100644
index 0000000..2f5c97e
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointDiscoveryGroupNodeWorkbenchAdapter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Composent, Inc. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: Scott Lewis - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model;
+
+import org.eclipse.ecf.internal.remoteservices.ui.RSAImageRegistry;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * @since 3.2
+ */
+public class EndpointDiscoveryGroupNodeWorkbenchAdapter extends
+		EndpointGroupNodeWorkbenchAdapter {
+
+	@Override
+	public ImageDescriptor getImageDescriptor(Object object) {
+		return RSAImageRegistry.DESC_SERVICEID_OBJ;
+	}
+}
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointHostGroupNode.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointHostGroupNode.java
new file mode 100644
index 0000000..ffd9a61
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointHostGroupNode.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Composent, Inc. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: Scott Lewis - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model;
+
+/**
+ * @since 3.2
+ */
+public class EndpointHostGroupNode extends EndpointGroupNode {
+
+	public EndpointHostGroupNode(String groupName) {
+		super(groupName);
+	}
+
+}
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointHostGroupNodeWorkbenchAdapter.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointHostGroupNodeWorkbenchAdapter.java
new file mode 100644
index 0000000..43fe9c2
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointHostGroupNodeWorkbenchAdapter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Composent, Inc. All rights reserved. This
+ * program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0 which accompanies this distribution, and is
+ * available at http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: Scott Lewis - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model;
+
+import org.eclipse.ecf.internal.remoteservices.ui.RSAImageRegistry;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * @since 3.2
+ */
+public class EndpointHostGroupNodeWorkbenchAdapter extends
+		EndpointGroupNodeWorkbenchAdapter {
+
+	@Override
+	public ImageDescriptor getImageDescriptor(Object object) {
+		return RSAImageRegistry.DESC_HOST_OBJ;
+	}
+}
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointNameValueNode.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointNameValueNode.java
new file mode 100644
index 0000000..676affc
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointNameValueNode.java
@@ -0,0 +1,21 @@
+package org.eclipse.ecf.remoteserviceadmin.ui.endpoint.model;
+
+/**
+ * @since 3.2
+ */
+public class EndpointNameValueNode extends EndpointPropertyNode {
+
+	private final String propertyValue;
+
+	public EndpointNameValueNode(String propertyName, String propertyValue) {
+		super(propertyName);
+		setPropertyAlias(propertyName);
+		this.propertyValue = propertyValue;
+	}
+
+	@Override
+	public Object getPropertyValue() {
+		return this.propertyValue;
+	}
+
+}
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointPropertyNode.java b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointPropertyNode.java
index fb768b8..a324071 100644
--- a/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointPropertyNode.java
+++ b/framework/bundles/org.eclipse.ecf.remoteservice.ui/src/org/eclipse/ecf/remoteserviceadmin/ui/endpoint/model/EndpointPropertyNode.java
@@ -7,6 +7,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  * 
  * Contributors: Scott Lewis - initial API and implementation
+ * 
  * @since 3.2
  ******************************************************************************/
 public class EndpointPropertyNode extends AbstractEndpointNode {