diff --git a/maven-obr-plugin/pom.xml b/maven-obr-plugin/pom.xml
index 6f8e3e7..6bef516 100644
--- a/maven-obr-plugin/pom.xml
+++ b/maven-obr-plugin/pom.xml
@@ -59,7 +59,7 @@
     <dependency>
       <groupId>xerces</groupId>
       <artifactId>xercesImpl</artifactId>
-      <version>2.4.0</version>
+      <version>2.8.1</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java
index a3de7b2..017fe08 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ObrUpdate.java
@@ -337,7 +337,7 @@
                 m_logger.error("the obr.xml file seems to be invalid in a \"require\" tag (one or more attributes are missing)");
                 // e.printStackTrace();
             }
-            newRequireNode.setValue(node.getTextContent());
+            newRequireNode.setValue(XmlHelper.getTextContent(node));
             m_resourceBundle.addRequire(newRequireNode);
         } else if (node.getNodeName().compareTo("capability") == 0) {
             Capability newCapability = new Capability();
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java
index 1f516f2..ec2f890 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/PathFile.java
@@ -255,8 +255,8 @@
         if (!this.isValid()) { return null; }
         String path = PathFile.uniformSeparator(getAbsoluteFilename());
         if (File.separatorChar == '\\') { 
-        	path = path.replace("\\", "/");
-        	path = path.replace(" ", "%20");
+        	path = path.replace('\\', '/');
+        	path = path.replaceAll(" ", "%20");
         }
 
         URI uri = null;
@@ -467,6 +467,8 @@
 
     }
 
+    private static final String REGEXP_BACKSLASH = "\\\\";
+
     /**
      * replace all '\' by '\\' in the given string.
      * @param path string where replace the search pattern
@@ -475,7 +477,7 @@
     public static String doubleSeparator(String path) {
         // double the '\' in the path
         if (path != null && File.separatorChar == '\\') {
-            return path.replace("\\", "\\\\");
+            return path.replaceAll(REGEXP_BACKSLASH, REGEXP_BACKSLASH + REGEXP_BACKSLASH);
         } else {
             return null;
         }
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java
index d46e463..8e90d47 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/Require.java
@@ -167,7 +167,7 @@
         require.setAttribute("extend", this.getExtend());
         require.setAttribute("multiple", this.getMultiple());
         require.setAttribute("optional", this.getOptional());
-        require.setTextContent(this.getValue());
+        XmlHelper.setTextContent(require,this.getValue());
 
         return require;
     }
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java
index 7a3744c..29a164d 100644
--- a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/ResourcesBundle.java
@@ -265,24 +265,24 @@
         resource.setAttribute("uri", this.getUri());
         resource.setAttribute("version", this.getVersion());
 
-        description.setTextContent(this.getDescription());
+        XmlHelper.setTextContent(description,this.getDescription());
         resource.appendChild(description);
 
-        size.setTextContent(this.getSize());
+        XmlHelper.setTextContent(size,this.getSize());
         resource.appendChild(size);
 
         if (this.getDocumentation() != null) {
-            documentation.setTextContent(this.getDocumentation());
+            XmlHelper.setTextContent(documentation,this.getDocumentation());
             resource.appendChild(documentation);
         }
 
         if (this.getSource() != null) {
-            source.setTextContent(this.getSource());
+            XmlHelper.setTextContent(source,this.getSource());
             resource.appendChild(source);
         }
 
         if (this.getLicense() != null) {
-            license.setTextContent(this.getLicense());
+            XmlHelper.setTextContent(license, this.getLicense());
             resource.appendChild(license);
         }
 
diff --git a/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/XmlHelper.java b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/XmlHelper.java
new file mode 100644
index 0000000..78ae9ad
--- /dev/null
+++ b/maven-obr-plugin/src/main/java/org/apache/felix/sandbox/obr/plugin/XmlHelper.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.felix.sandbox.obr.plugin;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Provide XML helper methods to support pre-Java5 runtimes
+ * 
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class XmlHelper
+{
+    /**
+     * based on public Java5 javadoc of org.w3c.dom.Node.getTextContent method
+     */
+    public static String getTextContent( Node node )
+    {
+        switch( node.getNodeType() ) {
+        case Node.ELEMENT_NODE:
+        case Node.ATTRIBUTE_NODE:
+        case Node.ENTITY_NODE:
+        case Node.ENTITY_REFERENCE_NODE:
+        case Node.DOCUMENT_FRAGMENT_NODE:
+            return mergeTextContent( node.getChildNodes() );
+        case Node.TEXT_NODE:
+        case Node.CDATA_SECTION_NODE:
+        case Node.COMMENT_NODE:
+        case Node.PROCESSING_INSTRUCTION_NODE:
+            return node.getNodeValue();
+        case Node.DOCUMENT_NODE:
+        case Node.DOCUMENT_TYPE_NODE:
+        case Node.NOTATION_NODE:
+        default:
+            return null;
+        }
+    }
+
+    /**
+     * based on the following quote from public Java5 javadoc of org.w3c.dom.Node.getTextContent method:
+     * 
+     * "concatenation of the textContent attribute value of every child node, excluding COMMENT_NODE and
+     * PROCESSING_INSTRUCTION_NODE nodes. This is the empty string if the node has no children"
+     */
+    private static String mergeTextContent( NodeList nodes )
+    {
+        StringBuffer buf = new StringBuffer();
+        for( int i = 0; i < nodes.getLength(); i++ )
+        {
+            Node n = nodes.item( i );
+            final String text;
+
+            switch( n.getNodeType() ) {
+            case Node.COMMENT_NODE:
+            case Node.PROCESSING_INSTRUCTION_NODE:
+                text = null;
+                break;
+            default:
+                text = getTextContent( n );
+                break;
+            }
+
+            if( text != null )
+            {
+                buf.append( text );
+            }
+        }
+        return buf.toString();
+    }
+
+    /**
+     * based on public Java5 javadoc of org.w3c.dom.Node.setTextContent method
+     */
+    public static void setTextContent( Node node, final String text )
+    {
+        while( node.hasChildNodes() )
+        {
+            node.removeChild( node.getFirstChild() );
+        }
+
+        if( text != null && text.length() > 0 )
+        {
+            Node textNode = node.getOwnerDocument().createTextNode( text );
+            node.appendChild( textNode );
+        }
+    }
+}
