Initial AMP Contribution per CQ 3295.
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/.classpath b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/.classpath
new file mode 100644
index 0000000..8a8f166
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>

+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

+	<classpathentry kind="src" path="src"/>

+	<classpathentry kind="output" path="bin"/>

+</classpath>

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/.project b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/.project
new file mode 100644
index 0000000..3526567
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.amp.axf.views</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/META-INF/MANIFEST.MF b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..ac8ee29
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-SymbolicName: org.eclipse.amp.axf.views;singleton:=true
+Bundle-Version: 0.2.0.qualifier
+Bundle-Activator: org.eclipse.amp.axf.view.AXFViewPlugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.commands;bundle-version="3.4.0",
+ org.eclipse.ui;bundle-version="3.4.0",
+ org.eclipse.core.expressions;bundle-version="3.4.0",
+ org.eclipse.amp.axf.core,
+ org.eclipse.ui.views;bundle-version="3.4.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.amp.axf.view
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/build.properties b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/plugin.properties b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/plugin.properties
new file mode 100644
index 0000000..6f4dafa
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/plugin.properties
@@ -0,0 +1,32 @@
+# /**

+#  * <copyright>

+#  *

+#  * Copyright (c) 2009 Metascape, LLC.

+#  * 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: 

+#  *   Metascape - Initial API and Implementation

+#  *

+#  * </copyright>

+#  *

+#  * $Id: plugin.properties

+#  */

+

+

+# ====================================================================

+# To code developer:

+#   Do NOT change the properties between this line and the

+#   "%%% END OF TRANSLATED PROPERTIES %%%" line.

+#   Make a new property name, append to the end of the file and change

+#   the code to use the new property.

+# ====================================================================

+

+# ====================================================================

+# %%% END OF TRANSLATED PROPERTIES %%%

+# ====================================================================

+

+pluginName = Agent Execution Framework Views

+providerName = Eclipse.org

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/plugin.xml b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/plugin.xml
new file mode 100644
index 0000000..a02b728
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.views">
+      <category
+            id="org.eclipse.amp.axf.views"
+            name="Agent Views">
+      </category>
+   </extension>
+</plugin>
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/AXFViewPlugin.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/AXFViewPlugin.java
new file mode 100644
index 0000000..e871141
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/AXFViewPlugin.java
@@ -0,0 +1,77 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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: 
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+*/
+package org.eclipse.amp.axf.view;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+
+// TODO: Auto-generated Javadoc
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+public class AXFViewPlugin extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.amp.axf.view";
+
+	// The shared instance
+	private static AXFViewPlugin plugin;
+	
+	/**
+     * The constructor.
+     */
+	public AXFViewPlugin() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	/**
+	 * @param context
+	 * @throws Exception
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	/**
+	 * @param context
+	 * @throws Exception
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+     * Returns the shared instance.
+     * 
+     * @return the shared instance
+     */
+	public static AXFViewPlugin getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/IModelPart.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/IModelPart.java
new file mode 100644
index 0000000..a6c4774
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/IModelPart.java
@@ -0,0 +1,54 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.view;

+

+import java.util.Collection;

+

+import org.eclipse.amp.axf.core.ILifeCycleListener;

+import org.eclipse.core.runtime.IAdaptable;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The Interface IModelPart.

+ */

