diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
index e3d05e6..77dceff 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * 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
@@ -469,7 +469,6 @@
 
         for (int i = 0; i < string.length; i++) {
             char current = string[i];
-
             switch (current) { //NOPMD
                 // Beginning of an attribute.
                 case '$':
@@ -524,20 +523,12 @@
 
                 // Default case
                 default:
-                    StringBuffer name = new StringBuffer();
-                    StringBuffer namespace = null;
+                    StringBuffer qname = new StringBuffer();
                     current = string[i];
                     while (current != ' ') {
-                        if (current == ':') {
-                            namespace = name;
-                            name = new StringBuffer();
-                            i++;
-                            current = string[i];
-                        } else {
-                            name.append(current);
-                            i++;
-                            current = string[i]; // Increment and get the new current char.
-                        }
+                        qname.append(current);
+                        i++;
+                        current = string[i]; // Increment and get the new current char.
                     }
                     // Skip spaces
                     while (string[i] == ' ') {
@@ -546,11 +537,19 @@
                     i = i + 1; // skip {
 
                     Element elem = null;
-                    if (namespace == null) {
-                        elem = new Element(name.toString(), null);
+                    // Parse the qname
+                    String n = qname.toString();
+                    if (n.indexOf(':') == -1) {
+                    	// No namespace
+                    	elem = new Element(n, null);
                     } else {
-                        elem = new Element(name.toString(), namespace.toString());
+                    	// The namespace ends on the first ':'
+                    	int index = n.indexOf(':');
+                    	String ns = n.substring(0, index);
+                    	String name = n.substring(index + 1);
+                    	elem = new Element(name.toString(), ns.toString());
                     }
+
                     addElement(elem);
 
                     break;
diff --git a/ipojo/core/src/test/java/org/apache/felix/ipojo/util/ManifestMetadataParserTest.java b/ipojo/core/src/test/java/org/apache/felix/ipojo/util/ManifestMetadataParserTest.java
new file mode 100644
index 0000000..c788740
--- /dev/null
+++ b/ipojo/core/src/test/java/org/apache/felix/ipojo/util/ManifestMetadataParserTest.java
@@ -0,0 +1,93 @@
+package org.apache.felix.ipojo.util;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+
+/**
+ * Test the {@link ManifestMetadataParser}
+ */
+public class ManifestMetadataParserTest extends TestCase {
+
+	/**
+	 * Test FELIX-2685.
+	 * The element name contains ':' as in:
+	 * "//jasmine.ow2.org/rules/1.0.0:configuration"
+	 * @throws ParseException
+	 */
+	public void testNameWithColumn() throws ParseException {
+		// Create a test element
+		String header = "mynamespace://jasmine.ow2.org/rules/1.0.0:configuration {}";
+		Element elem = ManifestMetadataParser.parse(header);
+
+		Assert.assertEquals("mynamespace", elem.getNameSpace());
+		Assert.assertEquals("//jasmine.ow2.org/rules/1.0.0:configuration", elem.getName());
+	}
+
+	/**
+	 * Check the parsing of handler element using {@link ManifestMetadataParser#parseHeader(String)}
+	 * @throws ParseException
+	 */
+	public void testHandlerHeader() throws ParseException {
+		String header = "handler { $name=\"wbp\" $classname=\"org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler\"" +
+				" $namespace=\"org.apache.felix.ipojo.whiteboard\" manipulation { $super=\"org.apache.felix.ipojo.PrimitiveHandler\"" +
+				" field { $name=\"m_managers\" $type=\"java.util.List\" }method { $name=\"$init\" }method { $arguments=" +
+				"\"{org.apache.felix.ipojo.metadata.Element,java.util.Dictionary}\" $name=\"configure\" }method { $name=\"start\"" +
+				" }method { $arguments=\"{int}\" $name=\"stateChanged\" }method { $name=\"stop\" }}}";
+
+		ManifestMetadataParser parser = new ManifestMetadataParser();
+		parser.parseHeader(header);
+
+		Element[] elems = parser.getComponentsMetadata();
+		Assert.assertEquals(1, elems.length);
+
+		Element element = elems[0];
+		Assert.assertEquals("handler", element.getName());
+		Assert.assertNull(element.getNameSpace());
+
+		Assert.assertEquals("wbp", element.getAttribute("name"));
+		Assert.assertEquals("org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler", element.getAttribute("classname"));
+		Assert.assertEquals("org.apache.felix.ipojo.whiteboard", element.getAttribute("namespace"));
+
+		// Check the manipulation element
+		Element[] manip = element.getElements("manipulation");
+		Assert.assertNotNull(manip[0]);
+
+		Element[] methods = manip[0].getElements("method");
+		Assert.assertEquals(5, methods.length);
+	}
+
+	/**
+	 * Check the parsing of handler element using {@link ManifestMetadataParser#parseHeaderMetadata(String)}
+	 * @throws ParseException
+	 */
+	public void testHandlerHeader2() throws ParseException {
+		String header = "handler { $name=\"wbp\" $classname=\"org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler\"" +
+				" $namespace=\"org.apache.felix.ipojo.whiteboard\" manipulation { $super=\"org.apache.felix.ipojo.PrimitiveHandler\"" +
+				" field { $name=\"m_managers\" $type=\"java.util.List\" }method { $name=\"$init\" }method { $arguments=" +
+				"\"{org.apache.felix.ipojo.metadata.Element,java.util.Dictionary}\" $name=\"configure\" }method { $name=\"start\"" +
+				" }method { $arguments=\"{int}\" $name=\"stateChanged\" }method { $name=\"stop\" }}}";
+
+		// This method returns an iPOJO root element
+		Element elem = ManifestMetadataParser.parseHeaderMetadata(header);
+		Element element = elem.getElements("handler")[0];
+
+		Assert.assertEquals("handler", element.getName());
+		Assert.assertNull(element.getNameSpace());
+
+		Assert.assertEquals("wbp", element.getAttribute("name"));
+		Assert.assertEquals("org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler", element.getAttribute("classname"));
+		Assert.assertEquals("org.apache.felix.ipojo.whiteboard", element.getAttribute("namespace"));
+
+		// Check the manipulation element
+		Element[] manip = element.getElements("manipulation");
+		Assert.assertNotNull(manip[0]);
+
+		Element[] methods = manip[0].getElements("method");
+		Assert.assertEquals(5, methods.length);
+	}
+
+}
