diff --git a/plugins/org.eclipse.actf.util.jxpath/.classpath b/plugins/org.eclipse.actf.util.jxpath/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.actf.util.jxpath/.project b/plugins/org.eclipse.actf.util.jxpath/.project
deleted file mode 100644
index 04d59b9..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.actf.util.jxpath</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/plugins/org.eclipse.actf.util.jxpath/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.actf.util.jxpath/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5868a05..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Tue Jan 06 15:32:30 JST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/plugins/org.eclipse.actf.util.jxpath/META-INF/MANIFEST.MF b/plugins/org.eclipse.actf.util.jxpath/META-INF/MANIFEST.MF
deleted file mode 100644
index 3811036..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: ACTF JXPath Fragment
-Bundle-SymbolicName: org.eclipse.actf.util.jxpath;singleton:=true
-Bundle-Version: 0.5.0.qualifier
-Fragment-Host: org.eclipse.actf.core
-Require-Bundle: org.eclipse.core.runtime,
- org.apache.commons.jxpath
-Bundle-ActivationPolicy: lazy
-Bundle-ClassPath: .
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.actf.util.jxpath/about.html b/plugins/org.eclipse.actf.util.jxpath/about.html
deleted file mode 100644
index 481dbcf..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/about.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>June 5, 2006</p>	
-<h3>License</h3>
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  
-Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor&rsquo;s license 
-that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.actf.util.jxpath/about_files/asl-v20.txt b/plugins/org.eclipse.actf.util.jxpath/about_files/asl-v20.txt
deleted file mode 100644
index d645695..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/about_files/asl-v20.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/plugins/org.eclipse.actf.util.jxpath/build.properties b/plugins/org.eclipse.actf.util.jxpath/build.properties
deleted file mode 100644
index e6e7c5e..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 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
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               about_files/,\
-               about.html
-src.includes = about_files/,\
-               about.html
diff --git a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodeIterator.java b/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodeIterator.java
deleted file mode 100644
index d8cec19..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodeIterator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 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:
- *    Hisashi MIYASHITA - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.actf.util.jxpath;
-
-import org.apache.commons.jxpath.ri.compiler.NodeTest;
-import org.apache.commons.jxpath.ri.model.NodePointer;
-import org.apache.commons.jxpath.ri.model.dom.DOMNodeIterator;
-import org.apache.commons.jxpath.ri.model.dom.DOMNodePointer;
-
-
-
-public class DOMExNodeIterator extends DOMNodeIterator {
-    DOMExNodeIterator(NodePointer parent,
-                      NodeTest test,
-                      boolean reverse,
-                      NodePointer startWith) {
-        super(parent, test, reverse, startWith);
-    }
-
-    @Override
-    public NodePointer getNodePointer() {
-        DOMNodePointer ptOrg = (DOMNodePointer) super.getNodePointer();
-        return new DOMExNodePointer(ptOrg);
-    }
-}
diff --git a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodePointer.java b/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodePointer.java
deleted file mode 100644
index 02b2c9a..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodePointer.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 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:
- *    Hisashi MIYASHITA - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.actf.util.jxpath;
-
-import java.util.Locale;
-
-import org.apache.commons.jxpath.JXPathContext;
-import org.apache.commons.jxpath.Pointer;
-import org.apache.commons.jxpath.ri.Compiler;
-import org.apache.commons.jxpath.ri.compiler.NodeNameTest;
-import org.apache.commons.jxpath.ri.compiler.NodeTest;
-import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
-import org.apache.commons.jxpath.ri.model.NodeIterator;
-import org.apache.commons.jxpath.ri.model.NodePointer;
-import org.apache.commons.jxpath.ri.model.beans.NullPointer;
-import org.apache.commons.jxpath.ri.model.dom.DOMNodePointer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-
-public class DOMExNodePointer extends DOMNodePointer {
-    private static final long serialVersionUID = 7107226604740248209L;
-
-    private Node getDOMNode() {
-        return (Node) getImmediateNode();
-    }
-
-    public DOMExNodePointer(Node node, Locale locale) {
-        super(node, locale);
-    }
-
-    public DOMExNodePointer(Node node, Locale locale, String id) {
-        super(node, locale, id);
-    }
-
-    public DOMExNodePointer(NodePointer parent, Node node) {
-        super(parent, node);
-    }
-
-    public DOMExNodePointer(DOMNodePointer ptOrg) {
-        super(ptOrg.getParent(), (Node) ptOrg.getImmediateNode());
-    }
-    
-    /********************************************************************************
-            Overriding Methods.
-    ********************************************************************************/
-
-    @Override
-    public boolean testNode(NodeTest test) {
-        if (test instanceof NodeTypeTest) {
-            NodeTypeTest ntt = (NodeTypeTest) test;
-            if (ntt.getNodeType()  == Compiler.NODE_TYPE_NODE)
-                return true;
-        } else if (test instanceof NodeNameTest) {
-            NodeNameTest nnt = (NodeNameTest) test;
-            String nsTest = nnt.getNamespaceURI();
-            if (nsTest == null) {
-                test = new NodeNameTest(nnt.getNodeName(), ""); //$NON-NLS-1$
-            }
-        }
-        return super.testNode(test);
-    }
-
-    @Override
-    public Pointer getPointerByID(JXPathContext context, String id) {
-        Node node = getDOMNode();
-        Document doc = node.getOwnerDocument();
-        Element element = doc.getElementById(id);
-        if (element == null) {
-            return new NullPointer(getLocale(), id);
-        }
-        return new DOMExNodePointer(element, getLocale(), id);
-    }
-
-    @Override
-    public NodePointer getParent() {
-        NodePointer pointer = getImmediateParentPointer();
-        while (pointer != null && pointer.isContainer()) {
-            pointer = pointer.getImmediateParentPointer();
-        }
-        return pointer;
-    }
-
-    @Override
-    public NodePointer getImmediateParentPointer() {
-        if (parent != null) return parent;
-        Node node = getDOMNode();
-        Node parentNode = node.getParentNode();
-        if (parentNode == null) return null;
-        return new DOMExNodePointer(parentNode, getLocale());
-    }
-    
-    @Override
-    public Object getRootNode() {
-        Node node = getDOMNode();
-        return node.getOwnerDocument();
-    }
-    
-    @Override
-    public NodeIterator childIterator(NodeTest test,
-                                      boolean reverse,
-                                      NodePointer startWith) {
-        if (test instanceof NodeNameTest) {
-            NodeNameTest nnt = (NodeNameTest) test;
-            String nsTest = nnt.getNamespaceURI();
-            if (nsTest == null) {
-                test = new NodeNameTest(nnt.getNodeName(), ""); //$NON-NLS-1$
-            }
-        }
-        return new DOMExNodeIterator(this, test, reverse, startWith);
-    }
-
-    @Override
-    public String getNamespaceURI() {
-        Node node = getDOMNode();
-        String ns = node.getNamespaceURI();
-        // Treat the default namespace, "", as null.
-        if (ns.length() == 0) return null;
-        return ns;
-    }
-}
diff --git a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodePointerFactory.java b/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodePointerFactory.java
deleted file mode 100644
index 75553bf..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/DOMExNodePointerFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 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:
- *    Hisashi MIYASHITA - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.actf.util.jxpath;
-
-import java.util.Locale;
-
-import org.apache.commons.jxpath.ri.JXPathContextReferenceImpl;
-import org.apache.commons.jxpath.ri.QName;
-import org.apache.commons.jxpath.ri.model.NodePointer;
-import org.apache.commons.jxpath.ri.model.NodePointerFactory;
-import org.w3c.dom.Node;
-
-
-
-public class DOMExNodePointerFactory implements NodePointerFactory {
-    public static void initialize() {
-        JXPathContextReferenceImpl.addNodePointerFactory(new DOMExNodePointerFactory());
-    }
-
-    private static final int FACTORY_ORDER = 0;
-    public int getOrder() {
-        return FACTORY_ORDER;
-    }
-
-    public NodePointer createNodePointer(QName name,
-                                         Object nodeObj,
-                                         Locale locale) {
-        if (!(nodeObj instanceof Node)) return null;
-        Node node = (Node) nodeObj;
-        return new DOMExNodePointer(node, locale);
-    }
-
-    public NodePointer createNodePointer(NodePointer parent,
-                                         QName name,
-                                         Object nodeObj) {
-        if (!(nodeObj instanceof Node)) return null;
-        Node node = (Node) nodeObj;
-        return new DOMExNodePointer(parent, node);
-    }
-    
-    private DOMExNodePointerFactory() {
-    }
-}
-    
-
diff --git a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/XPathServiceFactoryImpl.java b/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/XPathServiceFactoryImpl.java
deleted file mode 100644
index b13cc39..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/XPathServiceFactoryImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 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:
- *    Hisashi MIYASHITA - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.actf.util.jxpath;
-
-import org.eclipse.actf.util.xpath.XPathService;
-import org.eclipse.actf.util.xpath.XPathServiceFactory;
-
-
-
-public class XPathServiceFactoryImpl extends XPathServiceFactory {
-    private static XPathService xpathServiceInstance;
-
-    @Override
-    protected XPathService getService() {
-        return xpathServiceInstance;
-    }
-
-    public static XPathServiceFactory newInstance() {
-        if (xpathServiceInstance == null) {
-            xpathServiceInstance = XPathServiceImpl.newInstance();
-            if (xpathServiceInstance == null) return null;
-        }
-        return new XPathServiceFactoryImpl();
-    }
-    
-    private XPathServiceFactoryImpl() {
-        
-    }
-}
diff --git a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/XPathServiceImpl.java b/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/XPathServiceImpl.java
deleted file mode 100644
index 9a02486..0000000
--- a/plugins/org.eclipse.actf.util.jxpath/src/org/eclipse/actf/util/jxpath/XPathServiceImpl.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 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:
- *    Hisashi MIYASHITA - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.actf.util.jxpath;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.jxpath.CompiledExpression;
-import org.apache.commons.jxpath.JXPathContext;
-import org.apache.commons.jxpath.Pointer;
-import org.eclipse.actf.util.dom.EmptyNodeListImpl;
-import org.eclipse.actf.util.xpath.XPathService;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-
-
-class XPathServiceImpl extends XPathService {
-    static {
-        DOMExNodePointerFactory.initialize();
-    }
-
-    @Override
-    public Object compile(String path) {
-        return JXPathContext.compile(path);
-    }
-
-    private static class NodeListImpl implements NodeList {
-        private List<Node> nodeList;
-
-        public Node item(int index) {
-            if ((index < 0) || (index >= nodeList.size()))
-                return null;
-            return nodeList.get(index);
-        }
-
-        public int getLength() {
-            return nodeList.size();
-        }
-
-        NodeListImpl(List<Node> nodeList) {
-            if (nodeList == null) {
-                this.nodeList = new ArrayList<Node>(0);
-            } else {
-                this.nodeList = nodeList;
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-	@Override
-    public NodeList evalForNodeList(Object compiled, Node base) {
-        CompiledExpression ce = (CompiledExpression) compiled;
-        JXPathContext bctx = JXPathContext.newContext(base.getOwnerDocument());
-        Pointer ptr = new DOMExNodePointer(base, null);
-        JXPathContext ctx = bctx.getRelativeContext(ptr);
-        Iterator it = ce.iteratePointers(ctx);
-        if (!it.hasNext()) return EmptyNodeListImpl.getInstance();
-        List<Node> result = new ArrayList<Node>();
-        do {
-            Pointer pt = (Pointer) it.next();
-            Object o = pt.getNode();
-            if (!(o instanceof Node)) continue;
-            Node n = (Node) o;
-            result.add(n);
-        } while (it.hasNext());
-        return new NodeListImpl(result);
-    }
-
-    @Override
-    public String evalForString(Object compiled, Node base) {
-        CompiledExpression ce = (CompiledExpression) compiled;
-        JXPathContext bctx = JXPathContext.newContext(base.getOwnerDocument());
-        Pointer ptr = new DOMExNodePointer(base, null);
-        JXPathContext ctx = bctx.getRelativeContext(ptr);
-        return ce.getValue(ctx).toString();
-    }
-
-    public static XPathService newInstance() {
-        return new XPathServiceImpl();
-    }
-
-    private XPathServiceImpl() {
-    }
-}
