diff --git a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/util/VisualizeReportUtil.java b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/util/VisualizeReportUtil.java
index 0227ee5..9ae2edb 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/util/VisualizeReportUtil.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/util/VisualizeReportUtil.java
@@ -22,7 +22,7 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import org.eclipse.actf.util.xpath.XPathUtil;
+import org.eclipse.actf.util.xpath.XPathServiceFactory;
 import org.eclipse.actf.visualization.engines.blind.eval.PageEvaluation;
 import org.eclipse.actf.visualization.engines.blind.html.VisualizeEngine;
 import org.eclipse.actf.visualization.eval.guideline.GuidelineHolder;
@@ -165,9 +165,11 @@
 			String idS = frameElem.getAttribute(Html2ViewMapData.ACTF_ID);
 			if (idS.length() > 0) {
 				Integer idObj = new Integer(idS);
-				NodeList nl = XPathUtil.evalXPathNodeList(resultDoc
-						.getDocumentElement(), "//*[@"
-						+ Html2ViewMapData.ACTF_ID + "='" + idObj + "']/span");
+				NodeList nl = XPathServiceFactory.newService()
+						.evalPathForNodeList(
+								"//*[@" + Html2ViewMapData.ACTF_ID + "='"
+										+ idObj + "']/span",
+								resultDoc.getDocumentElement());
 				if ((nl != null) && (nl.getLength() == 1)) {
 					Element frameElemResultDoc = (Element) nl.item(0);
 					Element img = createErrorImageElement(frameElemResultDoc,
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java b/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java
index 258191c..2ecf658 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java
@@ -15,52 +15,57 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.actf.util.xpath.XPathUtil;
+import org.eclipse.actf.util.xpath.XPathService;
+import org.eclipse.actf.util.xpath.XPathServiceFactory;
 import org.eclipse.actf.visualization.eval.EvaluationResultImpl;
 import org.eclipse.actf.visualization.eval.guideline.GuidelineHolder;
 import org.eclipse.actf.visualization.eval.problem.IProblemItem;
 import org.w3c.dom.NodeList;
 
-
-
 public class EvaluationResultBlind extends EvaluationResultImpl {
 
-    private int count = 0;
-    
-    public void addProblemItems(Collection<IProblemItem> c) {
-        stripProblem(c);
-        super.addProblemItems(c);
-    }
+	private static final XPathService xpathService = XPathServiceFactory
+			.newService();
+	private static final Object EXP1 = xpathService
+			.compile("ancestor::noscript");
 
-    public void setProblemList(List<IProblemItem> problemList) {
-        count = 0;
-        stripProblem(problemList);
-        super.setProblemList(problemList);
-    }
+	private int count = 0;
 
-    private void stripProblem(Collection<IProblemItem> c){
-        GuidelineHolder holder = GuidelineHolder.getInstance();
-        for (Iterator<IProblemItem> i = c.iterator(); i.hasNext();) {
-            try {
-                IProblemItem tmpItem = (IProblemItem) i.next();
-                if (holder.isMatchedCheckItem(tmpItem.getEvaluationItem())) {
-                    tmpItem.setSerialNumber(count);
-                    if (tmpItem.isCanHighlight() && tmpItem.getTargetNode() != null) {
-                        NodeList tmpNL = XPathUtil.evalXPathNodeList(tmpItem.getTargetNode(), "ancestor::noscript");
-                        // noframes can highlight
-                        if (tmpNL != null && tmpNL.getLength() > 0) {
-                            tmpItem.setCanHighlight(false);
-                        }
-                    }
-                    count++;
-                } else {
-                    i.remove();
-                }
-            } catch (Exception e) {
-                // e.printStackTrace();
-                i.remove();
-            }
-        }
-    }
-    
+	public void addProblemItems(Collection<IProblemItem> c) {
+		stripProblem(c);
+		super.addProblemItems(c);
+	}
+
+	public void setProblemList(List<IProblemItem> problemList) {
+		count = 0;
+		stripProblem(problemList);
+		super.setProblemList(problemList);
+	}
+
+	private void stripProblem(Collection<IProblemItem> c) {
+		GuidelineHolder holder = GuidelineHolder.getInstance();
+		for (Iterator<IProblemItem> i = c.iterator(); i.hasNext();) {
+			try {
+				IProblemItem tmpItem = (IProblemItem) i.next();
+				if (holder.isMatchedCheckItem(tmpItem.getEvaluationItem())) {
+					tmpItem.setSerialNumber(count);
+					if (tmpItem.isCanHighlight()
+							&& tmpItem.getTargetNode() != null) {
+						NodeList tmpNL = xpathService.evalForNodeList(EXP1,
+								tmpItem.getTargetNode());
+						// noframes can highlight
+						if (tmpNL != null && tmpNL.getLength() > 0) {
+							tmpItem.setCanHighlight(false);
+						}
+					}
+					count++;
+				} else {
+					i.remove();
+				}
+			} catch (Exception e) {
+				// e.printStackTrace();
+				i.remove();
+			}
+		}
+	}
 }
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
index 007d7e8..389452c 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
@@ -20,7 +20,8 @@
 import java.util.TreeSet;
 import java.util.Vector;
 
-import org.eclipse.actf.util.xpath.XPathUtil;
+import org.eclipse.actf.util.xpath.XPathService;
+import org.eclipse.actf.util.xpath.XPathServiceFactory;
 import org.eclipse.actf.visualization.eval.EvaluationUtil;
 import org.eclipse.actf.visualization.eval.html.statistics.FlashData;
 import org.eclipse.actf.visualization.eval.html.statistics.HeadingsData;
@@ -57,6 +58,13 @@
 	public static final String[] EVENT_FOCUS = { ATTR_ONFOCUS, ATTR_ONBLUR,
 			ATTR_ONSELECT };
 
+	private static final XPathService xpathService = XPathServiceFactory
+			.newService();
+	private static final Object EXP1 = xpathService.compile(".//a[@"
+			+ ATTR_HREF + "]");
+	private static final Object EXP2 = xpathService
+			.compile("//h1|//h2|//h3|//h4|//h5|//h6");
+
 	private Document target;
 
 	private Document resultDoc;
@@ -144,8 +152,8 @@
 	private HashSet<String> notExistHrefSet = new HashSet<String>();
 
 	public HtmlEvalUtil(Document target, Document resultDoc, String curUrl,
-			Map<Node, Integer> document2IdMap, Document origDom, Document ieDom,
-			PageData pageData, boolean isDBCS, boolean isIEDom) {
+			Map<Node, Integer> document2IdMap, Document origDom,
+			Document ieDom, PageData pageData, boolean isDBCS, boolean isIEDom) {
 		this(target, resultDoc, curUrl, document2IdMap, origDom, ieDom,
 				pageData, 0, null, isDBCS, isIEDom);
 	}
@@ -154,8 +162,8 @@
 	 * 
 	 */
 	public HtmlEvalUtil(Document target, Document resultDoc, String curUrl,
-			Map<Node, Integer> document2IdMap, Document origDom, Document ieDom,
-			PageData pageData, int invisibleElementCount,
+			Map<Node, Integer> document2IdMap, Document origDom,
+			Document ieDom, PageData pageData, int invisibleElementCount,
 			String[] invisibleLinkStrings, boolean isDBCS, boolean isIEDom) {
 		this.target = target;
 		this.resultDoc = resultDoc;
@@ -189,8 +197,7 @@
 		// System.out.println(df.format(new Date(System.currentTimeMillis()))
 		// + ": checker engine init");
 
-		NodeList tmpNL = XPathUtil.evalXPathNodeList(target, ".//" + "a"
-				+ ("[@" + ATTR_HREF + "]"));
+		NodeList tmpNL = xpathService.evalForNodeList(EXP1, target);
 		int length = tmpNL.getLength();
 
 		if (length > 0) {
@@ -338,10 +345,9 @@
 			}
 		}
 
-		NodeList headingsNL = XPathUtil.evalXPathNodeList(target,
-				"//h1|//h2|//h3|//h4|//h5|//h6");
+		NodeList headingsNL = xpathService.evalForNodeList(EXP2, target);
 		length = headingsNL.getLength();
-		Vector<HeadingsData>tmpV2 = new Vector<HeadingsData>();
+		Vector<HeadingsData> tmpV2 = new Vector<HeadingsData>();
 		headings = new Element[headingsNL.getLength()];
 		for (int i = 0; i < length; i++) {
 			Element tmpE = (Element) headingsNL.item(i);
@@ -365,7 +371,7 @@
 	}
 
 	private Element[] getElementsArrayByXPath(Document target, String xpath) {
-		NodeList tmpNL = XPathUtil.evalXPathNodeList(target, xpath);
+		NodeList tmpNL = xpathService.evalPathForNodeList(xpath, target);
 		int length = tmpNL.getLength();
 		Element[] result = new Element[length];
 		for (int i = 0; i < length; i++) {
@@ -435,7 +441,7 @@
 
 		if (EvaluationUtil.isOriginalDOM()) {
 			// target = orig DOM
-			if (isIEDom||null==ieDom) {
+			if (isIEDom || null == ieDom) {
 				// parse error
 				return;
 			}
@@ -444,8 +450,7 @@
 					.asList(aWithHref_hrefs));
 			// trim()?
 
-			NodeList ieNL = XPathUtil.evalXPathNodeList(ieDom, ".//" + "a"
-					+ ("[@" + ATTR_HREF + "]"));
+			NodeList ieNL = xpathService.evalForNodeList(EXP1, ieDom);
 			int size = ieNL.getLength();
 			for (int i = 0; i < size; i++) {
 				Element tmpE = (Element) ieNL.item(i);
@@ -456,8 +461,7 @@
 			}
 		} else {
 			// target = IE DOM
-			NodeList orgNL = XPathUtil.evalXPathNodeList(origDom, ".//" + "a"
-					+ ("[@" + ATTR_HREF + "]"));
+			NodeList orgNL = xpathService.evalForNodeList(EXP1, origDom);
 			int size = orgNL.getLength();
 			TreeSet<String> existSet = new TreeSet<String>();
 			for (int i = 0; i < size; i++) {
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/FlashData.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/FlashData.java
index 4892321..2934b78 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/FlashData.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/FlashData.java
@@ -11,7 +11,7 @@
 
 package org.eclipse.actf.visualization.eval.html.statistics;
 
-import org.eclipse.actf.util.xpath.XPathUtil;
+import org.eclipse.actf.visualization.internal.eval.XMLStringUtil;
 
 public class FlashData implements IPageStatisticsTag {
 
@@ -196,7 +196,7 @@
 
 	public String getItemXML() {
 		StringBuffer tmpSB = new StringBuffer("<" + FLASH + " " + SRC + "=\""
-				+ XPathUtil.canonicalize(src) + "\" "
+				+ XMLStringUtil.canonicalize(src) + "\" "
 				+ FlashData.FLASH_IS_OBJECT + "=\"" + isObject + "\" ");
 		if (isObject && withEmbed) {
 			tmpSB.append(FlashData.FLASH_WITHEMBED + "=\"true\" ");
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/HeadingsData.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/HeadingsData.java
index 8d530aa..d43388b 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/HeadingsData.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/HeadingsData.java
@@ -12,7 +12,7 @@
 package org.eclipse.actf.visualization.eval.html.statistics;
 
 import org.eclipse.actf.util.xpath.XPathCreator;
-import org.eclipse.actf.util.xpath.XPathUtil;
+import org.eclipse.actf.visualization.internal.eval.XMLStringUtil;
 import org.w3c.dom.Element;
 import org.xml.sax.Attributes;
 
@@ -75,7 +75,7 @@
 	}
 
 	private String getAttr(String name, String value) {
-		return ((name + "=\"" + XPathUtil.canonicalize(value) + "\" "));
+		return ((name + "=\"" + XMLStringUtil.canonicalize(value) + "\" "));
 	}
 
 	public String getItemXML() {
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
index cb8d642..921ef0b 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
@@ -15,262 +15,267 @@
 import java.util.Vector;
 
 import org.eclipse.actf.util.FileUtils;
-import org.eclipse.actf.util.xpath.XPathUtil;
+import org.eclipse.actf.util.xpath.XPathService;
+import org.eclipse.actf.util.xpath.XPathServiceFactory;
 import org.eclipse.actf.visualization.eval.problem.IProblemItem;
 import org.eclipse.actf.visualization.eval.problem.ProblemItemImpl;
+import org.eclipse.actf.visualization.internal.eval.XMLStringUtil;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.html.HTMLAnchorElement;
 import org.w3c.dom.html.HTMLImageElement;
 import org.xml.sax.Attributes;
 
-
-
 public class ImageStatData implements IPageStatisticsTag {
 
 	public static final String ISMAP = "ismap";
 
-	public static final String USEMAP ="usemap";
+	public static final String USEMAP = "usemap";
 
 	public static final String LONGDESC = "longdesc";
 
-	
-    protected String altS = "";
+	private static final XPathService xpathService = XPathServiceFactory
+			.newService();
+	private static final Object EXP1 = xpathService.compile("ancestor::a");
 
-    protected Element ancestorLink = null;
+	protected String altS = "";
 
-    protected String destUrlS = "";
+	protected Element ancestorLink = null;
 
-    protected boolean hasAlt = false;
+	protected String destUrlS = "";
 
-    protected boolean hasHeight = false;
+	protected boolean hasAlt = false;
 
-    protected boolean hasLongDesc = false;
+	protected boolean hasHeight = false;
 
-    protected boolean hasUseMap = false;
+	protected boolean hasLongDesc = false;
 
-    protected boolean hasWidth = false;
+	protected boolean hasUseMap = false;
 
-    protected String heightS = "";
+	protected boolean hasWidth = false;
 
-    protected boolean isInLink = false;
+	protected String heightS = "";
 
-    protected boolean isMap = false;
+	protected boolean isInLink = false;
 
-    protected String longDescS = "";
+	protected boolean isMap = false;
 
-    // for problem statistics
-    protected Vector<IProblemItem> problemV = new Vector<IProblemItem>();
+	protected String longDescS = "";
 
-    protected String srcS = "";
+	// for problem statistics
+	protected Vector<IProblemItem> problemV = new Vector<IProblemItem>();
 
-    protected String urlS = "";
+	protected String srcS = "";
 
-    protected String useMapS = "";
+	protected String urlS = "";
 
-    protected String widthS = "";
+	protected String useMapS = "";
 
+	protected String widthS = "";
 
-    protected ImageStatData() {
-    }
+	protected ImageStatData() {
+	}
 
-    /**
-     * @param tagName
-     * @param text
-     */
-    public ImageStatData(HTMLImageElement target, URL baseURL) {
+	/**
+	 * @param tagName
+	 * @param text
+	 */
+	public ImageStatData(HTMLImageElement target, URL baseURL) {
 
-        srcS = target.getSrc();
-        urlS = srcS;
-        try {
-            urlS = new URL(baseURL, urlS).toString();
-        } catch (Exception e) {
-        }
+		srcS = target.getSrc();
+		urlS = srcS;
+		try {
+			urlS = new URL(baseURL, urlS).toString();
+		} catch (Exception e) {
+		}
 
-        //System.out.println(urlS);
+		// System.out.println(urlS);
 
-        if (hasAlt = target.hasAttribute(ALT)) {
-            altS = target.getAlt();
-        }
-        if (hasLongDesc = target.hasAttribute(ImageStatData.LONGDESC)) {
-            longDescS = target.getLongDesc();
-        }
-        if (hasUseMap = target.hasAttribute(ImageStatData.USEMAP)) {
-            useMapS = target.getUseMap();
-        }
+		if (hasAlt = target.hasAttribute(ALT)) {
+			altS = target.getAlt();
+		}
+		if (hasLongDesc = target.hasAttribute(ImageStatData.LONGDESC)) {
+			longDescS = target.getLongDesc();
+		}
+		if (hasUseMap = target.hasAttribute(ImageStatData.USEMAP)) {
+			useMapS = target.getUseMap();
+		}
 
-        if (hasWidth = target.hasAttribute(WIDTH)) {
-            widthS = target.getWidth();
-        }
+		if (hasWidth = target.hasAttribute(WIDTH)) {
+			widthS = target.getWidth();
+		}
 
-        if (hasHeight = target.hasAttribute(HEIGHT)) {
-            heightS = target.getHeight();
-        }
+		if (hasHeight = target.hasAttribute(HEIGHT)) {
+			heightS = target.getHeight();
+		}
 
-        isMap = target.getIsMap();
+		isMap = target.getIsMap();
 
-        NodeList tmpNL = XPathUtil.evalXPathNodeList(target, "ancestor::a");
-        //XPathUtil.showNodeList(tmpNL,true);
-        int len = tmpNL.getLength();
-        if (len > 0) {
-            HTMLAnchorElement tmpE = (HTMLAnchorElement) tmpNL.item(0);
-            if (isInLink = tmpE.hasAttribute(HREF)) {
-                destUrlS = tmpE.getHref();
-                ancestorLink = tmpE;
-                try {
-                    destUrlS = new URL(baseURL, destUrlS).toString();
-                } catch (Exception e) {
-                }
-            }
-        }
-    }
+		NodeList tmpNL = xpathService.evalForNodeList(EXP1, target);
+		// XPathUtil.showNodeList(tmpNL,true);
+		int len = tmpNL.getLength();
+		if (len > 0) {
+			HTMLAnchorElement tmpE = (HTMLAnchorElement) tmpNL.item(0);
+			if (isInLink = tmpE.hasAttribute(HREF)) {
+				destUrlS = tmpE.getHref();
+				ancestorLink = tmpE;
+				try {
+					destUrlS = new URL(baseURL, destUrlS).toString();
+				} catch (Exception e) {
+				}
+			}
+		}
+	}
 
-    public void addProblemItem(Attributes atts) throws StatisticsDataFormatException {
-        String idS = atts.getValue(ID);
-        String targetS = atts.getValue(TARGET_STRING);
+	public void addProblemItem(Attributes atts)
+			throws StatisticsDataFormatException {
+		String idS = atts.getValue(ID);
+		String targetS = atts.getValue(TARGET_STRING);
 
-        if (idS != null) {
-            IProblemItem tmpItem = new ProblemItemImpl(idS);
-            if (!tmpItem.getId().equals("unknown")) {
-                if (targetS != null) {
-                    tmpItem.setTargetStringForHPB(targetS);
-                }
-                addProblemItem(tmpItem);
-                return;
-            }
-        }
-        throw new StatisticsDataFormatException();
-    }
+		if (idS != null) {
+			IProblemItem tmpItem = new ProblemItemImpl(idS);
+			if (!tmpItem.getId().equals("unknown")) {
+				if (targetS != null) {
+					tmpItem.setTargetStringForHPB(targetS);
+				}
+				addProblemItem(tmpItem);
+				return;
+			}
+		}
+		throw new StatisticsDataFormatException();
+	}
 
-    public void addProblemItem(IProblemItem problemItem) {
-        problemV.add(problemItem);
-    }
+	public void addProblemItem(IProblemItem problemItem) {
+		problemV.add(problemItem);
+	}
 
-    public String getAltS() {
-        return this.altS;
-    }
+	public String getAltS() {
+		return this.altS;
+	}
 
-    public Element getAncestorLink() {
-        return ancestorLink;
-    }
+	public Element getAncestorLink() {
+		return ancestorLink;
+	}
 
-    private String getAttr(String name, boolean value) {
-        return (getAttr(name, Boolean.toString(value)));
-    }
+	private String getAttr(String name, boolean value) {
+		return (getAttr(name, Boolean.toString(value)));
+	}
 
-    private String getAttr(String name, String value) {
-        return ((name + "=\"" + XPathUtil.canonicalize(value) + "\" "));
-    }
+	private String getAttr(String name, String value) {
+		return ((name + "=\"" + XMLStringUtil.canonicalize(value) + "\" "));
+	}
 
-    public String getDestUrlS() {
-        return destUrlS;
-    }
+	public String getDestUrlS() {
+		return destUrlS;
+	}
 
-    public String getHeightS() {
-        return heightS;
-    }
+	public String getHeightS() {
+		return heightS;
+	}
 
-    public String getItemXML() {
-        StringBuffer tmpSB = new StringBuffer("<" + IMAGE + " " + getAttr(SRC, srcS) + getAttr(URL, urlS)
-                + getAttr(ImageStatData.ISMAP, isMap));
-        if (hasAlt) {
-            tmpSB.append(getAttr(ALT, altS));
-        }
-        if (hasWidth) {
-            tmpSB.append(getAttr(WIDTH, widthS));
-        }
-        if (hasHeight) {
-            tmpSB.append(getAttr(HEIGHT, heightS));
-        }
-        if (isInLink) {
-            tmpSB.append(getAttr(DEST, destUrlS));
-        }
-        if (hasLongDesc) {
-            tmpSB.append(getAttr(ImageStatData.LONGDESC, longDescS));
-        }
-        if (hasUseMap) {
-            tmpSB.append(getAttr(ImageStatData.USEMAP, useMapS));
-        }
-        int size = problemV.size();
-        if (size == 0) {
-            tmpSB.append(" />");
-        } else {
-            tmpSB.append(" >" + FileUtils.LINE_SEP);
-            for (int i = 0; i < size; i++) {
-                IProblemItem pItem = (IProblemItem) problemV.get(i);
-                tmpSB.append("<" + ERROR + " " + getAttr(ID, pItem.getId())
-                        + getAttr(TARGET_STRING, pItem.getTargetStringForHPB()) + " />" + FileUtils.LINE_SEP);
-            }
-            tmpSB.append("</" + IMAGE + ">");
-        }
-        return (tmpSB.toString());
-    }
+	public String getItemXML() {
+		StringBuffer tmpSB = new StringBuffer("<" + IMAGE + " "
+				+ getAttr(SRC, srcS) + getAttr(URL, urlS)
+				+ getAttr(ImageStatData.ISMAP, isMap));
+		if (hasAlt) {
+			tmpSB.append(getAttr(ALT, altS));
+		}
+		if (hasWidth) {
+			tmpSB.append(getAttr(WIDTH, widthS));
+		}
+		if (hasHeight) {
+			tmpSB.append(getAttr(HEIGHT, heightS));
+		}
+		if (isInLink) {
+			tmpSB.append(getAttr(DEST, destUrlS));
+		}
+		if (hasLongDesc) {
+			tmpSB.append(getAttr(ImageStatData.LONGDESC, longDescS));
+		}
+		if (hasUseMap) {
+			tmpSB.append(getAttr(ImageStatData.USEMAP, useMapS));
+		}
+		int size = problemV.size();
+		if (size == 0) {
+			tmpSB.append(" />");
+		} else {
+			tmpSB.append(" >" + FileUtils.LINE_SEP);
+			for (int i = 0; i < size; i++) {
+				IProblemItem pItem = (IProblemItem) problemV.get(i);
+				tmpSB.append("<" + ERROR + " " + getAttr(ID, pItem.getId())
+						+ getAttr(TARGET_STRING, pItem.getTargetStringForHPB())
+						+ " />" + FileUtils.LINE_SEP);
+			}
+			tmpSB.append("</" + IMAGE + ">");
+		}
+		return (tmpSB.toString());
+	}
 
-    public String getLongDescS() {
-        return longDescS;
-    }
+	public String getLongDescS() {
+		return longDescS;
+	}
 
-    public Vector<IProblemItem> getProblemV() {
-        return this.problemV;
-    }
+	public Vector<IProblemItem> getProblemV() {
+		return this.problemV;
+	}
 
-    public String getSrcS() {
-        return srcS;
-    }
+	public String getSrcS() {
+		return srcS;
+	}
 
-    public String getUrlS() {
-        return this.urlS;
-    }
+	public String getUrlS() {
+		return this.urlS;
+	}
 
-    public String getUseMapS() {
-        return useMapS;
-    }
+	public String getUseMapS() {
+		return useMapS;
+	}
 
-    public String getWidthS() {
-        return widthS;
-    }
+	public String getWidthS() {
+		return widthS;
+	}
 
-    public boolean isHasAlt() {
-        return this.hasAlt;
-    }
+	public boolean isHasAlt() {
+		return this.hasAlt;
+	}
 
-    public boolean isHasHeight() {
-        return hasHeight;
-    }
+	public boolean isHasHeight() {
+		return hasHeight;
+	}
 
-    public boolean isHasLongDesc() {
-        return hasLongDesc;
-    }
+	public boolean isHasLongDesc() {
+		return hasLongDesc;
+	}
 
-    public boolean isHasUseMap() {
-        return hasUseMap;
-    }
+	public boolean isHasUseMap() {
+		return hasUseMap;
+	}
 
-    public boolean isHasWidth() {
-        return hasWidth;
-    }
+	public boolean isHasWidth() {
+		return hasWidth;
+	}
 
-    public boolean isInLink() {
-        return isInLink;
-    }
+	public boolean isInLink() {
+		return isInLink;
+	}
 
-    public boolean isMap() {
-        return isMap;
-    }
+	public boolean isMap() {
+		return isMap;
+	}
 
-    public void setHasHeight(boolean hasHeight) {
-        this.hasHeight = hasHeight;
-    }
+	public void setHasHeight(boolean hasHeight) {
+		this.hasHeight = hasHeight;
+	}
 
-    public void setHasWidth(boolean hasWidth) {
-        this.hasWidth = hasWidth;
-    }
+	public void setHasWidth(boolean hasWidth) {
+		this.hasWidth = hasWidth;
+	}
 
-    public void setHeightS(String heightS) {
-        this.heightS = heightS;
-    }
+	public void setHeightS(String heightS) {
+		this.heightS = heightS;
+	}
 
-    public void setWidthS(String widthS) {
-        this.widthS = widthS;
-    }
+	public void setWidthS(String widthS) {
+		this.widthS = widthS;
+	}
 }
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/PageData.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/PageData.java
index 2e0ed65..65b48f1 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/PageData.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/PageData.java
@@ -16,9 +16,9 @@
 import java.util.Vector;
 
 import org.eclipse.actf.util.FileUtils;
-import org.eclipse.actf.util.xpath.XPathUtil;
 import org.eclipse.actf.visualization.eval.problem.IProblemItem;
 import org.eclipse.actf.visualization.eval.problem.IProblemItemVisitor;
+import org.eclipse.actf.visualization.internal.eval.XMLStringUtil;
 import org.w3c.dom.Element;
 import org.w3c.dom.html.HTMLImageElement;
 
@@ -153,7 +153,7 @@
 	}
 
 	private String getAttr(String name, String value) {
-		return ((name + "=\"" + XPathUtil.canonicalize(value) + "\" "));
+		return ((name + "=\"" + XMLStringUtil.canonicalize(value) + "\" "));
 	}
 
 	public int getSkipMainNum() {
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/internal/eval/XMLStringUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/internal/eval/XMLStringUtil.java
new file mode 100644
index 0000000..2035fba
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/internal/eval/XMLStringUtil.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 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:
+ *    Shin SAITO - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.actf.visualization.internal.eval;
+
+
+/**
+ * Utility class to canonicalize String 
+ */
+public class XMLStringUtil {
+
+
+	/**
+	 * Canonicalize target String
+	 * 
+	 * @param targetS
+	 *            the target String
+	 * @return canonicalized String
+	 */
+	public static String canonicalize(String targetS) {
+		return (targetS.replaceAll("\\p{Cntrl}", "").replaceAll("&", "&amp;")
+				.replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll(
+						"\"", "&quot;").replaceAll("\'", "&apos;"));
+	}
+
+}
