diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/AudioComposite.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/AudioComposite.java
index d4932d7..9bd8393 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/AudioComposite.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/AudioComposite.java
@@ -21,11 +21,9 @@
 import org.eclipse.actf.ai.scripteditor.data.DataUtil;
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEventListener;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEventListener;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEvent;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEventListener;
+import org.eclipse.actf.ai.scripteditor.util.WebBrowserFactory;
 import org.eclipse.actf.ai.ui.scripteditor.views.IUNIT;
 import org.eclipse.actf.ai.ui.scripteditor.views.TimeLineView;
 import org.eclipse.actf.examples.scripteditor.Activator;
@@ -49,7 +47,7 @@
 import org.eclipse.swt.widgets.Label;
 
 public class AudioComposite extends Composite implements IUNIT,
-		SyncTimeEventListener, LabelEventListener, ScriptEventListener {
+		SyncTimeEventListener, ScriptDataEventListener {
 
 	static private AudioComposite ownInst = null;
 
@@ -85,8 +83,6 @@
 
 	protected static EventManager eventManager = EventManager.getInstance();
 	protected ScriptDataManager scriptManager = ScriptDataManager.getInstance();
-	protected DataEventManager dataEventManager = DataEventManager
-			.getInstance();
 
 	protected Label selectLabel = null;
 
@@ -113,12 +109,11 @@
 		instParentView = TimeLineView.getInstance();
 
 		eventManager.addSyncTimeEventListener(ownInst);
-		dataEventManager.addLabelEventListener(ownInst);
+		scriptManager.addScriptDataEventListener(ownInst);
 		parent.addDisposeListener(new DisposeListener() {
 			public void widgetDisposed(DisposeEvent e) {
-				// TODO other components
 				eventManager.removeSyncTimeEventListener(ownInst);
-				dataEventManager.removeLabelEventListener(ownInst);
+				scriptManager.removeScriptDataEventListener(ownInst);
 			}
 		});
 
@@ -360,10 +355,11 @@
 		newAudio.setImage(button1d.createImage());
 		newAudio.setForeground(getDisplay().getSystemColor(SWT.COLOR_WHITE));
 		guideMarkMap.put(data, newAudio);
-		final IScriptData labelData = data;
 		newAudio.addMouseListener(new MouseAdapter() {
 			public void mouseUp(MouseEvent e) {
-				scriptManager.fireSelectDataEvent(labelData, this);
+				IScriptData data = (IScriptData) e.widget.getData();
+				WebBrowserFactory.getInstance().setCurrentPosition(data.getStartTime());
+				scriptManager.fireDataSelectionEvent(data, ownInst);
 			}
 		});
 		// for TEST
@@ -383,7 +379,7 @@
 		// for TEST
 
 	}
-
+	
 	private void createLabel(IScriptData data, Color col, int lineNo) {
 		// Calculate target Label position & size
 		int eX = 0;
@@ -922,7 +918,10 @@
 					&& (e.button == 1) && currentDragStatus) {
 				if (e.widget instanceof Label) {
 					selectLabel = (Label) e.widget;
-					scriptManager.fireSelectDataEvent(data, this);
+					
+					WebBrowserFactory.getInstance().setCurrentPosition(data.getStartTime());
+					
+					scriptManager.fireDataSelectionEvent(data, ownInst);
 				}
 				currentDragStatus = false;
 			} else if (!execDataConvMouseDragged && statusMouseDragged
@@ -977,27 +976,6 @@
 		}
 	}
 
