diff --git a/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/AbstructVisualizationActionForPdt.java b/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/AbstructVisualizationActionForPdt.java
new file mode 100644
index 0000000..1e0c3f5
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/AbstructVisualizationActionForPdt.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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:
+ *    Kentarou FUKUDA - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.actf.visualization.internal.ui.pdt;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+
+import org.eclipse.actf.model.ui.IModelService;
+import org.eclipse.actf.model.ui.IModelServiceHolder;
+import org.eclipse.actf.model.ui.editor.browser.IWebBrowserACTF;
+import org.eclipse.actf.model.ui.editor.browser.WaitForBrowserReadyHandler;
+import org.eclipse.actf.model.ui.util.ModelServiceUtils;
+import org.eclipse.actf.ui.util.PlatformUIUtil;
+import org.eclipse.actf.ui.util.timer.WaitExecSyncEventHandler;
+import org.eclipse.actf.ui.util.timer.WaitExecSyncEventListener;
+import org.eclipse.actf.visualization.ui.IVisualizationView;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+abstract class AbstructVisualizationActionForPdt {
+
+	private static final String BROWSER_EDITOR_ID = "org.eclipse.ui.browser.editor"; //$NON-NLS-1$
+	private static final String SWT_BROWSER_GET_TEXT_METHOD = "getText"; //$NON-NLS-1$
+	private static final String SWT_BROWSER_CLASS = "org.eclipse.swt.browser.Browser"; //$NON-NLS-1$
+	private static final String PHPBROWSER_ID = "org.eclipse.debug.ui.PHPBrowserOutput"; //$NON-NLS-1$
+	private static final String LISTENER_KEY = "org.eclipse.actf.visualization.internal.ui.pdt.AbstructVisualizationActionForPdt"; //$NON-NLS-1$
+
+	private IModelServiceHolder browserHolder;
+	private IWebBrowserACTF browser;
+	private String targetHtml = ""; //$NON-NLS-1$
+	private File targetHtmlFile = null;
+	private IWorkbenchWindow _window;
+	private HashMap<String, WaitExecSyncEventListener> eventhandlerHolder = new HashMap<String, WaitExecSyncEventListener>();
+
+	public void dispose() {
+	}
+
+	public void init(IWorkbenchWindow window) {
+		this._window = window;
+	}
+
+	public void run(IAction action) {
+
+		IModelService modelService = ModelServiceUtils.getActiveModelService();
+		if ((modelService != null && modelService != browser)) {
+			visualize();
+			return;
+		}
+
+		IEditorPart editor = PlatformUIUtil.getActiveEditor();
+		if (editor != null
+				&& BROWSER_EDITOR_ID.equals(editor.getEditorSite().getId())) {
+			visualize();
+			return;
+		}
+
+		boolean updated = false;
+		String text = getText(_window.getActivePage());
+		if (text != null && !text.equals(targetHtml)) {
+			updated = true;
+			targetHtml = text;
+			targetHtmlFile = saveToFile(targetHtml);
+		}
+
+		for (IEditorReference editorRef : _window.getActivePage()
+				.getEditorReferences()) {
+			if (editorRef.getEditor(false) == browserHolder) {
+				if (updated) {
+					browser.navigate(targetHtmlFile.getAbsolutePath());
+					waitAndVisualize();
+					return;
+				} else {
+					_window.getActivePage().activate(
+							browserHolder.getEditorPart());
+					visualize();
+					return;
+				}
+			}
+		}
+
+		if (text != null) {
+			ModelServiceUtils.launch(targetHtmlFile.getAbsolutePath());
+			browser = (IWebBrowserACTF) ModelServiceUtils
+					.getActiveModelService();
+			browserHolder = ModelServiceUtils.getActiveModelServiceHolder();
+			waitAndVisualize();
+			return;
+		}
+
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+	private void visualize() {
+		try {
+			IViewPart viewPart = this._window.getActivePage().showView(
+					getTargetViewId());
+			if (viewPart instanceof IVisualizationView) {
+				((IVisualizationView) viewPart).doVisualize();
+			}
+		} catch (PartInitException pie) {
+		}
+	}
+
+	private File saveToFile(String text) {
+		File tmpFile = null;
+		try {
+			tmpFile = PdtVisualizationPlugin.getDefault().createTempFile("php", //$NON-NLS-1$
+					".html"); //$NON-NLS-1$
+			PrintWriter pw = new PrintWriter(tmpFile, "UTF-8"); //$NON-NLS-1$
+			pw.print(text);
+			pw.flush();
+			pw.close();
+		} catch (Exception e) {
+		}
+		return tmpFile;
+	}
+
+	private void waitAndVisualize() {
+
+		if (browser != null) {
+			IViewPart viewPart = null;
+			try {
+				viewPart = this._window.getActivePage().showView(
+						getTargetViewId());
+			} catch (PartInitException pie) {
+			}
+			if (viewPart instanceof IVisualizationView) {
+				final IVisualizationView targetView = (IVisualizationView) viewPart;
+				WaitExecSyncEventHandler handler = new WaitForBrowserReadyHandler(
+						browser, 30, false, new Runnable() {
+							public void run() {
+								eventhandlerHolder.remove(LISTENER_KEY);
+								targetView.doVisualize();
+								PlatformUIUtil.showView(getTargetViewId());
+							}
+						});
+				eventhandlerHolder.put(LISTENER_KEY,
+						new WaitExecSyncEventListener(handler));
+			}
+		}
+	}
+
+	private String getText(IWorkbenchPage activePage) {
+		if (activePage == null) {
+			return null;
+		}
+		for (IViewReference viewRef : activePage.getViewReferences()) {
+			if (PHPBROWSER_ID.equals(viewRef.getId())) {
+				IViewPart[] views = activePage.getViewStack(viewRef
+						.getView(false));
+				try {
+					for (IViewPart viewpart : views) {
+						if (PHPBROWSER_ID
+								.equals(viewpart.getViewSite().getId())) {
+							Field[] fields = viewpart.getClass()
+									.getDeclaredFields();
+							for (Field field : fields) {
+								if (SWT_BROWSER_CLASS.equals(field.getType()
+										.getName())) {
+									field.setAccessible(true);
+									Object view = field.get(viewpart);
+
+									Method getText = view.getClass().getMethod(
+											SWT_BROWSER_GET_TEXT_METHOD,
+											new Class[] {});
+									String text = (String) getText.invoke(view,
+											new Object[] {});
+
+									field.setAccessible(false);
+									return (text);
+								}
+							}
+						}
+					}
+				} catch (Exception e) {
+				}
+			}
+		}
+		return null;
+	}
+
+	abstract String getTargetViewId();
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/SimulationActionForPdt.java b/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/SimulationActionForPdt.java
index 59ee372..edcb389 100644
--- a/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/SimulationActionForPdt.java
+++ b/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/SimulationActionForPdt.java
@@ -10,197 +10,15 @@
  *******************************************************************************/
 package org.eclipse.actf.visualization.internal.ui.pdt;
 
-import java.io.File;
-import java.io.PrintWriter;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-
-import org.eclipse.actf.model.ui.IModelService;
-import org.eclipse.actf.model.ui.IModelServiceHolder;
-import org.eclipse.actf.model.ui.editor.browser.IWebBrowserACTF;
-import org.eclipse.actf.model.ui.editor.browser.WaitForBrowserReadyHandler;
-import org.eclipse.actf.model.ui.util.ModelServiceUtils;
-import org.eclipse.actf.ui.util.PlatformUIUtil;
-import org.eclipse.actf.ui.util.timer.WaitExecSyncEventHandler;
-import org.eclipse.actf.ui.util.timer.WaitExecSyncEventListener;
 import org.eclipse.actf.visualization.ui.IVisualizationView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PartInitException;
 
-public class SimulationActionForPdt implements IWorkbenchWindowActionDelegate {
+public class SimulationActionForPdt extends AbstructVisualizationActionForPdt implements IWorkbenchWindowActionDelegate {
 
-	private static final String BROWSER_EDITOR_ID = "org.eclipse.ui.browser.editor"; //$NON-NLS-1$
-
-	private static final String SWT_BROWSER_GET_TEXT_METHOD = "getText"; //$NON-NLS-1$
-	private static final String SWT_BROWSER_CLASS = "org.eclipse.swt.browser.Browser"; //$NON-NLS-1$
-	private static final String PHPBROWSER_ID = "org.eclipse.debug.ui.PHPBrowserOutput"; //$NON-NLS-1$
-
-	private IModelServiceHolder browserHolder;
-	private IWebBrowserACTF browser;
-	private String targetHtml = ""; //$NON-NLS-1$
-	private File targetHtmlFile = null;
-
-	private IWorkbenchWindow _window;
-
-	public void dispose() {
+	@Override
+	String getTargetViewId() {
+		return IVisualizationView.ID_LOWVISIONVIEW;
 	}
 
-	public void init(IWorkbenchWindow window) {
-		this._window = window;
-	}
-
-	public void run(IAction action) {
-
-		IModelService modelService = ModelServiceUtils.getActiveModelService();
-		if ((modelService != null && modelService != browser)) {
-			simulate();
-			return;
-		}
-
-		IEditorPart editor = PlatformUIUtil.getActiveEditor();
-		if (editor != null
-				&& BROWSER_EDITOR_ID.equals(editor.getEditorSite().getId())) {
-			simulate();
-			return;
-		}
-
-		boolean updated = false;
-		String text = getText(_window.getActivePage());
-		if (text != null && !text.equals(targetHtml)) {
-			updated = true;
-			targetHtml = text;
-			targetHtmlFile = saveToFile(targetHtml);
-		}
-
-		for (IEditorReference editorRef : _window.getActivePage()
-				.getEditorReferences()) {
-			if (editorRef.getEditor(false) == browserHolder) {
-				if (updated) {
-					browser.navigate(targetHtmlFile.getAbsolutePath());
-					waitAndVisualize();
-					return;
-				} else {
-					_window.getActivePage().activate(
-							browserHolder.getEditorPart());
-					simulate();
-					return;
-				}
-			}
-		}
-
-		if (updated) {
-			ModelServiceUtils.launch(targetHtmlFile.getAbsolutePath());
-			browser = (IWebBrowserACTF) ModelServiceUtils
-					.getActiveModelService();
-			browserHolder = ModelServiceUtils.getActiveModelServiceHolder();
-			waitAndVisualize();
-			return;
-		}
-
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	private void simulate() {
-		try {
-			IViewPart viewPart = this._window.getActivePage().showView(
-					IVisualizationView.ID_LOWVISIONVIEW);
-			if (viewPart instanceof IVisualizationView) {
-				((IVisualizationView) viewPart).doVisualize();
-			}
-		} catch (PartInitException pie) {
-		}
-	}
-
-	private File saveToFile(String text) {
-		File tmpFile = null;
-		try {
-			tmpFile = PdtVisualizationPlugin.getDefault().createTempFile("php", //$NON-NLS-1$
-					".html"); //$NON-NLS-1$
-			PrintWriter pw = new PrintWriter(tmpFile, "UTF-8"); //$NON-NLS-1$
-			pw.print(text);
-			pw.flush();
-			pw.close();
-		} catch (Exception e) {
-		}
-		return tmpFile;
-	}
-
-	private HashMap<String, WaitExecSyncEventListener> eventhandlerHolder = new HashMap<String, WaitExecSyncEventListener>();
-	private static final String LISTENER_KEY = "browser"; //$NON-NLS-1$
-
-	private void waitAndVisualize() {
-
-		if (browser != null) {
-			IViewPart viewPart = null;
-			try {
-				viewPart = this._window.getActivePage().showView(
-						IVisualizationView.ID_LOWVISIONVIEW);
-			} catch (PartInitException pie) {
-			}
-			if (viewPart instanceof IVisualizationView) {
-				final IVisualizationView targetView = (IVisualizationView) viewPart;
-				WaitExecSyncEventHandler handler = new WaitForBrowserReadyHandler(
-						browser, 30, false, new Runnable() {
-							public void run() {
-								eventhandlerHolder.remove(LISTENER_KEY);
-								targetView.doVisualize();
-								PlatformUIUtil.showView(
-										IVisualizationView.ID_LOWVISIONVIEW);
-							}
-						});
-				eventhandlerHolder.put(LISTENER_KEY,
-						new WaitExecSyncEventListener(handler));
-			}
-		}
-	}
-
-	private String getText(IWorkbenchPage activePage) {
-		if (activePage == null) {
-			return null;
-		}
-		for (IViewReference viewRef : activePage.getViewReferences()) {
-			if (PHPBROWSER_ID.equals(viewRef.getId())) {
-				IViewPart[] views = activePage.getViewStack(viewRef
-						.getView(false));
-				try {
-					if (views != null
-							&& PHPBROWSER_ID.equals(views[0].getViewSite()
-									.getId())) {
-						Field[] fields = views[0].getClass()
-								.getDeclaredFields();
-						for (Field field : fields) {
-							if (SWT_BROWSER_CLASS.equals(field.getType()
-									.getName())) {
-								field.setAccessible(true);
-								Object view = field.get(views[0]);
-
-								Method getText = view.getClass().getMethod(
-										SWT_BROWSER_GET_TEXT_METHOD,
-										new Class[] {});
-								String text = (String) getText.invoke(view,
-										new Object[] {});
-
-								field.setAccessible(false);
-								return (text);
-							}
-						}
-					}
-				} catch (Exception e) {
-				}
-			}
-		}
-		return null;
-	}
 
 }
diff --git a/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/VisualizeActionForPdt.java b/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/VisualizeActionForPdt.java
index 4335ab1..216dad3 100644
--- a/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/VisualizeActionForPdt.java
+++ b/plugins/org.eclipse.actf.visualization.ui.pdt/src/org/eclipse/actf/visualization/internal/ui/pdt/VisualizeActionForPdt.java
@@ -10,197 +10,15 @@
  *******************************************************************************/
 package org.eclipse.actf.visualization.internal.ui.pdt;
 
-import java.io.File;
-import java.io.PrintWriter;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-
-import org.eclipse.actf.model.ui.IModelService;
-import org.eclipse.actf.model.ui.IModelServiceHolder;
-import org.eclipse.actf.model.ui.editor.browser.IWebBrowserACTF;
-import org.eclipse.actf.model.ui.editor.browser.WaitForBrowserReadyHandler;
-import org.eclipse.actf.model.ui.util.ModelServiceUtils;
-import org.eclipse.actf.ui.util.PlatformUIUtil;
-import org.eclipse.actf.ui.util.timer.WaitExecSyncEventHandler;
-import org.eclipse.actf.ui.util.timer.WaitExecSyncEventListener;
 import org.eclipse.actf.visualization.ui.IVisualizationView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PartInitException;
 
-public class VisualizeActionForPdt implements IWorkbenchWindowActionDelegate {
+public class VisualizeActionForPdt extends AbstructVisualizationActionForPdt
+		implements IWorkbenchWindowActionDelegate {
 
-	private static final String BROWSER_EDITOR_ID = "org.eclipse.ui.browser.editor"; //$NON-NLS-1$
-
-	private static final String SWT_BROWSER_GET_TEXT_METHOD = "getText"; //$NON-NLS-1$
-	private static final String SWT_BROWSER_CLASS = "org.eclipse.swt.browser.Browser"; //$NON-NLS-1$
-	private static final String PHPBROWSER_ID = "org.eclipse.debug.ui.PHPBrowserOutput"; //$NON-NLS-1$
-
-	private IModelServiceHolder browserHolder;
-	private IWebBrowserACTF browser;
-	private String targetHtml = ""; //$NON-NLS-1$
-	private File targetHtmlFile = null;
-
-	private IWorkbenchWindow _window;
-
-	public void dispose() {
-	}
-
-	public void init(IWorkbenchWindow window) {
-		this._window = window;
-	}
-
-	public void run(IAction action) {
-
-		IModelService modelService = ModelServiceUtils.getActiveModelService();
-		if ((modelService != null && modelService != browser)) {
-			visualize();
-			return;
-		}
-
-		IEditorPart editor = PlatformUIUtil.getActiveEditor();
-		if (editor != null
-				&& BROWSER_EDITOR_ID.equals(editor.getEditorSite().getId())) {
-			visualize();
-			return;
-		}
-
-		boolean updated = false;
-		String text = getText(_window.getActivePage());
-		if (text != null && !text.equals(targetHtml)) {
-			updated = true;
-			targetHtml = text;
-			targetHtmlFile = saveToFile(targetHtml);
-		}
-
-		for (IEditorReference editorRef : _window.getActivePage()
-				.getEditorReferences()) {
-			if (editorRef.getEditor(false) == browserHolder) {
-				if (updated) {
-					browser.navigate(targetHtmlFile.getAbsolutePath());
-					waitAndVisualize();
-					return;
-				} else {
-					_window.getActivePage().activate(
-							browserHolder.getEditorPart());
-					visualize();
-					return;
-				}
-			}
-		}
-
-		if (updated) {
-			ModelServiceUtils.launch(targetHtmlFile.getAbsolutePath());
-			browser = (IWebBrowserACTF) ModelServiceUtils
-					.getActiveModelService();
-			browserHolder = ModelServiceUtils.getActiveModelServiceHolder();
-			waitAndVisualize();
-			return;
-		}
-
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	private void visualize() {
-		try {
-			IViewPart viewPart = this._window.getActivePage().showView(
-					IVisualizationView.ID_BLINDVIEW);
-			if (viewPart instanceof IVisualizationView) {
-				((IVisualizationView) viewPart).doVisualize();
-			}
-		} catch (PartInitException pie) {
-		}
-	}
-
-	private File saveToFile(String text) {
-		File tmpFile = null;
-		try {
-			tmpFile = PdtVisualizationPlugin.getDefault().createTempFile("php", //$NON-NLS-1$
-					".html"); //$NON-NLS-1$
-			PrintWriter pw = new PrintWriter(tmpFile, "UTF-8"); //$NON-NLS-1$
-			pw.print(text);
-			pw.flush();
-			pw.close();
-		} catch (Exception e) {
-		}
-		return tmpFile;
-	}
-
-	private HashMap<String, WaitExecSyncEventListener> eventhandlerHolder = new HashMap<String, WaitExecSyncEventListener>();
-	private static final String LISTENER_KEY = "browser"; //$NON-NLS-1$
-
-	private void waitAndVisualize() {
-
-		if (browser != null) {
-			IViewPart viewPart = null;
-			try {
-				viewPart = this._window.getActivePage().showView(
-						IVisualizationView.ID_BLINDVIEW);
-			} catch (PartInitException pie) {
-			}
-			if (viewPart instanceof IVisualizationView) {
-				final IVisualizationView targetView = (IVisualizationView) viewPart;
-				WaitExecSyncEventHandler handler = new WaitForBrowserReadyHandler(
-						browser, 30, false, new Runnable() {
-							public void run() {
-								eventhandlerHolder.remove(LISTENER_KEY);
-								targetView.doVisualize();
-								PlatformUIUtil.showView(
-										IVisualizationView.ID_BLINDVIEW);
-							}
-						});
-				eventhandlerHolder.put(LISTENER_KEY,
-						new WaitExecSyncEventListener(handler));
-			}
-		}
-	}
-
-	private String getText(IWorkbenchPage activePage) {
-		if (activePage == null) {
-			return null;
-		}
-		for (IViewReference viewRef : activePage.getViewReferences()) {
-			if (PHPBROWSER_ID.equals(viewRef.getId())) {
-				IViewPart[] views = activePage.getViewStack(viewRef
-						.getView(false));
-				try {
-					if (views != null
-							&& PHPBROWSER_ID.equals(views[0].getViewSite()
-									.getId())) {
-						Field[] fields = views[0].getClass()
-								.getDeclaredFields();
-						for (Field field : fields) {
-							if (SWT_BROWSER_CLASS.equals(field.getType()
-									.getName())) {
-								field.setAccessible(true);
-								Object view = field.get(views[0]);
-
-								Method getText = view.getClass().getMethod(
-										SWT_BROWSER_GET_TEXT_METHOD,
-										new Class[] {});
-								String text = (String) getText.invoke(view,
-										new Object[] {});
-
-								field.setAccessible(false);
-								return (text);
-							}
-						}
-					}
-				} catch (Exception e) {
-				}
-			}
-		}
-		return null;
+	@Override
+	String getTargetViewId() {
+		return IVisualizationView.ID_BLINDVIEW;
 	}
 
 }