+public interface IModelPart extends IAdaptable {

+    

+    /**

+     * Creates the model listeners.

+     */

+    void createModelListeners();

+    

+    /**

+     * Gets the model listeners.

+     * 

+     * @return the model listeners

+     */

+    Collection<ILifeCycleListener> getModelListeners();

+

+    /**

+     * Adds the model listener.

+     * 

+     * @param view the view

+     */

+    void addModelListener(ILifeCycleListener view);

+    

+    /**

+     * Removes the model listener.

+     * 

+     * @param view the view

+     */

+    void removeModelListener(ILifeCycleListener view);

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/ModelInput.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/ModelInput.java
new file mode 100644
index 0000000..823b1de
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/ModelInput.java
@@ -0,0 +1,118 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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: 
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+*/
+package org.eclipse.amp.axf.view;
+
+import org.eclipse.amp.axf.core.IModel;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class ModelInput.
+ */
+public class ModelInput implements IEditorInput {
+
+    protected IModel model;
+
+    public static ImageDescriptor MODEL_IMAGE;
+
+    /**
+     * Instantiates a new model input.
+     * 
+     * @param model the model
+     */
+    public ModelInput(IModel model) {
+        super();
+        this.model = model;
+    }
+
+    /**
+     * @return
+     * @see org.eclipse.ui.IEditorInput#exists()
+     */
+    public boolean exists() {
+        // TODO Auto-generated method stub
+        return true;
+    }
+
+    /**
+     * @return
+     * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+     */
+    public ImageDescriptor getImageDescriptor() {
+        // TODO Auto-generated method stub
+        return MODEL_IMAGE;
+    }
+
+    /**
+     * @return
+     * @see org.eclipse.ui.IEditorInput#getName()
+     */
+    public String getName() {
+        // TODO Auto-generated method stub
+        return model.getName();
+    }
+
+    /**
+     * @return
+     * @see org.eclipse.ui.IEditorInput#getPersistable()
+     */
+    public IPersistableElement getPersistable() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    /**
+     * @return
+     * @see org.eclipse.ui.IEditorInput#getToolTipText()
+     */
+    public String getToolTipText() {
+        return "Running " + getModel().getName() + " Model";
+    }
+
+    /**
+     * Gets the model.
+     * 
+     * @return the model
+     */
+    public IModel getModel() {
+        return model;
+    }
+
+    /**
+     * @param type
+     * @return
+     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+     */
+    public Object getAdapter(Class type) {
+        if (type == IModel.class) {
+            return model;
+        }
+        return null;
+    }
+
+    /**
+     * Sets the model.
+     * 
+     * @param model the new model
+     */
+    public void setModel(IModel model) {
+        this.model = model;
+    }
+
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/ModelViewPart.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/ModelViewPart.java
new file mode 100644
index 0000000..e28ae08
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/ModelViewPart.java
@@ -0,0 +1,270 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2009 Metascape, LLC.
+ * 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:
+ *   Metascape - Initial API and Implementation
+ *
+ * </copyright>
+ *
+ */
+package org.eclipse.amp.axf.view;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.amp.axf.core.ILifeCycleListener;
+import org.eclipse.amp.axf.core.IModel;
+import org.eclipse.amp.axf.core.IObservationProvider;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class ModelViewPart.
+ */
+public abstract class ModelViewPart extends ViewPart implements IModelPart, IPropertyChangeListener {
+
+    IModel model;
+
+    protected PropertySheetPage propertySheetPage;
+
+    /**
+     * The listener interface for receiving propertyRefresh events. The class that is interested in processing a
+     * propertyRefresh event implements this interface, and the object created with that class is registered with a
+     * component using the component's <code>addPropertyRefreshListener<code> method. When
+     * the propertyRefresh event occurs, that object's appropriate
+     * method is invoked.
+     * 
+     * @see PropertyRefreshEvent
+     */
+    class PropertyRefreshListener extends SWTAsyncModelListener {
+
+        /**
+         * Instantiates a new property refresh listener.
+         * 
+         * @param control the control
+         */
+        public PropertyRefreshListener(Control control) {
+            super(control, "Property Refresh", 500);
+        }
+
+        /**
+         * @param model
+         * @see org.eclipse.amp.axf.view.SWTThreadModelListener#update(org.eclipse.amp.axf.core.IModel)
+         */
+        public void update(IModel model) {
+            if (propertySheetPage != null && propertySheetPage.getControl().isVisible()) {
+                propertySheetPage.refresh();
+            }
+            endPainting();
+        }
+    }
+
+    /**
+     * @param parent
+     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    public void createPartControl(Composite parent) {
+        propertySheetPage = new PropertySheetPage();
+        IPropertySourceProvider source = (IPropertySourceProvider) Platform.getAdapterManager()
+        .getAdapter(this, IPropertySourceProvider.class);
+        if (source != null) {
+            propertySheetPage.setPropertySourceProvider(source);
+        }
+    }
+
+    List<ILifeCycleListener> modelListeners = new ArrayList<ILifeCycleListener>();
+
+    // TODO Was this neccessary functionality?
+    /**
+     * Creates the selection listener.
+     * 
+     * @param provider the provider
+     */
+    protected void createSelectionListener(ISelectionProvider provider) {
+        // MEEPlugin.getDefault().getManager().getSelectionSynchronizer().addViewer(provider);
+    }
+
+    /**
+     * Removes the selection listener.
+     * 
+     * @param provider the provider
+     */
+    protected void removeSelectionListener(ISelectionProvider provider) {
+        // MEEPlugin.getDefault().getManager().getSelectionSynchronizer().removeViewer(provider);
+    }
+
+    /**
+     * Sets the input.
+     * 
+     * @param input the new input
+     */
+    public void setInput(IEditorInput input) {
+        // super.setInput(input);
+        if (input != null) {
+            model = ((ModelInput) input).getModel();
+        } else {
+            model = null;
+        }
+    }
+
+    /**
+     * @param newName
+     * @see org.eclipse.ui.part.ViewPart#setPartName(java.lang.String)
+     */
+    public void setPartName(String newName) {
+        super.setPartName(newName);
+    }
+
+    /**
+     * Gets the name.
+     * 
+     * @return the name
+     */
+    public String getName() {
+        return (model != null ? model.getName() + " " : "") + "View";
+    }
+
+    /**
+     * Gets the property sheet page.
+     * 
+     * @return the property sheet page
+     */
+    public PropertySheetPage getPropertySheetPage() {
+        return propertySheetPage;
+    }
+
+    /**
+     * 
+     * @see org.eclipse.amp.axf.view.IModelPart#createModelListeners()
+     */
+    public void createModelListeners() {
+        Control control = getPropertySheetPage().getControl();
+        if (control != null) {
+            addModelListener(new PropertyRefreshListener(control));
+        }
+    }
+
+    /**
+     * Gets the model.
+     * 
+     * @return the model
+     */
+    public IObservationProvider getModel() {
+        return model;
+    }
+
+    /**
+     * @param event
+     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+     */
+    public void propertyChange(PropertyChangeEvent event) {
+    }
+
+    /**
+     * Sets the model.
+     * 
+     * @param model the new model
+     */
+    public void setModel(IModel model) {
+        this.model = model;
+    }
+
+    /**
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+     */
+    @Override
+    public void setFocus() {
+    }
+
+    /**
+     * 
+     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+     */
+    public void dispose() {
+        if (model != null) {
+            for (ILifeCycleListener listener : getModelListeners()) {
+                if (model.getModelListeners().contains(listener)) {
+                    if (listener instanceof SWTAsyncModelListener) {
+                        ((SWTAsyncModelListener) listener).forceModelNotify(model);
+                    }
+                    if (model.getModelListeners().contains(listener)) {
+                        model.removeModelListener(listener);
+                    }
+                }
+            }
+        }
+        if (propertySheetPage != null) {
+            propertySheetPage.dispose();
+        }
+        propertySheetPage = null;
+        super.dispose();
+    }
+
+    /**
+     * @param listener
+     * @see org.eclipse.amp.axf.view.IModelPart#addModelListener(org.eclipse.amp.axf.core.ILifeCycleListener)
+     */
+    public void addModelListener(ILifeCycleListener listener) {
+        modelListeners.add(listener);
+        model.addModelListener(listener);
+    }
+
+    /**
+     * @return
+     * @see org.eclipse.amp.axf.view.IModelPart#getModelListeners()
+     */
+    public Collection<ILifeCycleListener> getModelListeners() {
+        return modelListeners;
+    }
+
+    /**
+     * @param view
+     * @see org.eclipse.amp.axf.view.IModelPart#removeModelListener(org.eclipse.amp.axf.core.ILifeCycleListener)
+     */
+    public void removeModelListener(ILifeCycleListener view) {
+        modelListeners.remove(view);
+    }
+
+    /**
+     * @param type
+     * @return
+     * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
+     */
+    @Override
+    public Object getAdapter(Class type) {
+        if (type == org.eclipse.ui.views.properties.IPropertySheetPage.class) {
+            return getPropertySheetPage();
+        }
+        if (type == IModel.class) {
+            return getModel();
+        }
+        return super.getAdapter(type);
+    }
+
+    /**
+     * Checks if is single.
+     * 
+     * @return true, if is single
+     */
+    public boolean isSingle() {
+        return false;
+    }
+}
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SWTAsyncModelListener.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SWTAsyncModelListener.java
new file mode 100644
index 0000000..1b7a508
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SWTAsyncModelListener.java
@@ -0,0 +1,177 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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:

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+ */

+package org.eclipse.amp.axf.view;

+

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.amp.axf.core.LifeCycleState;

+import org.eclipse.amp.axf.core.TimeGranularity;

+import org.eclipse.swt.widgets.Control;

+import org.eclipse.swt.widgets.Display;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The listener interface for receiving SWTAsyncModel events. The class that is interested in processing a SWTAsyncModel

+ * event implements this interface, and the object created with that class is registered with a component using the

+ * component's <code>addSWTAsyncModelListener<code> method. When

+ * the SWTAsyncModel event occurs, that object's appropriate

+ * method is invoked.

+ * 

+ * @see SWTAsyncModelEvent

+ */

+public abstract class SWTAsyncModelListener extends SWTThreadModelListener {

+

+    private final class ReportingRunner implements Runnable {

+        private final LifeCycleState key;

+        private final IModel model;

+        Exception t;

+

+        public ReportingRunner(LifeCycleState key, IModel model) {

+            this.key = key;

+            this.model = model;

+        }

+

+        public void run() {

+            try {

+                doUpdate(key, model);

+            } catch (Exception e) {

+                t = e;

+            } finally {

+                updating = false;

+            }

+        }

+    }

+

+    private boolean waitForPaint = true;

+

+    private long minTimeBetweenUpdates = 0;

+

+    protected boolean updating = false;

+

+    private boolean painting = false;

+

+    private long lastUpdate;

+

+    /**

+     * Instantiates a new sWT async model listener.

+     * 

+     * @param widget the widget

+     * @param name the name

+     */

+    public SWTAsyncModelListener(Control widget, String name) {

+        super(widget, name);

+    }

+

+    /**

+     * Instantiates a new sWT async model listener.

+     * 

+     * @param widget the widget

+     * @param name the name

+     * @param updatePeriod the update period

+     */

+    public SWTAsyncModelListener(Control widget, String name, long updatePeriod) {

+        super(widget, name);

+        this.minTimeBetweenUpdates = updatePeriod;

+    }

+

+    /**

+     * @param key

+     * @param observed

+     * @see org.eclipse.amp.axf.core.AbstractLifecycleListener#stateChange(java.lang.Object, java.lang.Object)

+     */

+    @Override

+    public void stateChange(Object key, Object observed) {

+        IModel model = (IModel) observed;

+        if (model.getEngine().isPaused() || System.currentTimeMillis() > lastUpdate + minTimeBetweenUpdates

+                && model.getPeriod() % ((TimeGranularity) model.getEngine().getUpdateGranularity()).getUpdateFrequency() == 0) {

+            updating = true;

+            ReportingRunner runnable = new ReportingRunner((LifeCycleState) key, model);

+            if (AXFViewPlugin.getDefault() != null) {

+                Display display = AXFViewPlugin.getDefault().getWorkbench().getDisplay();

+                if (!display.isDisposed()) {

+                    display.asyncExec(runnable);

+                    while ((updating || painting && isWaitForPaint()) && (widget == null || !widget.isDisposed())) {

+                        try {

+                            // Assume best case of 60fps + allow compute

+                            Thread.sleep(5);

+                        } catch (InterruptedException e) {

+                        }

+                    }

+                }

+            }

+            if (runnable.t != null) {

+                runnable.t.printStackTrace();

+            }

+        }

+        if (model != null) {

+            forceModelNotify(model);

+        }

+    }

+

+    private void doUpdate(Object key, final IModel model) {

+        // Have to check visibility within UI thread

+        if (widget == null || !widget.isDisposed() && widget.isVisible()) {

+            update(model);

+            SWTAsyncModelListener.super.stateChange(key, model);

+        }

+        // If the update method hasn't explicitly indicated beginPainting, we are not waiting for the

+        // actual update or it has already occurred.

+        if (!painting) {

+            lastUpdate = System.currentTimeMillis();

+        }

+    }

+

+    /**

+     * Force model notify.

+     * 

+     * @param model the model

+     */

+    public void forceModelNotify(IModel model) {

+        model.getEngine().observationComplete(this);

+    }

+

+    /**

+     * Begin painting.

+     */

+    public void beginPainting() {

+        this.painting = true;

+    }

+

+    /**

+     * End painting.

+     */

+    public void endPainting() {

+        this.painting = false;

+        lastUpdate = System.currentTimeMillis();

+    }

+

+    /**

+     * Sets the wait for paint.

+     * 

+     * @param waitForPaint the new wait for paint

+     */

+    public void setWaitForPaint(boolean waitForPaint) {

+        this.waitForPaint = waitForPaint;

+    }

+

+    /**

+     * Checks if is wait for paint.

+     * 

+     * @return true, if is wait for paint

+     */

+    public boolean isWaitForPaint() {

+        return waitForPaint;

+    }

+}

diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SWTThreadModelListener.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SWTThreadModelListener.java
new file mode 100644
index 0000000..0b8ad34
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SWTThreadModelListener.java
@@ -0,0 +1,62 @@
+/**

+ * <copyright>

+ *

+ * Copyright (c) 2009 Metascape, LLC.

+ * 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: 

+ *   Metascape - Initial API and Implementation

+ *

+ * </copyright>

+ *

+*/

+package org.eclipse.amp.axf.view;

+

+import org.eclipse.amp.axf.core.AbstractLifecycleListener;

+import org.eclipse.amp.axf.core.IModel;

+import org.eclipse.swt.widgets.Control;

+

+// TODO: Auto-generated Javadoc

+/**

+ * The listener interface for receiving SWTThreadModel events. The class that is interested in processing a

+ * SWTThreadModel event implements this interface, and the object created with that class is registered with a component

+ * using the component's <code>addSWTThreadModelListener<code> method. When

+ * the SWTThreadModel event occurs, that object's appropriate

+ * method is invoked.

+ * 

+ * @see SWTThreadModelEvent

+ */

+public abstract class SWTThreadModelListener extends AbstractLifecycleListener {

+

+    protected Control widget;

+

+    /**

+     * Instantiates a new sWT thread model listener.

+     * 

+     * @param widget the widget

+     * @param name the name

+     */

+    public SWTThreadModelListener(Control widget, String name) {

+        super(name);

+        this.widget = widget;

+    }

+

+    /**

+     * Update.

+     * 

+     * @param model the model

+     */

+    public abstract void update(IModel model);

+

+    /**

+     * Sets the widget.

+     * 

+     * @param widget the new widget

+     */

+    public void setWidget(Control widget) {

+        this.widget = widget;

+    }

+}
\ No newline at end of file
diff --git a/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SelectionSynchronizer.java b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SelectionSynchronizer.java
new file mode 100644
index 0000000..aac4a7f
--- /dev/null
+++ b/org.eclipse.amp.axf/plugins/org.eclipse.amp.axf.views/src/org/eclipse/amp/axf/view/SelectionSynchronizer.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+
+ *******************************************************************************/
+package org.eclipse.amp.axf.view;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+
+// TODO: Auto-generated Javadoc
+/**
+ * A utility for synchronizing the selection of multiple EditPartViewers. Copied from
+ * org.eclipse.gef.ui.parts.SelectionSynchronizer and modified to allow conversion from SelectionProvider.
+ * 
+ * This class performs selection synchronization by taking the selection from one viewer, and mapping it to the
+ * selection in another viewer. The mapping is performed by matching the models of the selected EditParts from one
+ * viewer to the EditParts with the same models in another. The can be customized by overriding the
+ * {@link #convert(EditPartViewer, EditPart)} method.
+ * 
+ * @author hudsonr
+ */
+public class SelectionSynchronizer implements ISelectionChangedListener {
+
+    private List<ISelectionProvider> viewers = new ArrayList<ISelectionProvider>();
+    private boolean isDispatching = false;
+    private int disabled = 0;
+    private ISelectionProvider pendingSelection;
+
+    /**
+     * Adds a viewer to the set of synchronized viewers.
+     * 
+     * @param viewer the viewer
+     */
+    public void addViewer(ISelectionProvider viewer) {
+        viewer.addSelectionChangedListener(this);
+        viewers.add(viewer);
+    }
+
+    /**
+     * Maps the given editpart from one viewer to an editpart in another viewer. It returns <code>null</code> if there
+     * is no corresponding part. This method can be overridden to provide custom mapping.
+     * 
+     * @param viewer the viewer being mapped to
+     * @param object the object
+     * 
+     * @return <code>null</code> or a corresponding editpart
+     */
+    protected Object convert(ISelectionProvider viewer, Object object) {
+        return object;
+    }
+
+    /**
+     * Removes the viewer from the set of synchronized viewers.
+     * 
+     * @param viewer the viewer to remove
+     */
+    public void removeViewer(ISelectionProvider viewer) {
+        viewer.removeSelectionChangedListener(this);
+        viewers.remove(viewer);
+        if (pendingSelection == viewer) {
+            pendingSelection = null;
+        }
+    }
+
+    /**
+     * Receives notification from one viewer, and maps selection to all other members.
+     * 
+     * @param event the selection event
+     */
+    public void selectionChanged(SelectionChangedEvent event) {
+        if (isDispatching) {
+            return;
+        }
+        ISelectionProvider source = event.getSelectionProvider();
+        if (disabled > 0) {
+            pendingSelection = source;
+        } else {
+            ISelection selection = event.getSelection();
+            syncSelection(source, selection);
+        }
+    }
+
+    private void syncSelection(ISelectionProvider source, ISelection selection) {
+        isDispatching = true;
+        for (int i = 0; i < viewers.size(); i++) {
+            if (viewers.get(i) != source) {
+                ISelectionProvider viewer = viewers.get(i);
+                setViewerSelection(viewer, selection);
+            }
+        }
+        isDispatching = false;
+    }
+
+    /**
+     * Enables or disabled synchronization between viewers.
+     * 
+     * @param value <code>true</code> if synchronization should occur
+     * 
+     * @since 3.1
+     */
+    public void setEnabled(boolean value) {
+        if (!value) {
+            disabled++;
+        } else if (--disabled == 0 && pendingSelection != null) {
+            syncSelection(pendingSelection, pendingSelection.getSelection());
+            pendingSelection = null;
+        }
+    }
+
+    private void setViewerSelection(ISelectionProvider viewer, ISelection selection) {
+        ArrayList<Object> result = new ArrayList<Object>();
+        Iterator iter = ((IStructuredSelection) selection).iterator();
+        while (iter.hasNext()) {
+            Object part = convert(viewer, iter.next());
+            if (part != null) {
+                result.add(part);
+            }
+        }
+        viewer.setSelection(new StructuredSelection(result));
+        // if (result.size() > 0) {
+        // viewer.reveal((EditPart)result.get(result.size() - 1));
+        // }
+    }
+
+    /**
+     * Replace.
+     * 
+     * @param old the old
+     */
+    public void replace(SelectionSynchronizer old) {
+        for (ISelectionProvider provider : old.viewers) {
+            addViewer(provider);
+            provider.removeSelectionChangedListener(old);
+        }
+    }
+}