-	public void handleLabelEvent(LabelEvent e) {
-		switch (e.getEventType()) {
-		case LabelEvent.PUT_ALL_LABEL:
-			clearLabel();
-			createAllLabel(IScriptData.TYPE_AUDIO);
-			break;
-		case LabelEvent.PUT_LABEL:
-			if (e.getData().getType() != IScriptData.TYPE_AUDIO) {
-				return;
-			}
-			putLabel(e.getData(), MODE_PUT);
-			break;
-		case LabelEvent.DELETE_LABEL:
-			if (e.getData().getType() != IScriptData.TYPE_AUDIO) {
-				return;
-			}
-			deleteAudioLabel(e.getData());
-			break;
-		}
-	}
-
 	public void handleSyncTimeEvent(SyncTimeEvent e) {
 		// Synchronize TimeLine view
 		switch (e.getEventType()) {
@@ -1012,20 +990,38 @@
 	}
 
 	@Override
-	public void handleScriptEvent(ScriptEvent e) {
+	public void handleScriptEvent(ScriptDataEvent e) {
 		switch (e.getEventType()) {
-		case ScriptEvent.CLEAR_DATA:
+		case ScriptDataEvent.CLEAR:
 			clearLabel();
 			break;
-		case ScriptEvent.ADD_DATA:
+		case ScriptDataEvent.ADD:
+			if (e.getData().getType() != IScriptData.TYPE_AUDIO) {
+				return;
+			}
+			putLabel(e.getData(), MODE_PUT);
 			break;
-		case ScriptEvent.ADD_MULTIPUL_DATA:
+		case ScriptDataEvent.MULTIPLE_ADD:
+			// TODO check size of e.getDataCollection()
+			clearLabel();
+			createAllLabel(IScriptData.TYPE_AUDIO);
 			break;
-		case ScriptEvent.DELETE_DATA:
+		case ScriptDataEvent.DELETE:
+			if (e.getData().getType() != IScriptData.TYPE_AUDIO) {
+				return;
+			}
+			deleteAudioLabel(e.getData());
 			break;
-		case ScriptEvent.UPDATE_DATA:
+		case ScriptDataEvent.UPDATE:
+			if (e.getData().getType() != IScriptData.TYPE_AUDIO) {
+				return;
+			}
+			putLabel(e.getData(), MODE_PUT); // TODO updatemode
 			break;
-		case ScriptEvent.UPDATE_MULTIPUL_DATA:
+		case ScriptDataEvent.MULTIPLE_UPDATE:
+			// TODO check size of e.getDataCollection()
+			clearLabel();
+			createAllLabel(IScriptData.TYPE_AUDIO);
 			break;
 		}
 	}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/CaptionComposite.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/CaptionComposite.java
index 023edcf..46a721c 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/CaptionComposite.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/CaptionComposite.java
@@ -21,11 +21,8 @@
 import org.eclipse.actf.ai.scripteditor.data.DataUtil;
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEventListener;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEventListener;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEvent;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEventListener;
 import org.eclipse.actf.ai.ui.scripteditor.views.IUNIT;
 import org.eclipse.actf.ai.ui.scripteditor.views.TimeLineView;
 import org.eclipse.actf.examples.scripteditor.Activator;
@@ -49,7 +46,7 @@
 import org.eclipse.swt.widgets.Label;
 
 public class CaptionComposite extends Composite implements IUNIT,
-		SyncTimeEventListener, LabelEventListener, ScriptEventListener {
+		SyncTimeEventListener, ScriptDataEventListener {
 
 	// instance of own class
 	static private CaptionComposite ownInst = null;
@@ -81,7 +78,6 @@
 	private boolean currentDragStatus = false;
 
 	private static EventManager eventManager = null;
-	private static DataEventManager dataEventManager = null;
 	protected ScriptDataManager scriptManager = null;
 
 	protected Label selectLabel = null;
@@ -110,12 +106,11 @@
 		scriptManager = ScriptDataManager.getInstance();
 		eventManager = EventManager.getInstance();
 		eventManager.addSyncTimeEventListener(ownInst);
-		dataEventManager = DataEventManager.getInstance();
-		dataEventManager.addLabelEventListener(ownInst);
+		scriptManager.addScriptDataEventListener(ownInst);
 		parent.addDisposeListener(new DisposeListener() {
 			public void widgetDisposed(DisposeEvent e) {
 				eventManager.removeSyncTimeEventListener(ownInst);
-				dataEventManager.removeLabelEventListener(ownInst);
+				scriptManager.removeScriptDataEventListener(ownInst);
 			}
 		});
 
@@ -882,7 +877,7 @@
 
 				if (e.widget instanceof Label) {
 					selectLabel = (Label) e.widget;
-					scriptManager.fireSelectDataEvent(data, this);
+					scriptManager.fireDataSelectionEvent(data, this);
 				}
 				currentDragStatus = false;
 			} else if (!execDataConvMouseDragged && statusMouseDragged
@@ -992,42 +987,39 @@
 		}
 	}
 
-	public void handleLabelEvent(LabelEvent e) {
+	@Override
+	public void handleScriptEvent(ScriptDataEvent e) {
 		switch (e.getEventType()) {
-		case LabelEvent.PUT_ALL_LABEL:
+		case ScriptDataEvent.CLEAR:
 			clearLabel();
-			createAllLabel(IScriptData.TYPE_CAPTION);
 			break;
-		case LabelEvent.PUT_LABEL:
+		case ScriptDataEvent.ADD:
 			if (e.getData().getType() != IScriptData.TYPE_CAPTION) {
 				return;
 			}
 			putLabel(e.getData());
 			break;
-		case LabelEvent.DELETE_LABEL:
+		case ScriptDataEvent.MULTIPLE_ADD:
+			//TODO check size of e.getDataCollection()			
+			clearLabel();
+			createAllLabel(IScriptData.TYPE_CAPTION);
+			break;
+		case ScriptDataEvent.DELETE:
 			if (e.getData().getType() != IScriptData.TYPE_CAPTION) {
 				return;
 			}
 			deleteLabel(e.getData());
 			break;
-		}
-	}
-
-	@Override
-	public void handleScriptEvent(ScriptEvent e) {
-		switch (e.getEventType()) {
-		case ScriptEvent.CLEAR_DATA:
+		case ScriptDataEvent.UPDATE:
+			if (e.getData().getType() != IScriptData.TYPE_CAPTION) {
+				return;
+			}
+			putLabel(e.getData()); //TODO update mode
+			break;
+		case ScriptDataEvent.MULTIPLE_UPDATE:
+			//TODO check size of e.getDataCollection()			
 			clearLabel();
-			break;
-		case ScriptEvent.ADD_DATA:
-			break;
-		case ScriptEvent.ADD_MULTIPUL_DATA:
-			break;
-		case ScriptEvent.DELETE_DATA:
-			break;
-		case ScriptEvent.UPDATE_DATA:
-			break;
-		case ScriptEvent.UPDATE_MULTIPUL_DATA:
+			createAllLabel(IScriptData.TYPE_CAPTION);
 			break;
 		}
 	}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/EditPanelTab.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/EditPanelTab.java
index de014f3..a11eb14 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/EditPanelTab.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/EditPanelTab.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.actf.ai.internal.ui.scripteditor;
 
-import java.util.List;
+import java.util.Collection;
 import java.util.Locale;
 
 import org.eclipse.actf.ai.internal.ui.scripteditor.event.EventManager;
@@ -20,8 +20,6 @@
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataFactory;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
 import org.eclipse.actf.ai.scripteditor.util.TimeFormatUtil;
 import org.eclipse.actf.ai.scripteditor.util.VoicePlayerFactory;
 import org.eclipse.actf.ai.scripteditor.util.XMLFileMessageBox;
@@ -59,7 +57,6 @@
 	private static EditPanelTab ownInst = null;
 
 	private static EventManager eventManager = null;
-	private static DataEventManager dataEventManager = null;
 
 	private VoicePlayerFactory voice = VoicePlayerFactory.getInstance();
 
@@ -134,9 +131,9 @@
 	private Text textStartTimeMS;
 
 	private IScriptData currentData = null;
-	private List<IScriptData> currentListData = null;
+	private Collection<IScriptData> currentListData = null;
 
-	public void setCurrentListData(List<IScriptData> currentListData) {
+	public void setCurrentListData(Collection<IScriptData> currentListData) {
 		this.currentListData = currentListData;
 	}
 
@@ -149,7 +146,6 @@
 	public EditPanelTab(CTabFolder parent) {
 		ownInst = this;
 		eventManager = EventManager.getInstance();
-		dataEventManager = DataEventManager.getInstance();
 		initTab(parent);
 
 		scriptManager = ScriptDataManager.getInstance();
@@ -157,10 +153,6 @@
 		// TODO check SyncTimeEventListener
 	}
 
-	static public EditPanelTab getInstance() {
-		return (ownInst);
-	}
-
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -982,8 +974,6 @@
 
 				if (update_mode_flg) {
 					// for change order, delete and add data.
-					dataEventManager.fireLabelEvent(new LabelEvent(
-							LabelEvent.DELETE_LABEL, currentData, this));
 					scriptManager.remove(currentData);
 				}
 
@@ -1006,8 +996,6 @@
 				currentData.setMark(NO_MARK);
 				currentData.setDataCommit(true);
 
-				dataEventManager.fireLabelEvent(new LabelEvent(
-						LabelEvent.PUT_LABEL, currentData, this));
 				scriptManager.add(currentData);
 
 				DataUtil.debug();
@@ -1032,22 +1020,14 @@
 		 */
 		private void updateMultiScripts() {
 			for (IScriptData data : currentListData) {
-				dataEventManager.fireLabelEvent(new LabelEvent(
-						LabelEvent.DELETE_LABEL, data, this));
-
 				data.setExtended(chkBoxExtended.getSelection());
 				data.setVgGender(rButtonMale.getSelection() ? true : false);
 				data.setLang(currentDescLang);
 				data.setVgPlaySpeed(scaleVoiceSpeed.getSelection());
 				data.setVgPitch(scaleVoicePitch.getSelection());
 				data.setVgVolume(scaleVoiceVolume.getSelection());
-
-				// scriptManager.fireGuideListEvent(new ScriptEvent(
-				// ScriptEvent.UPDATE_DATA, data, this));
-				dataEventManager.fireLabelEvent(new LabelEvent(
-						LabelEvent.PUT_LABEL, data, this));
 			}
-			scriptManager.fireUpdateMultipleDataEvent(currentListData, this);
+			scriptManager.fireMultipleDataUpdateEvent(currentListData, this);
 
 			endSelectMultiItems();
 			initDispEditPanel();
@@ -1144,8 +1124,6 @@
 		 */
 		private void deleteSingleScript() {
 
-			dataEventManager.fireLabelEvent(new LabelEvent(
-					LabelEvent.DELETE_LABEL, currentData, this));
 			scriptManager.remove(currentData);
 
 			initDispEditPanel();
@@ -1163,10 +1141,8 @@
 		private void deleteMultiScripts() {
 			for (IScriptData data : currentListData) {
 				scriptManager.remove(data);
-				dataEventManager.fireLabelEvent(new LabelEvent(
-						LabelEvent.DELETE_LABEL, data, this));
 			}
-			scriptManager.fireDeselectDataEvent(this);
+			scriptManager.fireDataDeselectionEvent(this);
 
 			initDispEditPanel();
 
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/SelectWAVFileTab.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/SelectWAVFileTab.java
index 3086487..5967143 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/SelectWAVFileTab.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/SelectWAVFileTab.java
@@ -16,8 +16,6 @@
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataFactory;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
 import org.eclipse.actf.ai.scripteditor.util.SoundMixer;
 import org.eclipse.actf.ai.scripteditor.util.TempFileUtil;
 import org.eclipse.actf.ai.scripteditor.util.TimeFormatUtil;
@@ -82,7 +80,6 @@
 	// Parameter for multiple selection mode
 	private boolean current_tab_mode = true;
 
-	private DataEventManager dataEventManager = null;
 	private ScriptDataManager scriptManager = ScriptDataManager.getInstance();
 
 	private Button buttonWavOpen;
@@ -93,7 +90,6 @@
 	 * Constructor
 	 */
 	public SelectWAVFileTab(CTabFolder parent) {
-		dataEventManager = DataEventManager.getInstance();
 		// Create own instance of Composite
 		ownComposite = new Composite(parent, SWT.NONE);
 
@@ -566,14 +562,8 @@
 				if (currentData != null) {
 
 					scriptManager.remove(currentData);
-					dataEventManager.fireLabelEvent(new LabelEvent(
-							LabelEvent.DELETE_LABEL, currentData, this));
-
 					currentData = appendScriptData(currentData);
-
 					scriptManager.add(currentData);
-					dataEventManager.fireLabelEvent(new LabelEvent(
-							LabelEvent.PUT_LABEL, currentData, this));
 
 					// TODO ???
 					// SetUP status to Edit start mode
@@ -622,21 +612,12 @@
 
 				if (!deleteAll) {
 					scriptManager.remove(currentData);
-					dataEventManager.fireLabelEvent(new LabelEvent(
-							LabelEvent.DELETE_LABEL, currentData, this));
-
 					currentData.setWavURI(null);
 					currentData.setWavEnabled(false);
 
 					scriptManager.add(currentData);
-
-					dataEventManager.fireLabelEvent(new LabelEvent(
-							LabelEvent.PUT_LABEL, currentData, this));
-
 				} else {
 					scriptManager.remove(currentData);
-					dataEventManager.fireLabelEvent(new LabelEvent(
-							LabelEvent.DELETE_LABEL, currentData, this));
 				}
 
 				initDescriptionData();
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/guidelist/GuideListTree.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/guidelist/GuideListTree.java
index 4e79a35..01412af 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/guidelist/GuideListTree.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/internal/ui/scripteditor/guidelist/GuideListTree.java
@@ -18,16 +18,12 @@
 import org.eclipse.actf.ai.internal.ui.scripteditor.Validator;
 import org.eclipse.actf.ai.internal.ui.scripteditor.VolumeLevelCanvas;
 import org.eclipse.actf.ai.internal.ui.scripteditor.WavInputDialog;
-import org.eclipse.actf.ai.internal.ui.scripteditor.event.EventManager;
-import org.eclipse.actf.ai.internal.ui.scripteditor.event.SyncTimeEvent;
 import org.eclipse.actf.ai.scripteditor.data.DataUtil;
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataFactory;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEventListener;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEvent;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEventListener;
 import org.eclipse.actf.ai.scripteditor.util.VoicePlayerFactory;
 import org.eclipse.actf.ai.scripteditor.util.WebBrowserFactory;
 import org.eclipse.actf.ai.scripteditor.util.XMLFileMessageBox;
@@ -70,7 +66,7 @@
 /**
  * 
  */
-public class GuideListTree implements IUNIT, ScriptEventListener {
+public class GuideListTree implements IUNIT, ScriptDataEventListener {
 
 	private static GuideListTree ownInst = null;
 
@@ -99,26 +95,25 @@
 
 	boolean headerSelectFlag = false;
 
-	private EventManager eventManager = EventManager.getInstance();
-	private DataEventManager dataEventManager = DataEventManager.getInstance();
+	// private EventManager eventManager = EventManager.getInstance();
 
 	private ScriptSorter sorter = new ScriptSorter();
 
-	private class ColumnSelectionAdapter extends SelectionAdapter {
-		private int column;
-
-		public ColumnSelectionAdapter(int column) {
-			this.column = column;
-		}
-
-		public void widgetSelected(SelectionEvent arg0) {
-			treeViewer.setSelection(null);
-			if (sorter instanceof ScriptSorter) {
-				((ScriptSorter) sorter).setCurColumn(column);
-			}
-			treeViewer.refresh();
-		}
-	}
+	// private class ColumnSelectionAdapter extends SelectionAdapter {
+	// private int column;
+	//
+	// public ColumnSelectionAdapter(int column) {
+	// this.column = column;
+	// }
+	//
+	// public void widgetSelected(SelectionEvent arg0) {
+	// treeViewer.setSelection(null);
+	// if (sorter instanceof ScriptSorter) {
+	// ((ScriptSorter) sorter).setCurColumn(column);
+	// }
+	// treeViewer.refresh();
+	// }
+	// }
 
 	/**
 	 * Constructor
@@ -134,11 +129,10 @@
 		treeViewer.setComparator(new GuildListComparator());
 		treeViewer.setSorter(sorter);
 
-		scriptManager.addGuideListEventListener(ownInst);
+		scriptManager.addScriptDataEventListener(ownInst);
 		parentComposite.addDisposeListener(new DisposeListener() {
 			public void widgetDisposed(DisposeEvent e) {
-				// TODO other components
-				scriptManager.removeGuideListEventListener(ownInst);
+				scriptManager.removeScriptDataEventListener(ownInst);
 			}
 		});
 		initTable();
@@ -149,22 +143,6 @@
 		instTree.setSortDirection(style);
 	}
 
-	private void selectGuideLineItemProcess(IScriptData paramData) {
-		IScriptData data = paramData;
-
-		TimeLineView timeLineView = TimeLineView.getInstance();
-		if (timeLineView != null
-				&& timeLineView.getStatusTimeLine() == TL_STAT_PAUSE) {
-			// Synchronize all TimeLine
-			eventManager.fireSyncTimeEvent(new SyncTimeEvent(
-					SyncTimeEvent.ADJUST_TIME_LINE, data.getStartTime(), this));
-		}
-		scriptManager.fireSelectDataEvent(data, this);
-
-		// Initialize sampling duration.
-		VolumeLevelCanvas.getInstance().clearSamplingLengthVolumeLevel();
-	}
-
 	private void initTable() {
 
 		FormData scriptTreeData = new FormData();
@@ -259,255 +237,232 @@
 		// Speaker
 		characterComboCell = new ComboBoxCellEditorEx(instTree, scriptManager
 				.getCharacterList().toArray(new String[0]));
-		((CCombo) characterComboCell.getControl())
-				.addFocusListener(new FocusAdapter() {
-					String beforeCharacter = "";
-					IScriptData data = null;
+		characterComboCell.getControl().addFocusListener(new FocusAdapter() {
+			String beforeCharacter = "";
+			IScriptData data = null;
 
-					public void focusGained(FocusEvent e) {
-						TreeSelection selection = (TreeSelection) treeViewer
-								.getSelection();
-						data = (IScriptData) selection.getFirstElement();
+			public void focusGained(FocusEvent e) {
+				TreeSelection selection = (TreeSelection) treeViewer
+						.getSelection();
+				data = (IScriptData) selection.getFirstElement();
 
-						beforeCharacter = ((CCombo) (e.widget)).getText();
-						selectGuideLineItemProcess(data);
-						if (data.getType() == IScriptData.TYPE_AUDIO) {
-							Display.getCurrent().asyncExec(new Runnable() {
-								public void run() {
-									characterComboCell.deactivate();
-								}
-							});
-							return;
+				beforeCharacter = ((CCombo) (e.widget)).getText();
+				if (data.getType() == IScriptData.TYPE_AUDIO) {
+					Display.getCurrent().asyncExec(new Runnable() {
+						public void run() {
+							characterComboCell.deactivate();
 						}
-					}
+					});
+					return;
+				}
+			}
 
-					public void focusLost(FocusEvent e) {
-						String character = ((CCombo) (e.widget)).getText();
+			public void focusLost(FocusEvent e) {
+				String character = ((CCombo) (e.widget)).getText();
 
-						if (beforeCharacter.equals(character)) {
-							return;
-						}
-
-						data.setCharacter(character);
-						data.setDataCommit(true);
-						scriptManager.fireUpdateDataEvent(data, this);
-					}
-				});
+				if (beforeCharacter.equals(character)) {
+					return;
+				}
+				data.setCharacter(character);
+				data.setDataCommit(true);
+				scriptManager.fireDataUpdateEvent(data, this);
+			}
+		});
 
 		// Scenario
 		final TextCellEditorEx scenarioTextCell = new TextCellEditorEx(instTree);
-		((Text) scenarioTextCell.getControl())
-				.addFocusListener(new FocusAdapter() {
-					String beforeScenario = "";
-					IScriptData data = null;
+		scenarioTextCell.getControl().addFocusListener(new FocusAdapter() {
+			String beforeScenario = "";
+			IScriptData data = null;
 
-					public void focusGained(FocusEvent e) {
-						TreeSelection selection = (TreeSelection) treeViewer
-								.getSelection();
-						data = (IScriptData) selection.getFirstElement();
-						selectGuideLineItemProcess(data);
+			public void focusGained(FocusEvent e) {
+				TreeSelection selection = (TreeSelection) treeViewer
+						.getSelection();
+				data = (IScriptData) selection.getFirstElement();
 
-						if (data.getType() != IScriptData.TYPE_SCENARIO) {
-							Display.getCurrent().asyncExec(new Runnable() {
-								public void run() {
-									scenarioTextCell.deactivate();
-								}
-							});
-							return;
+				if (data.getType() != IScriptData.TYPE_SCENARIO) {
+					Display.getCurrent().asyncExec(new Runnable() {
+						public void run() {
+							scenarioTextCell.deactivate();
 						}
-						beforeScenario = ((Text) (e.widget)).getText();
-					}
+					});
+					return;
+				}
+				beforeScenario = ((Text) (e.widget)).getText();
+			}
 
-					public void focusLost(FocusEvent e) {
-						String scenario = ((Text) (e.widget)).getText();
-						if (beforeScenario.equals(scenario)) {
-							return;
-						}
-						data.setScenario(scenario);
-						data.setDataCommit(true);
-						scriptManager.fireUpdateDataEvent(data, this);
+			public void focusLost(FocusEvent e) {
+				String scenario = ((Text) (e.widget)).getText();
+				if (beforeScenario.equals(scenario)) {
+					return;
+				}
+				data.setScenario(scenario);
+				data.setDataCommit(true);
+				scriptManager.fireDataUpdateEvent(data, this);
 
-					}
-				});
+			}
+		});
 
 		// Description
 		final TextCellEditorEx descriptionTextCell = new TextCellEditorEx(
 				instTree);
-		((Text) descriptionTextCell.getControl())
-				.addFocusListener(new FocusAdapter() {
-					String beforeDescription = "";
-					IScriptData data = null;
+		descriptionTextCell.getControl().addFocusListener(new FocusAdapter() {
+			String beforeDescription = "";
+			IScriptData data = null;
 
-					public void focusGained(FocusEvent e) {
-						Display.getCurrent().asyncExec(new Runnable() {
-							public void run() {
-								descriptionTextCell.activate();
-							}
-						});
-						TreeSelection selection = (TreeSelection) treeViewer
-								.getSelection();
-						data = (IScriptData) selection.getFirstElement();
-						beforeDescription = ((Text) (e.widget)).getText();
-
-						selectGuideLineItemProcess(data);
-
-						if (data.getType() != IScriptData.TYPE_AUDIO
-								&& !(data.getType() == IScriptData.TYPE_SCENARIO && data
-										.isDataCommit() == false)) {
-							Display.getCurrent().asyncExec(new Runnable() {
-								public void run() {
-									descriptionTextCell.deactivate();
-								}
-							});
-							return;
-						}
-					}
-
-					public void focusLost(FocusEvent e) {
-						String description = ((Text) (e.widget)).getText();
-						if (beforeDescription.equals(description)) {
-							return;
-						}
-						dataEventManager.fireLabelEvent(new LabelEvent(
-								LabelEvent.DELETE_LABEL, data, this));
-						scriptManager.remove(data);
-
-						data.setType(IScriptData.TYPE_AUDIO);
-						data.setMark(NO_MARK);
-						data.setDescription(description);
-
-						int newEndTime;
-						int length = VoicePlayerFactory.getInstance()
-								.getSpeakLength(data);
-						if (length > 0) {
-							newEndTime = data.getStartTime() + length;
-							data.setEndTimeAccurate(true);
-						} else {
-							newEndTime = data.getStartTime()
-									+ DataUtil.sumMoraCount(
-											data.getDescription(),
-											data.getLang());
-							data.setEndTimeAccurate(false);
-						}
-
-						data.setEndTime(newEndTime);
-						data.setDataCommit(true);
-
-						scriptManager.add(data);
-						dataEventManager.fireLabelEvent(new LabelEvent(
-								LabelEvent.PUT_LABEL, data, this));
-
+			public void focusGained(FocusEvent e) {
+				Display.getCurrent().asyncExec(new Runnable() {
+					public void run() {
+						descriptionTextCell.activate();
 					}
 				});
+				TreeSelection selection = (TreeSelection) treeViewer
+						.getSelection();
+				data = (IScriptData) selection.getFirstElement();
+				beforeDescription = ((Text) (e.widget)).getText();
+
+				if (data.getType() != IScriptData.TYPE_AUDIO
+						&& !(data.getType() == IScriptData.TYPE_SCENARIO && data
+								.isDataCommit() == false)) {
+					Display.getCurrent().asyncExec(new Runnable() {
+						public void run() {
+							descriptionTextCell.deactivate();
+						}
+					});
+					return;
+				}
+			}
+
+			public void focusLost(FocusEvent e) {
+				String description = ((Text) (e.widget)).getText();
+				if (beforeDescription.equals(description)) {
+					return;
+				}
+				scriptManager.remove(data);
+
+				data.setType(IScriptData.TYPE_AUDIO);
+				data.setMark(NO_MARK);
+				data.setDescription(description);
+
+				int newEndTime;
+				int length = VoicePlayerFactory.getInstance().getSpeakLength(
+						data);
+				if (length > 0) {
+					newEndTime = data.getStartTime() + length;
+					data.setEndTimeAccurate(true);
+				} else {
+					newEndTime = data.getStartTime()
+							+ DataUtil.sumMoraCount(data.getDescription(),
+									data.getLang());
+					data.setEndTimeAccurate(false);
+				}
+
+				data.setEndTime(newEndTime);
+				data.setDataCommit(true);
+
+				scriptManager.add(data);
+			}
+		});
 
 		//
 		// Caption
 		// -------------------------------------------------------------------------------
 		//
 		final TextCellEditorEx captionTextCell = new TextCellEditorEx(instTree);
-		((Text) captionTextCell.getControl())
-				.addFocusListener(new FocusAdapter() {
-					String beforeCaption = "";
-					IScriptData data = null;
-					TreeItem[] item;
+		captionTextCell.getControl().addFocusListener(new FocusAdapter() {
+			String beforeCaption = "";
+			IScriptData data = null;
 
-					public void focusGained(FocusEvent e) {
-						TreeSelection selection = (TreeSelection) treeViewer
-								.getSelection();
-						data = (IScriptData) selection.getFirstElement();
-						item = instTree.getSelection();
-						beforeCaption = ((Text) (e.widget)).getText();
+			// TreeItem[] item;
 
-						selectGuideLineItemProcess(data);
+			public void focusGained(FocusEvent e) {
+				TreeSelection selection = (TreeSelection) treeViewer
+						.getSelection();
+				data = (IScriptData) selection.getFirstElement();
+				// item = instTree.getSelection();
+				beforeCaption = ((Text) (e.widget)).getText();
 
-						if (data.getType() != IScriptData.TYPE_CAPTION
-								&& !(data.getType() == IScriptData.TYPE_SCENARIO && data
-										.isDataCommit() == false)) {
-							Display.getCurrent().asyncExec(new Runnable() {
-								public void run() {
-									captionTextCell.deactivate();
-								}
-							});
-							return;
+				if (data.getType() != IScriptData.TYPE_CAPTION
+						&& !(data.getType() == IScriptData.TYPE_SCENARIO && data
+								.isDataCommit() == false)) {
+					Display.getCurrent().asyncExec(new Runnable() {
+						public void run() {
+							captionTextCell.deactivate();
 						}
-					}
+					});
+					return;
+				}
+			}
 
-					public void focusLost(FocusEvent e) {
-						String caption = ((Text) (e.widget)).getText();
-						if (beforeCaption.equals(caption)) {
-							return;
-						}
+			public void focusLost(FocusEvent e) {
+				String caption = ((Text) (e.widget)).getText();
+				if (beforeCaption.equals(caption)) {
+					return;
+				}
 
-						dataEventManager.fireLabelEvent(new LabelEvent(
-								LabelEvent.DELETE_LABEL, data, this));
-						scriptManager.remove(data);
+				scriptManager.remove(data);
 
-						data.setType(IScriptData.TYPE_CAPTION);
-						data.setMark(NO_MARK);
-						data.setCaption(caption);
-						if (data.getEndTime() <= data.getStartTime()) {
-							// TODO need input from user
-							int endTime = DataUtil.sumMoraCount(
-									data.getCaption(), data.getLang());
-							data.setEndTime(data.getStartTime() + endTime);
-						}
+				data.setType(IScriptData.TYPE_CAPTION);
+				data.setMark(NO_MARK);
+				data.setCaption(caption);
+				if (data.getEndTime() <= data.getStartTime()) {
+					// TODO need input from user
+					int endTime = DataUtil.sumMoraCount(data.getCaption(),
+							data.getLang());
+					data.setEndTime(data.getStartTime() + endTime);
+				}
 
-						data.setDataCommit(true);
+				data.setDataCommit(true);
 
-						scriptManager.add(data);
-						dataEventManager.fireLabelEvent(new LabelEvent(
-								LabelEvent.PUT_LABEL, data, this));
+				scriptManager.add(data);
 
-					}
-				});
+			}
+		});
 		//
 		// Extended
 		// -------------------------------------------------------------------------------
 		//
 		final ComboBoxCellEditor extendsComboCell = new ComboBoxCellEditor(
 				instTree, new String[] { "Extended", "Normal" });
-		((CCombo) extendsComboCell.getControl())
-				.addFocusListener(new FocusAdapter() {
-					String beforeExtends = "";
-					IScriptData data = null;
+		extendsComboCell.getControl().addFocusListener(new FocusAdapter() {
+			String beforeExtends = "";
+			IScriptData data = null;
 
-					public void focusGained(FocusEvent e) {
-						TreeSelection selection = (TreeSelection) treeViewer
-								.getSelection();
-						data = (IScriptData) selection.getFirstElement();
+			public void focusGained(FocusEvent e) {
+				TreeSelection selection = (TreeSelection) treeViewer
+						.getSelection();
+				data = (IScriptData) selection.getFirstElement();
 
-						beforeExtends = ((CCombo) (e.widget)).getText();
-						selectGuideLineItemProcess(data);
-						if (data.getType() != IScriptData.TYPE_AUDIO) {
-							Display.getCurrent().asyncExec(new Runnable() {
-								public void run() {
-									extendsComboCell.deactivate();
-								}
-							});
-							return;
+				beforeExtends = ((CCombo) (e.widget)).getText();
+				if (data.getType() != IScriptData.TYPE_AUDIO) {
+					Display.getCurrent().asyncExec(new Runnable() {
+						public void run() {
+							extendsComboCell.deactivate();
 						}
-					}
+					});
+					return;
+				}
+			}
 
-					public void focusLost(FocusEvent e) {
-						String extended = ((CCombo) (e.widget)).getText();
-						if (beforeExtends.equals(extended)) {
-							return;
-						}
+			public void focusLost(FocusEvent e) {
+				String extended = ((CCombo) (e.widget)).getText();
+				if (beforeExtends.equals(extended)) {
+					return;
+				}
 
-						if (data.getType() == IScriptData.TYPE_AUDIO) {
-							data.setExtended("Extended".equals(extended));
-							dataEventManager.fireLabelEvent(new LabelEvent(
-									LabelEvent.PUT_LABEL, data, this));
-						}
-					}
-				});
+				if (data.getType() == IScriptData.TYPE_AUDIO) {
+					data.setExtended("Extended".equals(extended));
+					scriptManager.fireDataUpdateEvent(data, this);
+				}
+			}
+		});
 
 		//
 		// Wav
 		// -------------------------------------------------------------------------------
 		//
 		final TextCellEditorEx wavTextCell = new TextCellEditorEx(instTree);
-		((Text) wavTextCell.getControl()).addFocusListener(new FocusAdapter() {
+		wavTextCell.getControl().addFocusListener(new FocusAdapter() {
 			public void focusGained(FocusEvent e) {
 				Display.getCurrent().asyncExec(new Runnable() {
 					public void run() {
@@ -521,7 +476,6 @@
 							.getSelection();
 					final IScriptData data = (IScriptData) selection
 							.getFirstElement();
-					selectGuideLineItemProcess(data);
 					if (data.getType() != IScriptData.TYPE_AUDIO) {
 						return;
 					}
@@ -545,33 +499,13 @@
 										.getStartTimeString())) {
 
 									scriptManager.remove(data);
-
-									dataEventManager
-											.fireLabelEvent(new LabelEvent(
-													LabelEvent.DELETE_LABEL,
-													data, this));
 									data.setDataCommit(true);
-
 									scriptManager.add(data);
-
-									dataEventManager
-											.fireLabelEvent(new LabelEvent(
-													LabelEvent.PUT_LABEL, data,
-													this));
-
 								}
 
 							} else if (dialog.getReturnCode() == WavInputDialog.DELETE) {
 								scriptManager.remove(data);
-
-								dataEventManager.fireLabelEvent(new LabelEvent(
-										LabelEvent.DELETE_LABEL, data, this));
-
 								scriptManager.add(data);
-
-								dataEventManager.fireLabelEvent(new LabelEvent(
-										LabelEvent.PUT_LABEL, data, this));
-
 							}
 						}
 					});
@@ -592,30 +526,28 @@
 		// -------------------------------------------------------------------------------
 		//
 		TextCellEditorEx commentTextCell = new TextCellEditorEx(instTree);
-		((Text) commentTextCell.getControl())
-				.addFocusListener(new FocusAdapter() {
-					String beforeComment = "";
-					IScriptData data = null;
+		commentTextCell.getControl().addFocusListener(new FocusAdapter() {
+			String beforeComment = "";
+			IScriptData data = null;
 
-					public void focusGained(FocusEvent e) {
-						TreeSelection selection = (TreeSelection) treeViewer
-								.getSelection();
-						data = (IScriptData) selection.getFirstElement();
+			public void focusGained(FocusEvent e) {
+				TreeSelection selection = (TreeSelection) treeViewer
+						.getSelection();
+				data = (IScriptData) selection.getFirstElement();
 
-						beforeComment = ((Text) (e.widget)).getText();
-						selectGuideLineItemProcess(data);
-					}
+				beforeComment = ((Text) (e.widget)).getText();
+			}
 
-					public void focusLost(FocusEvent e) {
-						String comment = ((Text) (e.widget)).getText();
-						if (beforeComment.equals(comment)) {
-							return;
-						}
-						data.setScriptComment(comment);
-						scriptManager.fireUpdateDataEvent(data, this);
-						DataUtil.debug();
-					}
-				});
+			public void focusLost(FocusEvent e) {
+				String comment = ((Text) (e.widget)).getText();
+				if (beforeComment.equals(comment)) {
+					return;
+				}
+				data.setScriptComment(comment);
+				scriptManager.fireDataUpdateEvent(data, this);
+				DataUtil.debug();
+			}
+		});
 
 		CellEditor[] editors = new CellEditor[] { new TextCellEditor(instTree),
 				new TextCellEditor(instTree), startTimeTextCell,
@@ -778,8 +710,6 @@
 			}
 		}
 		scriptManager.addAll(list);
-		dataEventManager.fireLabelEvent(new LabelEvent(
-				LabelEvent.PUT_ALL_LABEL, null, this));
 	}
 
 	class DeleteAction extends Action implements IUNIT {
@@ -801,9 +731,6 @@
 
 						IScriptData data = (IScriptData) items[i].getData();
 						scriptManager.remove(data);
-						dataEventManager.fireLabelEvent(new LabelEvent(
-								LabelEvent.DELETE_LABEL, data, this));
-
 					}
 				}
 			});
@@ -885,48 +812,51 @@
 			List<IScriptData> list = sel.toList();
 
 			// Exist ScriptData?
-			if (list.size() == 1) {
+			if (list.size() > 0) {
 				selectAllColumn(column2, SWT.NONE);
-			} else if (list.size() > 1) {
-				selectAllColumn(column2, SWT.NONE);
-				if (EditPanelTab.getInstance() != null) {
-					EditPanelTab.getInstance().setMultiSelectMode(true);
-					EditPanelTab.getInstance().setCurrentListData(list);
-				}
 			} else {
 				return;
 			}
-			if (isUser && e.getSource() != this) {
-				int newPosition = list.iterator().next().getStartTime() - 10;
-				if (newPosition < 0) {
-					newPosition = 0;
+			if (isUser) {
+
+				IScriptData data = list.get(0);
+
+				// TODO use event
+				WebBrowserFactory.getInstance().setCurrentPosition(
+						data.getStartTime());
+
+				if (list.size() == 1) {
+					scriptManager.fireDataSelectionEvent(data, ownInst);
+				} else {
+					scriptManager.fireMultipleDataSelectionEvent(list, ownInst);
 				}
-				WebBrowserFactory.getInstance().pauseMedia();
-				WebBrowserFactory.getInstance().setCurrentPosition(newPosition);
 			}
 		}
 	}
 
-	public void handleScriptEvent(ScriptEvent e) {
+	public void handleScriptEvent(ScriptDataEvent e) {
 		switch (e.getEventType()) {
-		case ScriptEvent.SELECT_DATA:
-		case ScriptEvent.PLAY_DATA:
+		case ScriptDataEvent.SELECT:
+			if (e.getSource() == ownInst) {
+				break;
+			}
+		case ScriptDataEvent.PLAY:
 			isUser = false;
 			IScriptData data = e.getData();
 			treeViewer.setSelection(new StructuredSelection(data), true);
 			isUser = true;
 			break;
-		case ScriptEvent.DESELECT_DATA:
+		case ScriptDataEvent.DESELECT:
 			treeViewer.setSelection(null, false);
 			break;
-		case ScriptEvent.ADD_DATA:
-		case ScriptEvent.ADD_MULTIPUL_DATA:
-		case ScriptEvent.UPDATE_DATA:
-		case ScriptEvent.UPDATE_MULTIPUL_DATA:
-		case ScriptEvent.DELETE_DATA:
+		case ScriptDataEvent.ADD:
+		case ScriptDataEvent.MULTIPLE_ADD:
+		case ScriptDataEvent.UPDATE:
+		case ScriptDataEvent.MULTIPLE_UPDATE:
+		case ScriptDataEvent.DELETE:
 			updateLine();
 			break;
-		case ScriptEvent.CLEAR_DATA:
+		case ScriptDataEvent.CLEAR:
 			treeViewer.getTree().removeAll();
 			break;
 		}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/ScriptDataManager.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/ScriptDataManager.java
index 512b339..8e07818 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/ScriptDataManager.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/ScriptDataManager.java
@@ -17,8 +17,8 @@
 import java.util.List;
 import java.util.TreeSet;
 
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEventListener;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEvent;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEventListener;
 import org.eclipse.actf.ai.scripteditor.util.TimeFormatUtil;
 import org.eclipse.actf.ai.scripteditor.util.XMLFileMessageBox;
 import org.eclipse.actf.util.FileUtils;
@@ -29,7 +29,7 @@
  */
 public class ScriptDataManager {
 
-	private static List<ScriptEventListener> SCRIPT_EVENT_LISTENERS = new ArrayList<ScriptEventListener>();
+	private static List<ScriptDataEventListener> SCRIPT_EVENT_LISTENERS = new ArrayList<ScriptDataEventListener>();
 
 	public class scriptDataComparator implements Comparator<IScriptData> {
 
@@ -94,10 +94,10 @@
 		return (ownInst);
 	}
 
-	public synchronized void clearData() {
+	public synchronized void clear() {
 		iData.clear();
 		cData.clear();
-		fireScriptEvent(new ScriptEvent(ScriptEvent.CLEAR_DATA, this));
+		fireScriptEvent(new ScriptDataEvent(ScriptDataEvent.CLEAR, this));
 	}
 
 	@Deprecated
@@ -152,7 +152,7 @@
 			cData.add(tmpCharacter);
 		}
 		if (iData.add(data)) {
-			fireScriptEvent(ScriptEvent.ADD_DATA, data, this);
+			fireScriptEvent(ScriptDataEvent.ADD, data, this);
 			return true;
 		}
 		return false;
@@ -166,7 +166,7 @@
 			}
 		}
 		if (iData.addAll(data)) {
-			fireScriptEvent(new ScriptEvent(ScriptEvent.ADD_MULTIPUL_DATA,
+			fireScriptEvent(new ScriptDataEvent(ScriptDataEvent.MULTIPLE_ADD,
 					data, this));
 			return true;
 		}
@@ -179,7 +179,7 @@
 
 	public synchronized boolean remove(IScriptData data) {
 		if (iData.remove(data)) {
-			fireScriptEvent(ScriptEvent.DELETE_DATA, data, this);
+			fireScriptEvent(ScriptDataEvent.DELETE, data, this);
 			return true;
 		}
 		return false;
@@ -501,7 +501,7 @@
 	 * 
 	 * @param listener
 	 */
-	public void addGuideListEventListener(ScriptEventListener listener) {
+	public void addScriptDataEventListener(ScriptDataEventListener listener) {
 		SCRIPT_EVENT_LISTENERS.add(listener);
 	}
 
@@ -510,37 +510,43 @@
 	 * 
 	 * @param listener
 	 */
-	public void removeGuideListEventListener(ScriptEventListener listener) {
+	public void removeScriptDataEventListener(ScriptDataEventListener listener) {
 		SCRIPT_EVENT_LISTENERS.remove(listener);
 	}
 
-	public void fireSelectDataEvent(IScriptData selectedData, Object source) {
-		fireScriptEvent(ScriptEvent.SELECT_DATA, selectedData, source);
+	public void fireDataSelectionEvent(IScriptData selectedData, Object source) {
+		fireScriptEvent(ScriptDataEvent.SELECT, selectedData, source);
 	}
 
-	public void fireDeselectDataEvent(Object source) {
-		fireScriptEvent(new ScriptEvent(ScriptEvent.DESELECT_DATA, source));
+	public void fireMultipleDataSelectionEvent(
+			Collection<IScriptData> selection, Object source) {
+		fireScriptEvent(new ScriptDataEvent(ScriptDataEvent.MULTIPLE_SELECT,
+				selection, source));
 	}
 
-	public void fireUpdateDataEvent(IScriptData updatedData, Object source) {
-		fireScriptEvent(ScriptEvent.UPDATE_DATA, updatedData, source);
+	public void fireDataDeselectionEvent(Object source) {
+		fireScriptEvent(new ScriptDataEvent(ScriptDataEvent.DESELECT, source));
 	}
 
-	public void fireUpdateMultipleDataEvent(
+	public void fireDataUpdateEvent(IScriptData updatedData, Object source) {
+		fireScriptEvent(ScriptDataEvent.UPDATE, updatedData, source);
+	}
+
+	public void fireMultipleDataUpdateEvent(
 			Collection<IScriptData> updatedData, Object source) {
 		if (updatedData != null) {
-			fireScriptEvent(new ScriptEvent(ScriptEvent.UPDATE_MULTIPUL_DATA,
-					updatedData, source));
+			fireScriptEvent(new ScriptDataEvent(
+					ScriptDataEvent.MULTIPLE_UPDATE, updatedData, source));
 		}
 	}
 
 	public void firePlayEvent(IScriptData playingData, Object source) {
-		fireScriptEvent(ScriptEvent.PLAY_DATA, playingData, source);
+		fireScriptEvent(ScriptDataEvent.PLAY, playingData, source);
 	}
 
 	private void fireScriptEvent(int type, IScriptData data, Object source) {
 		if (data != null) {
-			fireScriptEvent(new ScriptEvent(type, data, source));
+			fireScriptEvent(new ScriptDataEvent(type, data, source));
 		}
 	}
 
@@ -549,8 +555,8 @@
 	 * 
 	 * @param event
 	 */
-	private void fireScriptEvent(ScriptEvent event) {
-		for (ScriptEventListener listener : SCRIPT_EVENT_LISTENERS) {
+	private void fireScriptEvent(ScriptDataEvent event) {
+		for (ScriptDataEventListener listener : SCRIPT_EVENT_LISTENERS) {
 			listener.handleScriptEvent(event);
 		}
 	}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/DataEventManager.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/DataEventManager.java
deleted file mode 100644
index 3bd63e2..0000000
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/DataEventManager.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2012 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.actf.ai.scripteditor.data.event;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class DataEventManager {
-	private static DataEventManager ownInst = null;
-
-	/**
-	 * Get instance of EventManager
-	 * 
-	 * @return instance
-	 */
-	public static DataEventManager getInstance() {
-		if (ownInst == null) {
-			ownInst = new DataEventManager();
-		}
-		return ownInst;
-	}
-
-	// ----------------- AUDIO Event -----------------------
-	/**
-	 * Play Mark Event Listeners
-	 */
-	private static List<LabelEventListener> labelEventListeners = new ArrayList<LabelEventListener>();
-
-	/**
-	 * Add Play Mark Event Listener
-	 * 
-	 * @param listener
-	 */
-	public synchronized void addLabelEventListener(LabelEventListener listener) {
-		labelEventListeners.add(listener);
-	}
-
-	/**
-	 * Remove Play Mark Event Listener
-	 * 
-	 * @param listener
-	 */
-	public synchronized void removeLabelEventListener(
-			LabelEventListener listener) {
-		labelEventListeners.remove(listener);
-	}
-
-	/**
-	 * fire Play Mark Event
-	 * 
-	 * @param event
-	 */
-	public synchronized void fireLabelEvent(LabelEvent event) {
-		for (LabelEventListener listener : labelEventListeners) {
-			listener.handleLabelEvent(event);
-			// System.out.println(listener);
-		}
-		// System.out.println("----------");
-	}
-
-}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/LabelEvent.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/LabelEvent.java
deleted file mode 100644
index 28eb76e..0000000
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/LabelEvent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2012 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.actf.ai.scripteditor.data.event;
-
-import java.util.EventObject;
-
-import org.eclipse.actf.ai.scripteditor.data.IScriptData;
-
-public class LabelEvent extends EventObject {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -8216230604599825989L;
-
-	public static final int PUT_ALL_LABEL = 1; // create or
-	public static final int PUT_LABEL = 2; // create or update label
-	public static final int DELETE_LABEL = 3;
-
-	private int eventType;
-	private IScriptData data;
-
-	public LabelEvent(int eventType, IScriptData data, Object source) {
-		super(source);
-		this.eventType = eventType;
-		this.data = data;
-	}
-
-	public int getEventType() {
-		return eventType;
-	}
-
-	public IScriptData getData() {
-		return data;
-	}
-
-}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptEvent.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptDataEvent.java
similarity index 65%
rename from plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptEvent.java
rename to plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptDataEvent.java
index 870201a..e51e645 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptEvent.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptDataEvent.java
@@ -15,44 +15,46 @@
 
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 
-public class ScriptEvent extends EventObject {
+public class ScriptDataEvent extends EventObject {
 
 	/**
 	 * 
 	 */
 	private static final long serialVersionUID = 1860351762555451972L;
 
-	public static final int CLEAR_DATA = 0;
-	public static final int SELECT_DATA = 1;
-	public static final int DESELECT_DATA = 2;
-	public static final int PLAY_DATA = 3;
-	// TODO play fin
+	public static final int CLEAR = 0;
+	public static final int ADD = 1;
+	public static final int MULTIPLE_ADD = 2;
+	public static final int DELETE = 3;
+	// multiple remove?
 
-	// Migrate from AudioEvent
-	public static final int ADD_DATA = 5;
-	public static final int ADD_MULTIPUL_DATA = 6;
-	public static final int DELETE_DATA = 7;
-	// TODO multiple remove?
+	public static final int UPDATE = 10;
+	public static final int MULTIPLE_UPDATE = 11;
 
-	public static final int UPDATE_DATA = 9;
-	public static final int UPDATE_MULTIPUL_DATA = 10;
+	public static final int SELECT = 20;
+	public static final int MULTIPLE_SELECT = 21;
+	public static final int DESELECT = 22;
+
+	public static final int PLAY = 33;
+	// TODO play fin, select multi
+
 
 	private int eventType;
 	private IScriptData data = null;
 	private Collection<IScriptData> cData = null;
 
-	public ScriptEvent(int eventType, Object source) {
+	public ScriptDataEvent(int eventType, Object source) {
 		super(source);
 		this.eventType = eventType;
 	}
 
-	public ScriptEvent(int eventType, IScriptData data, Object source) {
+	public ScriptDataEvent(int eventType, IScriptData data, Object source) {
 		super(source);
 		this.eventType = eventType;
 		this.data = data;
 	}
 
-	public ScriptEvent(int eventType, Collection<IScriptData> cData,
+	public ScriptDataEvent(int eventType, Collection<IScriptData> cData,
 			Object source) {
 		super(source);
 		this.eventType = eventType;
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/LabelEventListener.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptDataEventListener.java
similarity index 83%
rename from plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/LabelEventListener.java
rename to plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptDataEventListener.java
index 9c9eee3..ca709c2 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/LabelEventListener.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptDataEventListener.java
@@ -12,6 +12,6 @@
 
 import java.util.EventListener;
 
-public interface LabelEventListener extends EventListener {
-	public abstract void handleLabelEvent(LabelEvent e);
+public interface ScriptDataEventListener extends EventListener {
+	public abstract void handleScriptEvent(ScriptDataEvent e);
 }
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptEventListener.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptEventListener.java
deleted file mode 100644
index 785d290..0000000
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/data/event/ScriptEventListener.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2012 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.actf.ai.scripteditor.data.event;
-
-import java.util.EventListener;
-
-public interface ScriptEventListener extends EventListener {
-	public abstract void handleScriptEvent(ScriptEvent e);
-}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/reader/CSVReader.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/reader/CSVReader.java
index e4094b6..86ad9a9 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/reader/CSVReader.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/reader/CSVReader.java
@@ -30,8 +30,6 @@
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataFactory;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
 import org.eclipse.actf.ai.scripteditor.preferences.CSVRulePreferenceUtil;
 import org.eclipse.actf.ai.scripteditor.util.SoundMixer;
 import org.eclipse.actf.ai.scripteditor.util.TimeFormatUtil;
@@ -175,9 +173,8 @@
 	private boolean currentActive = false;
 	private int currentProcess = CSV_PROC_IDLE;
 
-	private DataEventManager dataEventManager = null;
 	private ScriptDataManager scriptManager = ScriptDataManager.getInstance();
-	private EventManager eventManager = null;
+	private EventManager eventManager = EventManager.getInstance();
 	static List<IScriptData> dataList = new ArrayList<IScriptData>();
 
 	/**
@@ -213,8 +210,6 @@
 		currentStatus = CSV_ANA_IDLE;
 		currentActive = false;
 
-		dataEventManager = DataEventManager.getInstance();
-		eventManager = EventManager.getInstance();
 	}
 
 	/**
@@ -1034,14 +1029,10 @@
 
 				if (CSV_SAVE_RULE_RENEWAL == CSVRulePreferenceUtil
 						.getPreferenceCsvSaveRule()) {
-					scriptManager.clearData();
+					scriptManager.clear();
 				}
 
 				scriptManager.addAll(dataList);
-
-				// rewrite all labels at once
-				dataEventManager.fireLabelEvent(new LabelEvent(
-						LabelEvent.PUT_ALL_LABEL, null, this));
 			}
 		});
 
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/util/DragDropFileReader.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/util/DragDropFileReader.java
index 4266539..210097c 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/util/DragDropFileReader.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/scripteditor/util/DragDropFileReader.java
@@ -87,7 +87,7 @@
 	// * Private method : Pre-Process for Load data
 	// *
 	private void preProcessLoadFile() {
-		scriptManager.clearData();
+		scriptManager.clear();
 		VolumeLevelCanvas.setVolumeLevelFilePath(null);
 	}
 
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/EditPanelView.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/EditPanelView.java
index d1ac3e8..9ed7354 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/EditPanelView.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/EditPanelView.java
@@ -14,9 +14,8 @@
 import org.eclipse.actf.ai.internal.ui.scripteditor.SelectWAVFileTab;
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEvent;
-import org.eclipse.actf.ai.scripteditor.data.event.ScriptEventListener;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEvent;
+import org.eclipse.actf.ai.scripteditor.data.event.ScriptDataEventListener;
 import org.eclipse.actf.ai.scripteditor.util.ScriptFileDropListener;
 import org.eclipse.actf.examples.scripteditor.Activator;
 import org.eclipse.swt.SWT;
@@ -37,7 +36,7 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.part.ViewPart;
 
-public class EditPanelView extends ViewPart implements ScriptEventListener {
+public class EditPanelView extends ViewPart implements ScriptDataEventListener {
 	public static final String VIEW_ID = "org.eclipse.actf.examples.scripteditor.EditPanelView";
 
 	static private EditPanelView ownInst = null;
@@ -52,7 +51,6 @@
 	private CTabItem instEditPanelTabItem = null;
 	private CTabItem instSelectWAVFileTabItem = null;
 	//
-	private DataEventManager dataEventManager = null;
 	private ScriptDataManager scriptDataManager = ScriptDataManager
 			.getInstance();
 
@@ -62,7 +60,6 @@
 	public EditPanelView() {
 		super();
 		ownInst = this;
-		dataEventManager = DataEventManager.getInstance();
 	}
 
 	static public EditPanelView getInstance() {
@@ -79,12 +76,11 @@
 		// Add listener for load meta file
 		initDDListener(ownTabFolder);
 
-		scriptDataManager.addGuideListEventListener(ownInst);
+		scriptDataManager.addScriptDataEventListener(ownInst);
 		parent.addDisposeListener(new DisposeListener() {
 			@Override
 			public void widgetDisposed(DisposeEvent e) {
-				// TODO other components
-				scriptDataManager.removeGuideListEventListener(ownInst);
+				scriptDataManager.removeScriptDataEventListener(ownInst);
 			}
 		});
 	}
@@ -197,8 +193,9 @@
 		}
 	}
 
-	public void handleScriptEvent(ScriptEvent e) {
-		if (e.getEventType() == ScriptEvent.SELECT_DATA) {
+	public void handleScriptEvent(ScriptDataEvent e) {
+		switch(e.getEventType()){
+		case ScriptDataEvent.SELECT:
 			IScriptData data = e.getData();
 			instEditPanelTab.setMultiSelectMode(false);
 			instEditPanelTab.repaintTextScriptData(data);
@@ -208,8 +205,18 @@
 			} else {
 				ownTabFolder.setSelection(0);
 			}
-		} else if (e.getEventType() == ScriptEvent.DESELECT_DATA) {
-			instEditPanelTab.initDispEditPanel();
+			break;
+		case ScriptDataEvent.MULTIPLE_SELECT:
+			instEditPanelTab.setMultiSelectMode(true);
+			instEditPanelTab.setCurrentListData(e.getDataCollection());			
+			break;
+		case ScriptDataEvent.DESELECT:
+			//TODO confirm?
+			instEditPanelTab.initDispEditPanel();			
+			break;
+		case ScriptDataEvent.UPDATE:
+			
+			break;
 		}
 
 	}
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/TimeLineView.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/TimeLineView.java
index fdde5a7..08abcac 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/TimeLineView.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/ai/ui/scripteditor/views/TimeLineView.java
@@ -27,8 +27,6 @@
 import org.eclipse.actf.ai.internal.ui.scripteditor.event.TimerEventListener;
 import org.eclipse.actf.ai.scripteditor.data.IScriptData;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
 import org.eclipse.actf.ai.scripteditor.util.ScriptFileDropListener;
 import org.eclipse.actf.ai.scripteditor.util.SoundMixer;
 import org.eclipse.actf.ai.scripteditor.util.VoicePlayerFactory;
@@ -123,9 +121,8 @@
 	private boolean currentDragStatus = false; // status for dragging
 
 	// for Event Managing
-	private static EventManager eventManager = null;
-	private ScriptDataManager scriptManager = null;
-	private DataEventManager dataEventManager = null;
+	private static EventManager eventManager = EventManager.getInstance();
+	private ScriptDataManager scriptManager = ScriptDataManager.getInstance();
 
 	private int captionStartTimeLine = 0;
 
@@ -142,10 +139,6 @@
 				new ScriptEditorShutdownListener());
 
 		ownInst = this;
-
-		eventManager = EventManager.getInstance();
-		scriptManager = ScriptDataManager.getInstance();
-		dataEventManager = DataEventManager.getInstance();
 	}
 
 	static public TimeLineView getInstance() {
@@ -176,7 +169,6 @@
 		parent.addDisposeListener(new DisposeListener() {
 			@Override
 			public void widgetDisposed(DisposeEvent e) {
-				// TODO other components
 				eventManager.removeSyncTimeEventListener(ownInst);
 				eventManager.removeMouseDragEventListener(ownInst);
 				eventManager.removeTimerEventListener(ownInst);
@@ -1098,9 +1090,7 @@
 				data.setEndTime(newEndTime);
 			}
 			// replace label and data.
-			dataEventManager.fireLabelEvent(new LabelEvent(
-					LabelEvent.PUT_LABEL, data, this));
-			scriptManager.fireUpdateDataEvent(data, this);
+			scriptManager.fireDataUpdateEvent(data, this);
 
 		}
 	}
@@ -1593,7 +1583,8 @@
 									currentScriptDataIndex = -1;
 
 									// Finish high-light for target
-									scriptManager.fireDeselectDataEvent(this);
+									scriptManager
+											.fireDataDeselectionEvent(this);
 								}
 							} else {
 								// increment duration counter
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/ClearAction.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/ClearAction.java
index eb713b7..42ade00 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/ClearAction.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/ClearAction.java
@@ -14,7 +14,6 @@
 import org.eclipse.actf.ai.internal.ui.scripteditor.SelectWAVFileTab;
 import org.eclipse.actf.ai.internal.ui.scripteditor.VolumeLevelCanvas;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
 import org.eclipse.actf.ai.scripteditor.util.XMLFileMessageBox;
 import org.eclipse.actf.ai.scripteditor.util.XMLFileSaveUtil;
 import org.eclipse.actf.ai.ui.scripteditor.views.EditPanelView;
@@ -32,8 +31,6 @@
 	private SelectWAVFileTab instSelWavTab = null;
 	private TimeLineView instTimeLine = null;
 
-	private DataEventManager dataEventManager = null;
-
 	public ClearAction() {
 	}
 
@@ -56,15 +53,11 @@
 		if (scriptManager == null) {
 			scriptManager = ScriptDataManager.getInstance();
 		}
-		if (dataEventManager == null) {
-			dataEventManager = DataEventManager.getInstance();
-		}
-
 	}
 
 	private void closeFile() {
 
-		scriptManager.clearData();
+		scriptManager.clear();
 
 		if (instEditPanelTab != null) {
 			instEditPanelTab.initDispEditPanel();
diff --git a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/FileOpenAction.java b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/FileOpenAction.java
index b9ba726..588541d 100644
--- a/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/FileOpenAction.java
+++ b/plugins/org.eclipse.actf.examples.scripteditor/src/org/eclipse/actf/examples/scripteditor/actions/FileOpenAction.java
@@ -13,8 +13,6 @@
 import org.eclipse.actf.ai.internal.ui.scripteditor.EditPanelTab;
 import org.eclipse.actf.ai.internal.ui.scripteditor.VolumeLevelCanvas;
 import org.eclipse.actf.ai.scripteditor.data.ScriptDataManager;
-import org.eclipse.actf.ai.scripteditor.data.event.DataEventManager;
-import org.eclipse.actf.ai.scripteditor.data.event.LabelEvent;
 import org.eclipse.actf.ai.scripteditor.reader.SAXReader;
 import org.eclipse.actf.ai.scripteditor.util.WebBrowserFactory;
 import org.eclipse.actf.ai.scripteditor.util.XMLFileMessageBox;
@@ -32,7 +30,6 @@
 public class FileOpenAction implements IWorkbenchWindowActionDelegate {
 
 	private ScriptDataManager scriptManager = null;
-	private DataEventManager dataEventManager = null;
 	private EditPanelTab instEditPanelTab = null;
 	private TimeLineView instTimeLine = null;
 
@@ -56,19 +53,14 @@
 		if (scriptManager == null) {
 			scriptManager = ScriptDataManager.getInstance();
 		}
-		if (dataEventManager == null) {
-			dataEventManager = DataEventManager.getInstance();
-		}
 	}
 
 	private void preProcess() {
 		VolumeLevelCanvas.setVolumeLevelFilePath(null);
-		scriptManager.clearData();
+		scriptManager.clear();
 	}
 
 	private void postProcess() {
-		dataEventManager.fireLabelEvent(new LabelEvent(
-				LabelEvent.PUT_ALL_LABEL, null, this));
 
 		if (instEditPanelTab != null) {
 			instEditPanelTab.initDispEditPanel();
