diff --git a/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.core/src/org/eclipse/amp/agf/gef/EditPartViewPart.java b/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.core/src/org/eclipse/amp/agf/gef/EditPartViewPart.java
index 4d04870..5ecabe0 100644
--- a/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.core/src/org/eclipse/amp/agf/gef/EditPartViewPart.java
+++ b/org.eclipse.amp.agf/plugins/org.eclipse.amp.agf.core/src/org/eclipse/amp/agf/gef/EditPartViewPart.java
@@ -41,191 +41,199 @@
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IPartListener2;
 
-public abstract class EditPartViewPart extends AGFViewPart{
+public abstract class EditPartViewPart extends AGFViewPart {
 
-    private DefaultEditDomain editDomain;
-    protected EditPartViewer viewer;
-    private EditPartListener rootListener;
-    public static double[] ZOOM_LEVELS = { .125, .25, .5, .75, 1.0, 1.25, 1.5, 2.0, 2.5, 3, 4, 6, 8 };
-    private ZoomManager zoomer;
-    private RootEditPart rootEditPart;
+	private DefaultEditDomain editDomain;
 
-    public EditPartViewPart() {
-        super();
-        setEditDomain(new DefaultEditDomain(null));
-    }
+	protected EditPartViewer viewer;
 
-    protected void refresh(){
-    	viewer.getContents().refresh();
-    }
-    
-    @Override
-		public void createPartControl(Composite parent) {
-        viewer = createViewer();
-        viewer.createControl(parent);
-        getEditDomain().addViewer(viewer);
-        if (viewer == null) {
-            throw new RuntimeException("Viewer is null for: " + this);
-        }
-        super.createPartControl(parent);
-        getSite().getPage().addPartListener(new EditPartPartListener(this));
-    }
+	private EditPartListener rootListener;
 
-    protected EditPartViewer createViewer() {
-        return new ScrollingGraphicalViewer();
-    }
+	public static double[] ZOOM_LEVELS = { .125, .25, .5, .75, 1.0, 1.25, 1.5, 2.0, 2.5, 3, 4, 6, 8 };
 
-    public abstract RootEditPart createRoot();
+	private ZoomManager zoomer;
 
-    @Override
-		public void setInput(IEditorInput input) {
-        super.setInput(input);
-        final ModelEditPartInput modelInput = (ModelEditPartInput) input;
-        // setPartName(getName());
-        if (input != null) {
-            rootEditPart = createRoot();
-            if (rootEditPart != null) {
-                viewer.setRootEditPart(rootEditPart);
-                createZoomer();
-            }
-            Object contents = null;
-            if (modelInput.getSelection() instanceof IStructuredSelection) {
-                contents = ((StructuredSelection) modelInput.getSelection()).getFirstElement();
-            } else {
-                contents = getModel();
-            }
-            EditPartFactory factory = modelInput.getFactory();
-            if (factory == null) {
-                factory = createFactory(getModel());
-            }
-            Assert.isNotNull(factory, "Could not find factory for: " + this);
-            viewer.setEditPartFactory(factory);
-            if (factory instanceof ISelectionProvider) {
-                ISelectionProvider provider = (ISelectionProvider) factory;
-                getViewSite().setSelectionProvider(provider);
-            }
-            viewer.setContents(contents);
-        } else {
-            // viewer.setContents(null);
-        }
-    }
+	private RootEditPart rootEditPart;
 
-    protected EditPartFactory createFactory(Object contents) {
-        IModelFactoryProvider provider = (IModelFactoryProvider) Platform.getAdapterManager()
-        .getAdapter(contents, IModelFactoryProvider.class);
-        if (provider == null) {
-            throw new RuntimeException("No model factory provider defined for: " + contents);
-        }
-        return provider.getEditPartFactory(contents);
-    }
+	public EditPartViewPart() {
+		super();
+		setEditDomain(new DefaultEditDomain(null));
+	}
 
-    protected void createZoomer() {
-        if (rootEditPart instanceof ScalableFreeformRootEditPart) {
-            zoomer = ((ScalableFreeformRootEditPart) rootEditPart).getZoomManager();
-            zoomer.setZoomLevels(ZOOM_LEVELS);
-            zoomer.setZoomLevelContributions(Collections.singletonList(ZoomManager.FIT_ALL));
-        }
-    }
+	protected void refresh() {
+		if (viewer.getContents() != null) {
+			viewer.getContents().refresh();
+		}
+	}
 
-    @Override
-		public void createModelListeners() {
-        super.createModelListeners();
-        rootListener = new EditPartListener(this);
-        rootListener.setWaitForUpdate(true);
-        addModelListener(rootListener);
-        if (viewer.getContents() instanceof IModelPart) {
-            ((IModelPart) viewer.getContents()).createModelListeners();
-        }
-        viewer.getControl().addPaintListener(new PaintListener() {
-            public void paintControl(PaintEvent e) {
-                getRootListener().endPainting();
-            }
-        });
-    }
+	@Override
+	public void createPartControl(Composite parent) {
+		viewer = createViewer();
+		viewer.createControl(parent);
+		getEditDomain().addViewer(viewer);
+		if (viewer == null) {
+			throw new RuntimeException("Viewer is null for: " + this);
+		}
+		super.createPartControl(parent);
+		getSite().getPage().addPartListener(new EditPartPartListener(this));
+	}
 
-    public EditPart getEditPart() {
-        @SuppressWarnings("rawtypes")
-				List children = viewer.getRootEditPart().getChildren();
-        if (children.size() > 0) {
-            return (EditPart) children.get(0);
-        }
-        return null;
-    }
+	protected EditPartViewer createViewer() {
+		return new ScrollingGraphicalViewer();
+	}
 
-    @Override
-    public Object getAdapter(@SuppressWarnings("rawtypes") Class type) {
-        if (type == EditPartViewer.class) {
-            return getViewer();
-        }
-        // TODO -- this should really be the child..
-        if (type == EditPart.class && getViewer() != null) {
-            return getViewer().getRootEditPart();
-        }
-        if (type == IFigure.class && getViewer() != null) {
-            return ((GraphicalEditPart) getViewer().getRootEditPart()).getFigure();
-        }
-        if (type == ZoomManager.class) {
-            return getZoomer();
-        }
-        return super.getAdapter(type);
-    }
+	public abstract RootEditPart createRoot();
 
-    public EditPartViewer getViewer() {
-        return viewer;
-    }
+	@Override
+	public void setInput(IEditorInput input) {
+		super.setInput(input);
+		final ModelEditPartInput modelInput = (ModelEditPartInput) input;
+		// setPartName(getName());
+		if (input != null) {
+			rootEditPart = createRoot();
+			if (rootEditPart != null) {
+				viewer.setRootEditPart(rootEditPart);
+				createZoomer();
+			}
+			Object contents = null;
+			if (modelInput.getSelection() instanceof IStructuredSelection) {
+				contents = ((StructuredSelection) modelInput.getSelection()).getFirstElement();
+			} else {
+				contents = getModel();
+			}
+			EditPartFactory factory = modelInput.getFactory();
+			if (factory == null) {
+				factory = createFactory(getModel());
+			}
+			Assert.isNotNull(factory, "Could not find factory for: " + this);
+			viewer.setEditPartFactory(factory);
+			if (factory instanceof ISelectionProvider) {
+				ISelectionProvider provider = (ISelectionProvider) factory;
+				getViewSite().setSelectionProvider(provider);
+			}
+			viewer.setContents(contents);
+		} else {
+			// viewer.setContents(null);
+		}
+	}
 
-    public EditPartListener getRootListener() {
-        return rootListener;
-    }
+	protected EditPartFactory createFactory(Object contents) {
+		IModelFactoryProvider provider = (IModelFactoryProvider) Platform.getAdapterManager().getAdapter(contents,
+				IModelFactoryProvider.class);
+		if (provider == null) {
+			throw new RuntimeException("No model factory provider defined for: " + contents);
+		}
+		return provider.getEditPartFactory(contents);
+	}
 
-    /**
-     * Sets the EditDomain for this EditorPart.
-     * 
-     * @param ed the domain
-     */
-    protected void setEditDomain(DefaultEditDomain ed) {
-        this.editDomain = ed;
-    }
+	protected void createZoomer() {
+		if (rootEditPart instanceof ScalableFreeformRootEditPart) {
+			zoomer = ((ScalableFreeformRootEditPart) rootEditPart).getZoomManager();
+			zoomer.setZoomLevels(ZOOM_LEVELS);
+			zoomer.setZoomLevelContributions(Collections.singletonList(ZoomManager.FIT_ALL));
+		}
+	}
 
-    /**
-     * Returns the edit domain.
-     * 
-     * @return the edit domain
-     */
-    protected DefaultEditDomain getEditDomain() {
-        return editDomain;
-    }
+	@Override
+	public void createModelListeners() {
+		super.createModelListeners();
+		rootListener = new EditPartListener(this);
+		rootListener.setWaitForUpdate(true);
+		addModelListener(rootListener);
+		if (viewer.getContents() instanceof IModelPart) {
+			((IModelPart) viewer.getContents()).createModelListeners();
+		}
+		viewer.getControl().addPaintListener(new PaintListener() {
 
-    public ZoomManager getZoomer() {
-        if (rootEditPart instanceof ScalableFreeformRootEditPart) {
-            return ((ScalableFreeformRootEditPart) rootEditPart).getZoomManager();
-        } else if (rootEditPart instanceof ScalableRootEditPart) {
-            return ((ScalableRootEditPart) rootEditPart).getZoomManager();
-        }
-        return null;
-    }
+			public void paintControl(PaintEvent e) {
+				getRootListener().endPainting();
+			}
+		});
+	}
 
-    /**
-     * @return the rootEditPart
-     */
-    public RootEditPart getRootEditPart() {
-        return rootEditPart;
-    }
+	public EditPart getEditPart() {
+		@SuppressWarnings("rawtypes")
+		List children = viewer.getRootEditPart().getChildren();
+		if (children.size() > 0) {
+			return (EditPart) children.get(0);
+		}
+		return null;
+	}
 
-    /**
-     * @return
-     * @see org.eclipse.amp.agf.gef.AGFViewPart#getSelectionProvider()
-     */
-    @Override
-		protected ISelectionProvider getSelectionProvider() {
-        return viewer;
-    }
-    
-    protected String getId(){
-    	return getSite().getId();
-    }
-    
-    protected void removePartListener(IPartListener2 lis){
-    	getSite().getPage().removePartListener(lis);
-    }
+	@Override
+	public Object getAdapter(@SuppressWarnings("rawtypes") Class type) {
+		if (type == EditPartViewer.class) {
+			return getViewer();
+		}
+		// TODO -- this should really be the child..
+		if (type == EditPart.class && getViewer() != null) {
+			return getViewer().getRootEditPart();
+		}
+		if (type == IFigure.class && getViewer() != null) {
+			return ((GraphicalEditPart) getViewer().getRootEditPart()).getFigure();
+		}
+		if (type == ZoomManager.class) {
+			return getZoomer();
+		}
+		return super.getAdapter(type);
+	}
+
+	public EditPartViewer getViewer() {
+		return viewer;
+	}
+
+	public EditPartListener getRootListener() {
+		return rootListener;
+	}
+
+	/**
+	 * Sets the EditDomain for this EditorPart.
+	 * 
+	 * @param ed the domain
+	 */
+	protected void setEditDomain(DefaultEditDomain ed) {
+		this.editDomain = ed;
+	}
+
+	/**
+	 * Returns the edit domain.
+	 * 
+	 * @return the edit domain
+	 */
+	protected DefaultEditDomain getEditDomain() {
+		return editDomain;
+	}
+
+	public ZoomManager getZoomer() {
+		if (rootEditPart instanceof ScalableFreeformRootEditPart) {
+			return ((ScalableFreeformRootEditPart) rootEditPart).getZoomManager();
+		} else if (rootEditPart instanceof ScalableRootEditPart) {
+			return ((ScalableRootEditPart) rootEditPart).getZoomManager();
+		}
+		return null;
+	}
+
+	/**
+	 * @return the rootEditPart
+	 */
+	public RootEditPart getRootEditPart() {
+		return rootEditPart;
+	}
+
+	/**
+	 * @return
+	 * @see org.eclipse.amp.agf.gef.AGFViewPart#getSelectionProvider()
+	 */
+	@Override
+	protected ISelectionProvider getSelectionProvider() {
+		return viewer;
+	}
+
+	protected String getId() {
+		return getSite().getId();
+	}
+
+	protected void removePartListener(IPartListener2 lis) {
+		getSite().getPage().removePartListener(lis);
+	}
 }
\ No newline at end of file
