diff --git a/impl.sparql/pom.xml b/impl.sparql/pom.xml
index d1b4fdc..045465c 100644
--- a/impl.sparql/pom.xml
+++ b/impl.sparql/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.clerezza</groupId>
         <artifactId>clerezza</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
+        <version>7-SNAPSHOT</version>
         <relativePath />
     </parent>
 
diff --git a/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LiteralImpl.java b/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LiteralImpl.java
new file mode 100644
index 0000000..0de3b84
--- /dev/null
+++ b/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/LiteralImpl.java
@@ -0,0 +1,82 @@
+/*
+ * 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.commons.rdf.impl.utils;
+
+import java.io.Serializable;
+
+import org.apache.commons.rdf.Iri;
+import org.apache.commons.rdf.Language;
+
+/**
+ *
+ * @author reto
+ */
+public class LiteralImpl extends AbstractLiteral implements  Serializable {
+    private String lexicalForm;
+    private Iri dataType;
+    private int hashCode;
+    private Language language;
+
+    /**
+     * @param lexicalForm 
+     * @param dataType 
+     * @param Language the language of this literal
+     */
+    public LiteralImpl(String lexicalForm, Iri dataType, Language language) {
+        this.lexicalForm = lexicalForm;
+        this.dataType = dataType;
+        this.language = language;
+        this.hashCode = super.hashCode();
+    }
+    
+    public Iri getDataType() {
+        return dataType;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.clerezza.rdf.core.LiteralNode#getLexicalForm()
+     */
+    @Override
+    public String getLexicalForm() {
+        return lexicalForm;
+    }
+
+    @Override
+    public int hashCode() {
+        return hashCode;
+    }
+    
+
+    @Override
+    public String toString() {
+        StringBuffer result = new StringBuffer();
+        result.append('\"');
+        result.append(getLexicalForm());
+        result.append('\"');
+        result.append("^^");
+        result.append(getDataType());
+        return result.toString();
+    }
+
+    @Override
+    public Language getLanguage() {
+        return language;
+    }
+
+}
diff --git a/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java b/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
index 5dcbaf7..dec30db 100644
--- a/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
+++ b/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/PlainLiteralImpl.java
@@ -28,7 +28,7 @@
  *
  * @author reto
  */
-public class PlainLiteralImpl implements Literal, Serializable {
+public class PlainLiteralImpl extends AbstractLiteral implements Literal, Serializable {
 
     private String lexicalForm;
     private Language language = null;
@@ -54,33 +54,6 @@
     }
 
     @Override
-    public boolean equals(Object otherObj) {
-        if (!(otherObj instanceof Literal)) {
-            return false;
-        }
-        Literal other = (Literal) otherObj;
-        if (!lexicalForm.equals(other.getLexicalForm())) {
-            return false;
-        }
-        if (language != null) {
-            return language.equals(other.getLanguage());
-        }
-        if (other.getLanguage() != null) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = lexicalForm.hashCode() + XSD_STRING_HASH;
-        if (language != null) {
-            hash += language.hashCode();
-        }
-        return hash;
-    }
-
-    @Override
     public Language getLanguage() {
         return language;
     }
diff --git a/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java b/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
index 45863ff..4d3ff9d 100644
--- a/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
+++ b/impl.utils/src/main/java/org/apache/commons/rdf/impl/utils/TypedLiteralImpl.java
@@ -40,7 +40,7 @@
     public TypedLiteralImpl(String lexicalForm, Iri dataType) {
         this.lexicalForm = lexicalForm;
         this.dataType = dataType;
-        this.hashCode = lexicalForm.hashCode()+dataType.hashCode();
+        this.hashCode = super.hashCode();
     }
     
     public Iri getDataType() {
