diff --git a/core/tests/org.eclipse.wst.sse.ui.tests/src/org/eclipse/wst/sse/ui/tests/ActionTestView.java b/core/tests/org.eclipse.wst.sse.ui.tests/src/org/eclipse/wst/sse/ui/tests/ActionTestView.java
index 80d5f6a..c176091 100644
--- a/core/tests/org.eclipse.wst.sse.ui.tests/src/org/eclipse/wst/sse/ui/tests/ActionTestView.java
+++ b/core/tests/org.eclipse.wst.sse.ui.tests/src/org/eclipse/wst/sse/ui/tests/ActionTestView.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2020 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
  * which accompanies this distribution, and is available at
@@ -19,7 +19,6 @@
 
 import org.eclipse.core.resources.IResource;
 import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.Document;
@@ -36,6 +35,7 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IMemento;
 import org.eclipse.ui.ISelectionListener;
 import org.eclipse.ui.IViewSite;
 import org.eclipse.ui.IWorkbenchPart;
@@ -49,10 +49,15 @@
 /**
  * @author nitin
  * 
- * A view to hang actions off of to execute arbitrary code at arbitrary times.
+ *         A view to hang actions off of to execute arbitrary code at
+ *         arbitrary times.
  */
 public class ActionTestView extends ViewPart {
 
+	private static final String ACTIONTEXT = "actiontext";
+	private static final String DEFAULT_ACTION_TEXT = "Use either the toolbar or the menu to run your actions\n\nWrite new lines with file paths and hit enter to open them.\n\n";
+
+
 	private class ComponentViewer extends Action {
 		public void run() {
 			super.run();
@@ -100,9 +105,10 @@
 
 	ISelection fSelection;
 	private ISelectionListener fSelectionListener;
+	private IDocument fDocument = new Document();
 
-	private List createActions() {
-		List actions = new ArrayList();
+	private List<Action> createActions() {
+		List<Action> actions = new ArrayList<>();
 
 		actions.add(new EmptyTextSetter());
 		actions.add(new ComponentViewer());
@@ -112,67 +118,76 @@
 	/**
 	 * @return
 	 */
-	private List createContribututions() {
-		List actions = new ArrayList();
+	private List<IContributionItem> createContribututions() {
+		List<IContributionItem> actions = new ArrayList<>();
 		return actions;
 	}
 
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+	 * @see
+	 * org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets
+	 * .Composite)
 	 */
 	public void createPartControl(Composite parent) {
 		ITextViewer text = new TextViewer(parent, SWT.MULTI);
-		text.setDocument(new Document());
+		text.setDocument(fDocument);
 		fControl = text.getTextWidget();
-		text.getDocument().set("Use either the toolbar or the menu to run your actions\n\nWrite new lines with file paths and hit enter to open them.\n\n");
 		fControl.addKeyListener(new KeyAdapter() {
 			@Override
-			public void keyPressed(KeyEvent e) {
-				if (e.character == '\r' ) {
+			public void keyPressed(KeyEvent keyEvent) {
+				if (keyEvent.character == '\r') {
 					int offset = fControl.getCaretOffset();
 					try {
 						IRegion lineInformation = text.getDocument().getLineInformationOfOffset(offset - 1);
 						String path = text.getDocument().get(lineInformation.getOffset(), lineInformation.getLength());
-						Event event = new Event();
-						event.type = SWT.OpenDocument;
-						event.text = path;
-						event.widget = fControl;
-						Method m  = parent.getDisplay().getClass().getDeclaredMethod("sendEvent", new Class[] {int.class, Event.class});
-						m.setAccessible(true);
-						m.invoke(parent.getDisplay(), event.type, event);
+						if (path.trim().length() > 0) {
+							Event event = new Event();
+							event.type = SWT.OpenDocument;
+							event.text = path.trim();
+							event.widget = fControl;
+							Method m = parent.getDisplay().getClass().getDeclaredMethod("sendEvent", new Class[]{int.class, Event.class});
+							m.setAccessible(true);
+							m.invoke(parent.getDisplay(), event.type, event);
+						}
 					}
-					catch (BadLocationException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
+					catch (BadLocationException e) {
+						Logger.logException(e);
+						e.printStackTrace();
 					}
-					catch (NoSuchMethodException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
+					catch (NoSuchMethodException e) {
+						Logger.logException(e);
+						e.printStackTrace();
 					}
-					catch (SecurityException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
+					catch (SecurityException e) {
+						Logger.logException(e);
+						e.printStackTrace();
 					}
-					catch (IllegalAccessException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
+					catch (IllegalAccessException e) {
+						Logger.logException(e);
+						e.printStackTrace();
 					}
-					catch (IllegalArgumentException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
+					catch (IllegalArgumentException e) {
+						Logger.logException(e);
+						e.printStackTrace();
 					}
-					catch (InvocationTargetException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
+					catch (InvocationTargetException e) {
+						Logger.logException(e);
+						e.printStackTrace();
 					}
 				}
-				super.keyReleased(e);
+				super.keyReleased(keyEvent);
 			}
 		});
 	}
 
+	@Override
+	public void saveState(IMemento memento) {
+		memento.putString(ACTIONTEXT, fDocument.get());
+		super.saveState(memento);
+	}
+
 	private ISelectionListener getSelectionListener() {
 		if (fSelectionListener == null) {
 			fSelectionListener = new ISelectionListener() {
@@ -184,24 +199,22 @@
 		return fSelectionListener;
 	}
 
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite)
-	 */
-	public void init(IViewSite site) throws PartInitException {
+	public void init(IViewSite site, IMemento memento) throws PartInitException {
 		super.init(site);
-		List actions = createActions();
-		for (int i = 0; i < actions.size(); i++) {
-			site.getActionBars().getToolBarManager().add((IAction) actions.get(i));
-			site.getActionBars().getMenuManager().add((IAction) actions.get(i));
+		String contents = memento.getString(ACTIONTEXT);
+		if (contents == null || contents.length() == 0) {
+			contents = DEFAULT_ACTION_TEXT;
 		}
-		List contributions = createContribututions();
+		fDocument.set(contents);
+		List<Action> actions = createActions();
+		for (int i = 0; i < actions.size(); i++) {
+			site.getActionBars().getToolBarManager().add(actions.get(i));
+			site.getActionBars().getMenuManager().add(actions.get(i));
+		}
+		List<IContributionItem> contributions = createContribututions();
 		for (int i = 0; i < contributions.size(); i++) {
-			site.getActionBars().getToolBarManager().add((IContributionItem) contributions.get(i));
-			site.getActionBars().getMenuManager().add((IContributionItem) contributions.get(i));
+			site.getActionBars().getToolBarManager().add(contributions.get(i));
+			site.getActionBars().getMenuManager().add(contributions.get(i));
 		}
 		site.getWorkbenchWindow().getSelectionService().addPostSelectionListener(getSelectionListener());
 	}
