diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNode.java b/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNode.java
index f58956e..9952fce 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNode.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNode.java
@@ -36,6 +36,6 @@
  * @see <a href= "http://www.w3.org/TR/rdf11-concepts/#dfn-blank-node">RDF-1.1
  * Blank Node</a>
  */
-public class BlankNode implements BlankNodeOrIri {
+public class BlankNode implements BlankNodeOrIRI {
 
 }
diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNodeOrIri.java b/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNodeOrIRI.java
similarity index 95%
rename from api/src/main/java/org/apache/clerezza/commons/rdf/BlankNodeOrIri.java
rename to api/src/main/java/org/apache/clerezza/commons/rdf/BlankNodeOrIRI.java
index 680456a..8d80b4b 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNodeOrIri.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/BlankNodeOrIRI.java
@@ -25,6 +25,6 @@
  *
  * @author reto
  */
-public interface BlankNodeOrIri extends RdfTerm {
+public interface BlankNodeOrIRI extends RDFTerm {
 
 }
diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/Graph.java b/api/src/main/java/org/apache/clerezza/commons/rdf/Graph.java
index af2604a..6904722 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/Graph.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/Graph.java
@@ -45,8 +45,8 @@
      * @param object
      * @return <code>Iterator</code>
      */
-    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri predicate, 
-            RdfTerm object);
+    public Iterator<Triple> filter(BlankNodeOrIRI subject, IRI predicate, 
+            RDFTerm object);
 
     /**
      * Returns true if <code>other</code> describes the same graph and will 
diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/Iri.java b/api/src/main/java/org/apache/clerezza/commons/rdf/IRI.java
similarity index 91%
rename from api/src/main/java/org/apache/clerezza/commons/rdf/Iri.java
rename to api/src/main/java/org/apache/clerezza/commons/rdf/IRI.java
index cbcb310..be9b3a8 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/Iri.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/IRI.java
@@ -31,11 +31,11 @@
  * 
  * @author reto
  */
-public class Iri implements BlankNodeOrIri, Serializable {
+public class IRI implements BlankNodeOrIRI, Serializable {
 
     private String unicodeString;
 
-    public Iri(String unicodeString) {
+    public IRI(String unicodeString) {
         this.unicodeString = unicodeString;
     }
 
@@ -56,11 +56,11 @@
     @Override
     public boolean equals(Object obj) {
 
-        if (!(obj instanceof Iri)) {
+        if (!(obj instanceof IRI)) {
             return false;
         }
 
-        return unicodeString.equals(((Iri) obj).getUnicodeString());
+        return unicodeString.equals(((IRI) obj).getUnicodeString());
     }
 
     /**
diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/Literal.java b/api/src/main/java/org/apache/clerezza/commons/rdf/Literal.java
index d43070c..0f96256 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/Literal.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/Literal.java
@@ -28,7 +28,7 @@
  *
  * @author reto
  */
-public interface Literal extends RdfTerm {
+public interface Literal extends RDFTerm {
     
     /**
      * The lexical form of this literal, represented by a <a
@@ -50,7 +50,7 @@
      * href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">RDF-1.1
      * Literal datatype IRI</a>
      */
-    Iri getDataType();
+    IRI getDataType();
     
     /**
      * If and only if the datatype IRI is <a
diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/RdfTerm.java b/api/src/main/java/org/apache/clerezza/commons/rdf/RDFTerm.java
similarity index 97%
rename from api/src/main/java/org/apache/clerezza/commons/rdf/RdfTerm.java
rename to api/src/main/java/org/apache/clerezza/commons/rdf/RDFTerm.java
index d51e01a..197a182 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/RdfTerm.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/RDFTerm.java
@@ -27,6 +27,6 @@
  * @see <a href= "http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-term" >RDF-1.1
  * Term</a>
  */
-public interface RdfTerm {
+public interface RDFTerm {
 
 }
diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/Triple.java b/api/src/main/java/org/apache/clerezza/commons/rdf/Triple.java
index c1c24a7..67cdef0 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/Triple.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/Triple.java
@@ -26,11 +26,11 @@
  */
 public interface Triple {
 
-    BlankNodeOrIri getSubject();
+    BlankNodeOrIRI getSubject();
 
-    Iri getPredicate();
+    IRI getPredicate();
 
-    RdfTerm getObject();
+    RDFTerm getObject();
 
     /**
      * 
diff --git a/api/src/main/java/org/apache/clerezza/commons/rdf/event/FilterTriple.java b/api/src/main/java/org/apache/clerezza/commons/rdf/event/FilterTriple.java
index b83682b..4e22df7 100644
--- a/api/src/main/java/org/apache/clerezza/commons/rdf/event/FilterTriple.java
+++ b/api/src/main/java/org/apache/clerezza/commons/rdf/event/FilterTriple.java
@@ -18,10 +18,10 @@
  */
 package org.apache.clerezza.commons.rdf.event;
 
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 
 /**
  * The <code>FilterTriple</code> class provides a match()-method that tests
@@ -31,9 +31,9 @@
  */
 public class FilterTriple {
 
-    private BlankNodeOrIri subject;
-    private Iri predicate;
-    private RdfTerm object;
+    private BlankNodeOrIRI subject;
+    private IRI predicate;
+    private RDFTerm object;
     
     /**
      * Creates a new <code>FilterTriple</code>. The specified subject,
@@ -44,7 +44,7 @@
      * @param predicate  the predicate.
      * @param object  the object.
      */
-    public FilterTriple (BlankNodeOrIri subject, Iri predicate, RdfTerm object) {
+    public FilterTriple (BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
         this.subject = subject;
         this.predicate = predicate;
         this.object = object;
diff --git a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlBNode.java b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlBNode.java
index a8002a9..9035b0a 100644
--- a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlBNode.java
+++ b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlBNode.java
@@ -18,10 +18,10 @@
 import java.util.Collection;
 import java.util.Objects;
 import org.apache.clerezza.commons.rdf.BlankNode;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.ImmutableGraph;
-import org.apache.clerezza.commons.rdf.Iri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.IRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
 import org.apache.clerezza.commons.rdf.impl.utils.simple.SimpleGraph;
@@ -32,7 +32,7 @@
  */
 class SparqlBNode extends BlankNode {
     
-    final static Iri internalBNodeId = new Iri("urn:x-internalid:fdmpoihdfw");
+    final static IRI internalBNodeId = new IRI("urn:x-internalid:fdmpoihdfw");
     
     final ImmutableGraph context;
     private final int isoDistinguisher;
@@ -41,8 +41,8 @@
         this.isoDistinguisher = isoDistinguisher;
         final SimpleGraph contextBuider = new SimpleGraph();
         for (Triple triple : context) {
-            BlankNodeOrIri subject = triple.getSubject();
-            RdfTerm object = triple.getObject();
+            BlankNodeOrIRI subject = triple.getSubject();
+            RDFTerm object = triple.getObject();
             contextBuider.add(new TripleImpl(subject.equals(node) ? internalBNodeId : subject, 
                     triple.getPredicate(), 
                     object.equals(node) ? internalBNodeId : object));
diff --git a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java
index 0104677..4510907 100644
--- a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java
+++ b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlClient.java
@@ -32,9 +32,9 @@
 import org.apache.http.util.EntityUtils;
 import javax.xml.parsers.*;
 import org.apache.clerezza.commons.rdf.BlankNode;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.Language;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.impl.utils.AbstractLiteral;
 import org.xml.sax.*;
 import org.xml.sax.helpers.*;
@@ -51,7 +51,7 @@
         this.endpoint = endpoint;
     }
 
-    List<Map<String, RdfTerm>> queryResultSet(final String query) throws IOException {
+    List<Map<String, RDFTerm>> queryResultSet(final String query) throws IOException {
         CloseableHttpClient httpclient = HttpClients.createDefault();
         HttpPost httpPost = new HttpPost(endpoint);
         List<NameValuePair> nvps = new ArrayList<NameValuePair>();
@@ -91,22 +91,22 @@
     final public static class SparqlsResultsHandler extends DefaultHandler {
 
         private String currentBindingName;
-        private Map<String, RdfTerm> currentResult = null;
-        private final List<Map<String, RdfTerm>> results = new ArrayList<>();
+        private Map<String, RDFTerm> currentResult = null;
+        private final List<Map<String, RDFTerm>> results = new ArrayList<>();
         private boolean readingValue;
         private String lang; //the xml:lang attribute of a literal
         private String value;
         private Map<String, BlankNode> bNodeMap = new HashMap<>();
-        private static final Iri XSD_STRING = new Iri("http://www.w3.org/2001/XMLSchema#string");
+        private static final IRI XSD_STRING = new IRI("http://www.w3.org/2001/XMLSchema#string");
 
-        private RdfTerm getBNode(String value) {
+        private RDFTerm getBNode(String value) {
             if (!bNodeMap.containsKey(value)) {
                 bNodeMap.put(value, new BlankNode());
             }
             return bNodeMap.get(value);
         }
 
-        private List<Map<String, RdfTerm>> getResults() {
+        private List<Map<String, RDFTerm>> getResults() {
             return results;
         }
 
@@ -175,11 +175,11 @@
                 } else {
                     try {
                         BindingType b = BindingType.valueOf(localName);
-                        RdfTerm rdfTerm = null;
+                        RDFTerm rdfTerm = null;
                         final Language language = lang == null? null : new Language(lang);;
                         switch (b) {
                             case uri:
-                                rdfTerm = new Iri(value);
+                                rdfTerm = new IRI(value);
                                 break;
                             case bnode:
                                 rdfTerm = getBNode(value);
@@ -194,7 +194,7 @@
                                     }
 
                                     @Override
-                                    public Iri getDataType() {
+                                    public IRI getDataType() {
                                         //TODO implement
                                         return XSD_STRING;
                                     }
diff --git a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraph.java b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraph.java
index 5b011c0..0df3f14 100644
--- a/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraph.java
+++ b/impl.sparql/src/main/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraph.java
@@ -28,12 +28,12 @@
 import java.util.concurrent.Callable;
 import java.util.logging.Logger;
 import org.apache.clerezza.commons.rdf.BlankNode;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.Graph;
 import org.apache.clerezza.commons.rdf.ImmutableGraph;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.Literal;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.impl.utils.AbstractGraph;
 import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
@@ -59,17 +59,17 @@
     }
 
     @Override
-    protected Iterator<Triple> performFilter(final BlankNodeOrIri filterSubject,
-            final Iri filterPredicate, final RdfTerm filterObject) {
+    protected Iterator<Triple> performFilter(final BlankNodeOrIRI filterSubject,
+            final IRI filterPredicate, final RDFTerm filterObject) {
         try {
             String query = createQuery(filterSubject, filterPredicate, filterObject);
-            final List<Map<String, RdfTerm>> sparqlResults = sparqlClient.queryResultSet(query);
+            final List<Map<String, RDFTerm>> sparqlResults = sparqlClient.queryResultSet(query);
             //first to triples without bnode-conversion
             //rawTriples contains the triples with the BNodes from the result set
             final Collection<Triple> rawTriples = new ArrayList<>();
-            for (Map<String, RdfTerm> result : sparqlResults) {
-                rawTriples.add(new TripleImpl(filterSubject != null ? filterSubject : (BlankNodeOrIri) result.get("s"),
-                        filterPredicate != null ? filterPredicate : (Iri) result.get("p"),
+            for (Map<String, RDFTerm> result : sparqlResults) {
+                rawTriples.add(new TripleImpl(filterSubject != null ? filterSubject : (BlankNodeOrIRI) result.get("s"),
+                        filterPredicate != null ? filterPredicate : (IRI) result.get("p"),
                         filterObject != null ? filterObject : result.get("o")));
 
             }
@@ -81,14 +81,14 @@
                 final Map<BlankNode, SparqlBNode> nodeMap = new HashMap<>();
                 final Set<ImmutableGraph> usedContext = new HashSet<>();
 
-                private RdfTerm useSparqlNode(RdfTerm node) throws IOException {
-                    if (node instanceof BlankNodeOrIri) {
-                        return useSparqlNode((BlankNodeOrIri) node);
+                private RDFTerm useSparqlNode(RDFTerm node) throws IOException {
+                    if (node instanceof BlankNodeOrIRI) {
+                        return useSparqlNode((BlankNodeOrIRI) node);
                     }
                     return node;
                 }
 
-                private BlankNodeOrIri useSparqlNode(BlankNodeOrIri node) throws IOException {
+                private BlankNodeOrIRI useSparqlNode(BlankNodeOrIRI node) throws IOException {
                     if (node instanceof BlankNode) {
                         if (!nodeMap.containsKey(node)) {
                             createBlankNodesForcontext((BlankNode) node);
@@ -107,13 +107,13 @@
                     final Set<BlankNode> rawNodes = new HashSet<>();
                     for (Triple triple : context) {
                         {
-                            final BlankNodeOrIri subject = triple.getSubject();
+                            final BlankNodeOrIRI subject = triple.getSubject();
                             if (subject instanceof BlankNode) {
                                 rawNodes.add((BlankNode) subject);
                             }
                         }
                         {
-                            final RdfTerm object = triple.getObject();
+                            final RDFTerm object = triple.getObject();
                             if (object instanceof BlankNode) {
                                 rawNodes.add((BlankNode) object);
                             }
@@ -171,8 +171,8 @@
                 private ImmutableGraph getContextInRaw(BlankNode node) {
                     final Graph contextBuilder = new SimpleGraph();
                     for (Triple rawTriple : rawTriples) {
-                        BlankNodeOrIri rawSubject = rawTriple.getSubject();
-                        RdfTerm rawObject = rawTriple.getObject();
+                        BlankNodeOrIRI rawSubject = rawTriple.getSubject();
+                        RDFTerm rawObject = rawTriple.getObject();
                         if (rawSubject.equals(node) || rawObject.equals(node)) {
                             contextBuilder.add(rawTriple);
                         }
@@ -239,18 +239,18 @@
                         queryBuilder.append(" } .\n");
                     }
                     queryBuilder.append(" }");
-                    final List<Map<String, RdfTerm>> expansionQueryResults = sparqlClient.queryResultSet(queryBuilder.toString());
+                    final List<Map<String, RDFTerm>> expansionQueryResults = sparqlClient.queryResultSet(queryBuilder.toString());
                     Set<ImmutableGraph> expandedContexts = new HashSet<>();
                     //the query results may or may be from disjoint supergraphs
                     //we expand them all as if they are different which may lead
                     //us to the same MSG multiple times
                     RESULTS:
-                    for (Map<String, RdfTerm> expansionQueryResult : expansionQueryResults) {
+                    for (Map<String, RDFTerm> expansionQueryResult : expansionQueryResults) {
                         Collection<Triple> expandedContext = new HashSet<>();
                         Map<BlankNode, BlankNode> newBNodesToOldBNodes = new HashMap<>();
                         for (BlankNode oldBNode : bNodesInContext) {
                             final String bNodeVarLabel = bNodeVarNameMap.get(oldBNode);
-                            final RdfTerm newNode = expansionQueryResult.get(bNodeVarLabel);
+                            final RDFTerm newNode = expansionQueryResult.get(bNodeVarLabel);
                             if (!(newNode instanceof BlankNode)) {
                                 //this subgraph is't a match
                                 continue RESULTS;
@@ -263,9 +263,9 @@
                         for (BlankNode oldBNode : bNodesInContext) {
                             final String bNodeVarLabel = bNodeVarNameMap.get(oldBNode);
                             {
-                                final Iri newPredicate = (Iri) expansionQueryResult.get("po" + bNodeVarLabel);
+                                final IRI newPredicate = (IRI) expansionQueryResult.get("po" + bNodeVarLabel);
                                 if (newPredicate != null) {
-                                    RdfTerm newObject = expansionQueryResult.get("o" + bNodeVarLabel);
+                                    RDFTerm newObject = expansionQueryResult.get("o" + bNodeVarLabel);
                                     if (newObject instanceof BlankNode) {
                                         if (newBNodesToOldBNodes.containsKey(newObject)) {
                                             //point back to BNode in startContext
@@ -280,9 +280,9 @@
                                 }
                             }
                             {
-                                final Iri newPredicate = (Iri) expansionQueryResult.get("pi" + bNodeVarLabel);
+                                final IRI newPredicate = (IRI) expansionQueryResult.get("pi" + bNodeVarLabel);
                                 if (newPredicate != null) {
-                                    RdfTerm newSubject = expansionQueryResult.get("s" + bNodeVarLabel);
+                                    RDFTerm newSubject = expansionQueryResult.get("s" + bNodeVarLabel);
                                     if (newSubject instanceof BlankNode) {
                                         if (newBNodesToOldBNodes.containsKey(newSubject)) {
                                             //point back to BNode in startContext
@@ -291,7 +291,7 @@
                                             newBNodeIntroduced = true;
                                         }
                                     }
-                                    if (expandedContext.add(new TripleImpl((BlankNodeOrIri) newSubject, newPredicate, oldBNode))) {
+                                    if (expandedContext.add(new TripleImpl((BlankNodeOrIRI) newSubject, newPredicate, oldBNode))) {
                                         newTripleAdded = true;
                                     }
                                 }
@@ -336,7 +336,7 @@
         }
     }
 
-    private String createQuery(final BlankNodeOrIri filterSubject, final Iri filterPredicate, final RdfTerm filterObject) {
+    private String createQuery(final BlankNodeOrIRI filterSubject, final IRI filterPredicate, final RDFTerm filterObject) {
         final StringBuilder selectBuilder = new StringBuilder();
         selectBuilder.append("SELECT ");
         final StringBuilder whereBuilder = new StringBuilder();
@@ -393,7 +393,7 @@
         }
     }
 
-    private String asSparqlTerm(Iri iri) {
+    private String asSparqlTerm(IRI iri) {
         return "<" + iri.getUnicodeString() + ">";
     }
 
@@ -410,17 +410,17 @@
         throw new RuntimeException("SparqlBNodes should have been handled earlier");
     }
 
-    private String asSparqlTerm(BlankNodeOrIri term) {
-        if (term instanceof Iri) {
-            return asSparqlTerm((Iri) term);
+    private String asSparqlTerm(BlankNodeOrIRI term) {
+        if (term instanceof IRI) {
+            return asSparqlTerm((IRI) term);
         } else {
             return asSparqlTerm((BlankNode) term);
         }
     }
 
-    private String asSparqlTerm(RdfTerm term) {
-        if (term instanceof BlankNodeOrIri) {
-            return asSparqlTerm((BlankNodeOrIri) term);
+    private String asSparqlTerm(RDFTerm term) {
+        if (term instanceof BlankNodeOrIRI) {
+            return asSparqlTerm((BlankNodeOrIRI) term);
         } else {
             return asSparqlTerm((Literal) term);
         }
@@ -438,7 +438,7 @@
         for (Triple t : triples) {
             final StringBuilder builder = new StringBuilder();
             {
-                final BlankNodeOrIri s = t.getSubject();
+                final BlankNodeOrIRI s = t.getSubject();
                 String varName;
                 if (s instanceof BlankNode) {
                     if (bNodeVarNameMap.containsKey(s)) {
@@ -463,7 +463,7 @@
             builder.append(asSparqlTerm(t.getPredicate()));
             builder.append(' ');
             {
-                final RdfTerm o = t.getObject();
+                final RDFTerm o = t.getObject();
                 String varName;
                 if (o instanceof BlankNode) {
                     if (bNodeVarNameMap.containsKey(o)) {
diff --git a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeCircleTest.java b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeCircleTest.java
index af2c81a..3bf063d 100644
--- a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeCircleTest.java
+++ b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeCircleTest.java
@@ -25,10 +25,10 @@
 import java.io.InputStream;
 import java.util.Iterator;
 import org.apache.clerezza.commons.rdf.BlankNode;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.Iri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.IRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -77,8 +77,8 @@
         final Iterator<Triple> iter = graph.filter(null, null, null);
         Assert.assertTrue(iter.hasNext());
         final Triple triple1 = iter.next();
-        final BlankNodeOrIri subject = triple1.getSubject();
-        final RdfTerm object = triple1.getObject();
+        final BlankNodeOrIRI subject = triple1.getSubject();
+        final RDFTerm object = triple1.getObject();
         Assert.assertTrue(subject instanceof BlankNode);
         Assert.assertTrue(object instanceof BlankNode);
         Assert.assertNotEquals(subject, object);
@@ -89,13 +89,13 @@
     public void foafKnowsFilter() {
         final Graph graph = new SparqlGraph("http://localhost:" + serverPort + "/ds/query");
         
-        final Iri foafKnows = new Iri("http://xmlns.com/foaf/0.1/knows");
+        final IRI foafKnows = new IRI("http://xmlns.com/foaf/0.1/knows");
 
         final Iterator<Triple> iter = graph.filter(null, foafKnows, null);
         Assert.assertTrue(iter.hasNext());
         final Triple triple1 = iter.next();
-        final BlankNodeOrIri subject = triple1.getSubject();
-        final RdfTerm object = triple1.getObject();
+        final BlankNodeOrIRI subject = triple1.getSubject();
+        final RDFTerm object = triple1.getObject();
         Assert.assertTrue(subject instanceof BlankNode);
         Assert.assertTrue(object instanceof BlankNode);
         Assert.assertNotEquals(subject, object);
diff --git a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeTest.java b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeTest.java
index 757c42d..e1fda73 100644
--- a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeTest.java
+++ b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/BNodeTest.java
@@ -25,10 +25,10 @@
 import java.io.InputStream;
 import java.util.Iterator;
 import org.apache.clerezza.commons.rdf.BlankNode;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.Iri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.IRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -84,25 +84,25 @@
     public void bNodeIdentity() {
         final Graph graph = new SparqlGraph("http://localhost:" + serverPort + "/ds/query");
         
-        final Iri foafPerson = new Iri("http://xmlns.com/foaf/0.1/Person");
-        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name");
-        final Iri foafKnows = new Iri("http://xmlns.com/foaf/0.1/knows");
-        final Iri rdfType = new Iri("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
+        final IRI foafPerson = new IRI("http://xmlns.com/foaf/0.1/Person");
+        final IRI foafName = new IRI("http://xmlns.com/foaf/0.1/name");
+        final IRI foafKnows = new IRI("http://xmlns.com/foaf/0.1/knows");
+        final IRI rdfType = new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
 
         final Iterator<Triple> iter = graph.filter(null, foafName, null);
         Assert.assertTrue(iter.hasNext());
-        final BlankNodeOrIri namedThing = iter.next().getSubject();
+        final BlankNodeOrIRI namedThing = iter.next().getSubject();
         Assert.assertTrue(namedThing instanceof BlankNode);
         
         final Iterator<Triple> iter2 = graph.filter(null, rdfType, foafPerson);
         Assert.assertTrue(iter2.hasNext());
-        final BlankNodeOrIri person = iter2.next().getSubject();
+        final BlankNodeOrIRI person = iter2.next().getSubject();
         Assert.assertTrue(person instanceof BlankNode);
         Assert.assertEquals(namedThing, person);
         
         final Iterator<Triple> iter3 = graph.filter(null, foafKnows, null);
         Assert.assertTrue(iter3.hasNext());
-        final RdfTerm knownThing = iter3.next().getObject();
+        final RDFTerm knownThing = iter3.next().getObject();
         Assert.assertTrue(knownThing instanceof BlankNode);
         Assert.assertEquals(knownThing, person);
         Assert.assertEquals(namedThing, knownThing);
@@ -112,13 +112,13 @@
     public void filter1() {
         final Graph graph = new SparqlGraph("http://localhost:" + serverPort + "/ds/query");
         
-        final Iri foafPerson = new Iri("http://xmlns.com/foaf/0.1/Person");
-        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name");
-        final Iri rdfType = new Iri("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
+        final IRI foafPerson = new IRI("http://xmlns.com/foaf/0.1/Person");
+        final IRI foafName = new IRI("http://xmlns.com/foaf/0.1/name");
+        final IRI rdfType = new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
 
         final Iterator<Triple> iter = graph.filter(null, foafName, null);
         Assert.assertTrue(iter.hasNext());
-        final BlankNodeOrIri person = iter.next().getSubject();
+        final BlankNodeOrIRI person = iter.next().getSubject();
         Assert.assertTrue(person instanceof BlankNode);
         
         final Iterator<Triple> iter2 = graph.filter(person, rdfType, null);
diff --git a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SimilarBNodes.java b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SimilarBNodes.java
index baf72c9..975084f 100644
--- a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SimilarBNodes.java
+++ b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SimilarBNodes.java
@@ -25,9 +25,9 @@
 import java.io.InputStream;
 import java.util.Iterator;
 import org.apache.clerezza.commons.rdf.BlankNode;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -74,16 +74,16 @@
     public void foafKnowsFilter() {
         final Graph graph = new SparqlGraph("http://localhost:" + serverPort + "/ds/query");
         
-        final Iri foafKnows = new Iri("http://xmlns.com/foaf/0.1/knows");
+        final IRI foafKnows = new IRI("http://xmlns.com/foaf/0.1/knows");
 
         final Iterator<Triple> iter = graph.filter(null, foafKnows, null);
         Assert.assertTrue(iter.hasNext());
         final Triple triple1 = iter.next();
-        final BlankNodeOrIri subject1 = triple1.getSubject();
+        final BlankNodeOrIRI subject1 = triple1.getSubject();
         Assert.assertTrue(subject1 instanceof BlankNode);
         Assert.assertTrue(iter.hasNext());
         final Triple triple2 = iter.next();
-        final BlankNodeOrIri subject2 = triple2.getSubject();
+        final BlankNodeOrIRI subject2 = triple2.getSubject();
         Assert.assertTrue(subject2 instanceof BlankNode);
         Assert.assertNotEquals(subject1, subject2);
     }
diff --git a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraphTest.java b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraphTest.java
index b0291d5..0461f3e 100644
--- a/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraphTest.java
+++ b/impl.sparql/src/test/java/org/apache/clerezza/commons/rdf/impl/sparql/SparqlGraphTest.java
@@ -27,10 +27,10 @@
 import java.util.Iterator;
 import java.util.Set;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.Language;
 import org.apache.clerezza.commons.rdf.Literal;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.impl.utils.PlainLiteralImpl;
 import org.junit.AfterClass;
@@ -75,10 +75,10 @@
     @Test
     public void filter1() {
         final Graph graph = new SparqlGraph("http://localhost:" + serverPort + "/ds/query");
-        final Iri spiderman = new Iri("http://example.org/#spiderman");
-        final Iri greenGoblin = new Iri("http://example.org/#green-goblin");
-        final Iri enemyOf = new Iri("http://www.perceive.net/schemas/relationship/enemyOf");
-        final Iri foafName = new Iri("http://xmlns.com/foaf/0.1/name");
+        final IRI spiderman = new IRI("http://example.org/#spiderman");
+        final IRI greenGoblin = new IRI("http://example.org/#green-goblin");
+        final IRI enemyOf = new IRI("http://www.perceive.net/schemas/relationship/enemyOf");
+        final IRI foafName = new IRI("http://xmlns.com/foaf/0.1/name");
         {
             final Iterator<Triple> iter = graph.filter(spiderman, null, greenGoblin);
             Assert.assertTrue(iter.hasNext());
@@ -90,7 +90,7 @@
             Set<Literal> names = new HashSet<>();
             for (int i = 0; i < 2; i++) {
                 Assert.assertTrue(iter.hasNext());
-                RdfTerm name = iter.next().getObject();
+                RDFTerm name = iter.next().getObject();
                 Assert.assertTrue(name instanceof Literal);
                 names.add((Literal)name);
             }
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractGraph.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractGraph.java
index d87c3e9..15efce6 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractGraph.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractGraph.java
@@ -29,12 +29,12 @@
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.Graph;
 import org.apache.clerezza.commons.rdf.ImmutableGraph;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.WatchableGraph;
 import org.apache.clerezza.commons.rdf.event.AddEvent;
 import org.apache.clerezza.commons.rdf.event.FilterTriple;
@@ -104,7 +104,7 @@
     }
 
     @Override
-    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri predicate, RdfTerm object) {
+    public Iterator<Triple> filter(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
         readLock.lock();
         try {
             return new LockingIterator(performFilter(subject, predicate, object), lock);
@@ -260,7 +260,7 @@
     }
 
 
-    protected abstract Iterator<Triple> performFilter(BlankNodeOrIri subject, Iri predicate, RdfTerm object);
+    protected abstract Iterator<Triple> performFilter(BlankNodeOrIRI subject, IRI predicate, RDFTerm object);
 
     protected abstract int performSize();
 
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractImmutableGraph.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractImmutableGraph.java
index 983860a..e5644ed 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractImmutableGraph.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/AbstractImmutableGraph.java
@@ -23,7 +23,7 @@
 
 import org.apache.clerezza.commons.rdf.BlankNode;
 import org.apache.clerezza.commons.rdf.ImmutableGraph;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.impl.utils.graphmatching.GraphMatcher;
 
@@ -51,12 +51,12 @@
      */
     private int getBlankNodeBlindHash(Triple triple) {
         int hash = triple.getPredicate().hashCode();
-        RdfTerm subject = triple.getSubject();
+        RDFTerm subject = triple.getSubject();
 
         if (!(subject instanceof BlankNode)) {
             hash ^= subject.hashCode() >> 1;
         }
-        RdfTerm object = triple.getObject();
+        RDFTerm object = triple.getObject();
         if (!(object instanceof BlankNode)) {
             hash ^= object.hashCode() << 1;
         }
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/LiteralImpl.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/LiteralImpl.java
index ed39ca0..b2aa4be 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/LiteralImpl.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/LiteralImpl.java
@@ -20,7 +20,7 @@
 
 import java.io.Serializable;
 
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.Language;
 
 /**
@@ -29,7 +29,7 @@
  */
 public class LiteralImpl extends AbstractLiteral implements  Serializable {
     private String lexicalForm;
-    private Iri dataType;
+    private IRI dataType;
     private int hashCode;
     private Language language;
 
@@ -38,14 +38,14 @@
      * @param dataType 
      * @param Language the language of this literal
      */
-    public LiteralImpl(String lexicalForm, Iri dataType, Language language) {
+    public LiteralImpl(String lexicalForm, IRI dataType, Language language) {
         this.lexicalForm = lexicalForm;
         this.dataType = dataType;
         this.language = language;
         this.hashCode = super.hashCode();
     }
     
-    public Iri getDataType() {
+    public IRI getDataType() {
         return dataType;
     }
 
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/PlainLiteralImpl.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/PlainLiteralImpl.java
index 0b8aabc..53bd93e 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/PlainLiteralImpl.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/PlainLiteralImpl.java
@@ -19,7 +19,7 @@
 package org.apache.clerezza.commons.rdf.impl.utils;
 
 import java.io.Serializable;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 
 import org.apache.clerezza.commons.rdf.Language;
 import org.apache.clerezza.commons.rdf.Literal;
@@ -69,9 +69,9 @@
     }
 
     @Override
-    public Iri getDataType() {
+    public IRI getDataType() {
         return XSD_STRING;
     }
-    private static final Iri XSD_STRING = new Iri("http://www.w3.org/2001/XMLSchema#string");
+    private static final IRI XSD_STRING = new IRI("http://www.w3.org/2001/XMLSchema#string");
     private static final int XSD_STRING_HASH = XSD_STRING.hashCode();
 }
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TripleImpl.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TripleImpl.java
index 55c4a84..6137c4b 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TripleImpl.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TripleImpl.java
@@ -18,10 +18,10 @@
  */
 package org.apache.clerezza.commons.rdf.impl.utils;
 
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 
 /**
  *
@@ -29,9 +29,9 @@
  */
 public class TripleImpl implements Triple {
 
-    private final BlankNodeOrIri subject;
-    private final Iri predicate;
-    private final RdfTerm object;
+    private final BlankNodeOrIRI subject;
+    private final IRI predicate;
+    private final RDFTerm object;
 
     /**
      * Creates a new <code>TripleImpl</code>.
@@ -41,7 +41,7 @@
      * @param object  the object.
      * @throws IllegalArgumentException  if an attribute is <code>null</code>.
      */
-    public TripleImpl(BlankNodeOrIri subject, Iri predicate, RdfTerm object) {
+    public TripleImpl(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
         if (subject == null) {
             throw new IllegalArgumentException("Invalid subject: null");
         } else if (predicate == null) {
@@ -81,15 +81,15 @@
     }
 
     @Override
-    public BlankNodeOrIri getSubject() {
+    public BlankNodeOrIRI getSubject() {
         return subject;
     }
 
-    public Iri getPredicate() {
+    public IRI getPredicate() {
         return predicate;
     }
 
-    public RdfTerm getObject() {
+    public RDFTerm getObject() {
         return object;
     }
 
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TypedLiteralImpl.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TypedLiteralImpl.java
index ca8b5b5..67f7c9c 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TypedLiteralImpl.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/TypedLiteralImpl.java
@@ -20,7 +20,7 @@
 
 import java.io.Serializable;
 
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.Language;
 import org.apache.clerezza.commons.rdf.Literal;
 
@@ -30,20 +30,20 @@
  */
 public class TypedLiteralImpl extends AbstractLiteral implements  Serializable {
     private String lexicalForm;
-    private Iri dataType;
+    private IRI dataType;
     private int hashCode;
 
     /**
      * @param lexicalForm 
      * @param dataType 
      */
-    public TypedLiteralImpl(String lexicalForm, Iri dataType) {
+    public TypedLiteralImpl(String lexicalForm, IRI dataType) {
         this.lexicalForm = lexicalForm;
         this.dataType = dataType;
         this.hashCode = super.hashCode();
     }
     
-    public Iri getDataType() {
+    public IRI getDataType() {
         return dataType;
     }
 
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/WatchableGraphWrapper.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/WatchableGraphWrapper.java
index a168e82..de61fe4 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/WatchableGraphWrapper.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/WatchableGraphWrapper.java
@@ -22,11 +22,11 @@
 import java.util.Iterator;
 import java.util.Set;
 import java.util.concurrent.locks.ReadWriteLock;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.Graph;
 import org.apache.clerezza.commons.rdf.ImmutableGraph;
-import org.apache.clerezza.commons.rdf.Iri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.IRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.WatchableGraph;
 import org.apache.clerezza.commons.rdf.event.AddEvent;
@@ -68,8 +68,8 @@
     }
 
     @Override
-    public Iterator<Triple> filter(BlankNodeOrIri subject, Iri predicate,
-            RdfTerm object) {
+    public Iterator<Triple> filter(BlankNodeOrIRI subject, IRI predicate,
+            RDFTerm object) {
         final Iterator<Triple> baseIter = wrapped.filter(subject, predicate, object);
         return new Iterator<Triple>() {
 
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcher.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
index 15c4cf9..ce65d1a 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcher.java
@@ -27,9 +27,9 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.apache.clerezza.commons.rdf.BlankNode;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
 import org.apache.clerezza.commons.rdf.impl.utils.simple.SimpleMGraph;
@@ -125,13 +125,13 @@
     }
 
     private static Triple map(Triple triple, Map<BlankNode, BlankNode> map) {
-        final BlankNodeOrIri oSubject = triple.getSubject();
+        final BlankNodeOrIRI oSubject = triple.getSubject();
 
-        BlankNodeOrIri subject = oSubject instanceof BlankNode ?
+        BlankNodeOrIRI subject = oSubject instanceof BlankNode ?
             map.get((BlankNode)oSubject) : oSubject;
 
-        RdfTerm oObject = triple.getObject();
-        RdfTerm object = oObject instanceof BlankNode ?
+        RDFTerm oObject = triple.getObject();
+        RDFTerm object = oObject instanceof BlankNode ?
             map.get((BlankNode)oObject) : oObject;
         return new TripleImpl(subject, triple.getPredicate(), object);
     }
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatching.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatching.java
index a9cf92f..369cf5c 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatching.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatching.java
@@ -28,11 +28,11 @@
 import java.util.Set;
 import org.apache.clerezza.commons.rdf.BlankNode;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
 import org.apache.clerezza.commons.rdf.impl.utils.graphmatching.collections.IntIterator;
 
@@ -135,7 +135,7 @@
             final BlankNode bNode2 = nodes2.iterator().next();
             matchings.put(bNode1,bNode2);
             //in the graphs replace node occurences with grounded node,
-            BlankNodeOrIri mappedNode = new MappedNode(bNode1, bNode2);
+            BlankNodeOrIRI mappedNode = new MappedNode(bNode1, bNode2);
             replaceNode(g1,bNode1, mappedNode);
             replaceNode(g2, bNode2, mappedNode);
             //remove grounded triples
@@ -177,7 +177,7 @@
         }
         return result;
     }
-    private static int nodeHash(RdfTerm resource, Map<BlankNode, Integer> bNodeHashMap) {
+    private static int nodeHash(RDFTerm resource, Map<BlankNode, Integer> bNodeHashMap) {
         if (resource instanceof BlankNode) {
             Integer mapValue = bNodeHashMap.get((BlankNode)resource);
             if (mapValue == null) {
@@ -189,7 +189,7 @@
             return resource.hashCode();
         }
     }
-    private static void replaceNode(Graph graph, BlankNode bNode, BlankNodeOrIri replacementNode) {
+    private static void replaceNode(Graph graph, BlankNode bNode, BlankNodeOrIRI replacementNode) {
         Set<Triple> triplesToRemove = new HashSet<Triple>();
         for (Triple triple : graph) {
             Triple replacementTriple = getReplacement(triple, bNode, replacementNode);
@@ -200,7 +200,7 @@
         }
         graph.removeAll(triplesToRemove);
     }
-    private static Triple getReplacement(Triple triple, BlankNode bNode, BlankNodeOrIri replacementNode) {
+    private static Triple getReplacement(Triple triple, BlankNode bNode, BlankNodeOrIRI replacementNode) {
         if (triple.getSubject().equals(bNode)) {
             if (triple.getObject().equals(bNode)) {
                 return new TripleImpl(replacementNode, triple.getPredicate(), replacementNode);
@@ -225,10 +225,10 @@
     }
     
     private static class BackwardProperty implements Property {
-        private BlankNodeOrIri subject;
-        private Iri predicate;
+        private BlankNodeOrIRI subject;
+        private IRI predicate;
     
-        public BackwardProperty(BlankNodeOrIri subject, Iri predicate) {
+        public BackwardProperty(BlankNodeOrIRI subject, IRI predicate) {
             this.subject = subject;
             this.predicate = predicate;
         }
@@ -240,10 +240,10 @@
     
     }
     private static class ForwardProperty implements Property {
-        private Iri predicate;
-        private RdfTerm object;
+        private IRI predicate;
+        private RDFTerm object;
     
-        public ForwardProperty(Iri predicate, RdfTerm object) {
+        public ForwardProperty(IRI predicate, RDFTerm object) {
             this.predicate = predicate;
             this.object = object;
         }
@@ -253,7 +253,7 @@
             return predicate.hashCode() ^ nodeHash(object, bNodeHashMap);
         }
     }
-    private static class MappedNode implements BlankNodeOrIri {
+    private static class MappedNode implements BlankNodeOrIRI {
         private BlankNode bNode1, bNode2;
     
         public MappedNode(BlankNode bNode1, BlankNode bNode2) {
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraph.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraph.java
index cfced01..96f168b 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraph.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraph.java
@@ -29,11 +29,11 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.apache.clerezza.commons.rdf.ImmutableGraph;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 
 /**
  * For now this is a minimalistic implementation, without any indexes or other
@@ -139,7 +139,7 @@
     }
 
     @Override
-    public Iterator<Triple> performFilter(final BlankNodeOrIri subject, final Iri predicate, final RdfTerm object) {
+    public Iterator<Triple> performFilter(final BlankNodeOrIRI subject, final IRI predicate, final RDFTerm object) {
         final List<Triple> tripleList = new ArrayList<Triple>();
         synchronized (triples) {
             Iterator<Triple> baseIter = triples.iterator();
diff --git a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
index 5c1aecc..4cb3390 100644
--- a/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
+++ b/impl.utils/src/main/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleImmutableGraph.java
@@ -21,11 +21,11 @@
 import org.apache.clerezza.commons.rdf.impl.utils.AbstractImmutableGraph;
 import java.util.Iterator;
 
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 
 /**
  *
@@ -73,7 +73,7 @@
     }
 
     @Override
-    public Iterator<Triple> performFilter(BlankNodeOrIri subject, Iri predicate, RdfTerm object) {
+    public Iterator<Triple> performFilter(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {
         return graph.filter(subject, predicate, object);
     }
 }
diff --git a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcherTest.java b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcherTest.java
index 2270f49..24b92c5 100644
--- a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcherTest.java
+++ b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/GraphMatcherTest.java
@@ -22,11 +22,11 @@
 import java.util.Map;
 import org.apache.clerezza.commons.rdf.BlankNode;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.impl.utils.simple.SimpleMGraph;
 import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
 import org.junit.Assert;
@@ -38,7 +38,7 @@
  */
 public class GraphMatcherTest {
 
-    final static Iri u1 = new Iri("http://example.org/u1");
+    final static IRI u1 = new IRI("http://example.org/u1");
 
     @Test
     public void testEmpty() {
@@ -107,12 +107,12 @@
         return generateCircle(size, new BlankNode());
     }
 
-    private Graph generateCircle(int size, final BlankNodeOrIri firstNode) {
+    private Graph generateCircle(int size, final BlankNodeOrIRI firstNode) {
         if (size < 1) {
             throw new IllegalArgumentException();
         }
         Graph result = new SimpleMGraph();
-        BlankNodeOrIri lastNode = firstNode;
+        BlankNodeOrIRI lastNode = firstNode;
         for (int i = 0; i < (size-1); i++) {
             final BlankNode newNode = new BlankNode();
             result.add(new TripleImpl(lastNode, u1, newNode));
@@ -142,7 +142,7 @@
 
     @Test
     public void test9() {
-        BlankNodeOrIri crossing = new Iri("http://example.org/");
+        BlankNodeOrIRI crossing = new IRI("http://example.org/");
         Graph tc1 = generateCircle(2,crossing);
         tc1.addAll(generateCircle(3,crossing));
         Graph tc2 = generateCircle(2,crossing);
@@ -156,10 +156,10 @@
 
     @Test
     public void test10() {
-        BlankNodeOrIri crossing1 = new BlankNode();
+        BlankNodeOrIRI crossing1 = new BlankNode();
         Graph tc1 = generateCircle(2,crossing1);
         tc1.addAll(generateCircle(3,crossing1));
-        BlankNodeOrIri crossing2 = new BlankNode();
+        BlankNodeOrIRI crossing2 = new BlankNode();
         Graph tc2 = generateCircle(2,crossing2);
         tc2.addAll(generateCircle(3,crossing2));
         Assert.assertEquals(5, tc1.size());
@@ -171,10 +171,10 @@
 
     @Test
     public void test11() {
-        BlankNodeOrIri crossing1 = new BlankNode();
+        BlankNodeOrIRI crossing1 = new BlankNode();
         Graph tc1 = generateCircle(2,crossing1);
         tc1.addAll(generateCircle(4,crossing1));
-        BlankNodeOrIri crossing2 = new BlankNode();
+        BlankNodeOrIRI crossing2 = new BlankNode();
         Graph tc2 = generateCircle(3,crossing2);
         tc2.addAll(generateCircle(3,crossing2));
         Assert.assertEquals(6, tc1.size());
@@ -184,10 +184,10 @@
 
     @Test
     public void test12() {
-        BlankNodeOrIri start1 = new BlankNode();
+        BlankNodeOrIRI start1 = new BlankNode();
         Graph tc1 = Utils4Testing.generateLine(4,start1);
         tc1.addAll(Utils4Testing.generateLine(5,start1));
-        BlankNodeOrIri start2 = new BlankNode();
+        BlankNodeOrIRI start2 = new BlankNode();
         Graph tc2 = Utils4Testing.generateLine(5,start2);
         tc2.addAll(Utils4Testing.generateLine(4,start2));
         Assert.assertEquals(9, tc1.size());
@@ -198,10 +198,10 @@
 
     @Test
     public void test13() {
-        BlankNodeOrIri start1 = new BlankNode();
+        BlankNodeOrIRI start1 = new BlankNode();
         Graph tc1 = Utils4Testing.generateLine(4,start1);
         tc1.addAll(Utils4Testing.generateLine(5,start1));
-        BlankNodeOrIri start2 = new BlankNode();
+        BlankNodeOrIRI start2 = new BlankNode();
         Graph tc2 = Utils4Testing.generateLine(3,start2);
         tc2.addAll(Utils4Testing.generateLine(3,start2));
         Assert.assertEquals(9, tc1.size());
diff --git a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatchingTest.java b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatchingTest.java
index 88f8a96..8acbce5 100644
--- a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatchingTest.java
+++ b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/HashMatchingTest.java
@@ -24,7 +24,7 @@
 
 import org.apache.clerezza.commons.rdf.BlankNode;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -36,10 +36,10 @@
 
     @Test
     public void twoLine() throws GraphNotIsomorphicException {
-        BlankNodeOrIri start1 = new BlankNode();
+        BlankNodeOrIRI start1 = new BlankNode();
         Graph tc1 = Utils4Testing.generateLine(4,start1);
         tc1.addAll(Utils4Testing.generateLine(5,start1));
-        BlankNodeOrIri start2 = new BlankNode();
+        BlankNodeOrIRI start2 = new BlankNode();
         Graph tc2 = Utils4Testing.generateLine(5,start2);
         tc2.addAll(Utils4Testing.generateLine(4,start2));
         Assert.assertEquals(9, tc1.size());
diff --git a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/Utils4Testing.java b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/Utils4Testing.java
index 04d7c80..ca3237c 100644
--- a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/Utils4Testing.java
+++ b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/graphmatching/Utils4Testing.java
@@ -21,8 +21,8 @@
 
 import org.apache.clerezza.commons.rdf.BlankNode;
 import org.apache.clerezza.commons.rdf.Graph;
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.impl.utils.simple.SimpleMGraph;
 import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
 
@@ -32,12 +32,12 @@
  */
 public class Utils4Testing {
 
-    static Graph generateLine(int size, final BlankNodeOrIri firstNode) {
+    static Graph generateLine(int size, final BlankNodeOrIRI firstNode) {
         if (size < 1) {
             throw new IllegalArgumentException();
         }
         Graph result = new SimpleMGraph();
-        BlankNodeOrIri lastNode = firstNode;
+        BlankNodeOrIRI lastNode = firstNode;
         for (int i = 0; i < size; i++) {
             final BlankNode newNode = new BlankNode();
             result.add(new TripleImpl(lastNode, u1, newNode));
@@ -46,6 +46,6 @@
         return result;
     }
 
-    final static Iri u1 = new Iri("http://example.org/u1");
+    final static IRI u1 = new IRI("http://example.org/u1");
 
 }
diff --git a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraphTest.java b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraphTest.java
index 4875fcf..9c94a8d 100644
--- a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraphTest.java
+++ b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/SimpleGraphTest.java
@@ -24,7 +24,7 @@
 import org.junit.Assert;
 import org.junit.Test;
 import org.apache.clerezza.commons.rdf.Triple;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.impl.utils.simple.SimpleGraph;
 
 /**
@@ -33,9 +33,9 @@
  */
 public class SimpleGraphTest {
 
-    private Iri uriRef1 = new Iri("http://example.org/foo");
-    private Iri uriRef2 = new Iri("http://example.org/bar");
-    private Iri uriRef3 = new Iri("http://example.org/test");
+    private IRI uriRef1 = new IRI("http://example.org/foo");
+    private IRI uriRef2 = new IRI("http://example.org/bar");
+    private IRI uriRef3 = new IRI("http://example.org/test");
     private Triple triple1 = new TripleImpl(uriRef1, uriRef2, uriRef3);
     private Triple triple2 = new TripleImpl(uriRef2, uriRef2, uriRef1);
     private Triple triple3 = new TripleImpl(uriRef3, uriRef1, uriRef3);
diff --git a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TripleImplTest.java b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TripleImplTest.java
index 8161768..b064a60 100644
--- a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TripleImplTest.java
+++ b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TripleImplTest.java
@@ -29,10 +29,10 @@
 import org.junit.Test;
 import junit.framework.Assert;
 
-import org.apache.clerezza.commons.rdf.BlankNodeOrIri;
-import org.apache.clerezza.commons.rdf.RdfTerm;
+import org.apache.clerezza.commons.rdf.BlankNodeOrIRI;
+import org.apache.clerezza.commons.rdf.RDFTerm;
 import org.apache.clerezza.commons.rdf.Triple;
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.impl.utils.PlainLiteralImpl;
 import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
 /**
@@ -45,9 +45,9 @@
     
     
     @Test public void tripleEquality() {
-        BlankNodeOrIri subject = new Iri("http://example.org/");
-        Iri predicate = new Iri("http://example.org/property");
-        RdfTerm object = new PlainLiteralImpl("property value");
+        BlankNodeOrIRI subject = new IRI("http://example.org/");
+        IRI predicate = new IRI("http://example.org/property");
+        RDFTerm object = new PlainLiteralImpl("property value");
         Triple triple1 = new TripleImpl(subject, predicate, object);
         Triple triple2 = new TripleImpl(subject, predicate, object);
         Assert.assertEquals(triple1.hashCode(), triple2.hashCode());
diff --git a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
index fd74f4b..2da82cd 100644
--- a/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
+++ b/impl.utils/src/test/java/org/apache/clerezza/commons/rdf/impl/utils/simple/TypedLiteralImplTest.java
@@ -22,7 +22,7 @@
 import org.junit.Test;
 import junit.framework.Assert;
 
-import org.apache.clerezza.commons.rdf.Iri;
+import org.apache.clerezza.commons.rdf.IRI;
 import org.apache.clerezza.commons.rdf.Literal;
 /**
  *
@@ -41,14 +41,14 @@
     
     @Test public void typedLiteralEquality() {
         String stringValue = "some text";
-        Iri uriRef = new Iri("http://example.org/datatypes/magic");
+        IRI uriRef = new IRI("http://example.org/datatypes/magic");
         Literal literal1 = new TypedLiteralImpl(stringValue, uriRef);
         Literal literal2 = new TypedLiteralImpl(stringValue, uriRef);        
         Assert.assertEquals(literal1, literal2);
         Assert.assertEquals(literal1.hashCode(), literal2.hashCode());
         Literal literal3 = new TypedLiteralImpl("something else", uriRef);
         Assert.assertFalse(literal1.equals(literal3));
-        Iri uriRef2 = new Iri("http://example.org/datatypes/other");
+        IRI uriRef2 = new IRI("http://example.org/datatypes/other");
         Literal literal4 = new TypedLiteralImpl(stringValue, uriRef2);
         Assert.assertFalse(literal1.equals(literal4));
     }
@@ -59,7 +59,7 @@
      */
     @Test public void checkHashCode() {
         String stringValue = "some text";
-        Iri uriRef = new Iri("http://example.org/datatypes/magic");
+        IRI uriRef = new IRI("http://example.org/datatypes/magic");
         Literal literal =  new TypedLiteralImpl(stringValue, uriRef);
         Assert.assertEquals(stringValue.hashCode() + uriRef.hashCode(), literal.hashCode());
     }
