diff --git a/pom.xml b/pom.xml
index cb46b43..4120f11 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
 
   nl.openweb.jcr
   jcr-mocking-tool
-  1.3.4-SNAPSHOT
+  1.4.0-SNAPSHOT
 
   JCR Mocking Tool
   This a tool to facilitate setup of a JCR repository for testing purposes.
diff --git a/src/main/java/nl/openweb/jcr/Importer.java b/src/main/java/nl/openweb/jcr/importer/AbstractJcrImporter.java
similarity index 59%
rename from src/main/java/nl/openweb/jcr/Importer.java
rename to src/main/java/nl/openweb/jcr/importer/AbstractJcrImporter.java
index 4c094b9..0337be2 100644
--- a/src/main/java/nl/openweb/jcr/Importer.java
+++ b/src/main/java/nl/openweb/jcr/importer/AbstractJcrImporter.java
@@ -1,35 +1,13 @@
-/*
- * Copyright 2017 Open Web IT B.V. (https://www.openweb.nl/)
- *
- * 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.
- */
-
-package nl.openweb.jcr;
+package nl.openweb.jcr.importer;
 
-import nl.openweb.jcr.domain.NodeBean;
-import nl.openweb.jcr.domain.PropertyBean;
-import nl.openweb.jcr.json.JsonUtils;
+import nl.openweb.jcr.JcrImporterException;
+import nl.openweb.jcr.NodeBeanUtils;
 import nl.openweb.jcr.utils.NodeTypeUtils;
 import nl.openweb.jcr.utils.PathUtils;
 import nl.openweb.jcr.utils.ReflectionUtils;
 import org.apache.commons.beanutils.ConvertUtilsBean;
 
 import javax.jcr.*;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.util.*;
@@ -37,118 +15,104 @@
 import static nl.openweb.jcr.utils.ReflectionUtils.unwrapNodeDecorator;
 
 /**
- * Created by Ebrahim on 5/20/2017.
+ * @author Ivor
  */
-public class Importer {
+public abstract class AbstractJcrImporter implements JcrImporter {
 
-    public static final String JCR_PRIMARY_TYPE = "jcr:primaryType";
-    public static final String JCR_MIXIN_TYPES = "jcr:mixinTypes";
-    public static final String JCR_UUID = "jcr:uuid";
     private final Set protectedProperties;
-    private final boolean setProtectedProperties;
-    private final boolean saveSession;
-    private final boolean addMixins;
-    private final boolean addUuid;
-    private final boolean addUnknownTypes;
+    private boolean addMixins = true;
+    private boolean addUuid = false;
+    private boolean setProtectedProperties = false;
+    private boolean saveSession = true;
+    private boolean addUnknownTypes = false;
     private final Node rootNode;
-    private JAXBContext jaxbContext;
 
-    private Importer(Builder builder) {
-        try {
-            this.addMixins = builder.addMixins;
-            this.rootNode = builder.rootNodeSupplier.get();
-            this.addUuid = builder.addUuid;
-            this.setProtectedProperties = builder.setProtectedProperties;
-            this.saveSession = builder.saveSession;
-            this.addUnknownTypes = builder.addUnknownTypes;
-            HashSet set = new HashSet<>();
-            set.add(JCR_PRIMARY_TYPE);
-            set.add(JCR_MIXIN_TYPES);
-            set.add(JCR_UUID);
-            this.protectedProperties = Collections.unmodifiableSet(set);
-            this.jaxbContext = JAXBContext.newInstance(NodeBean.class, PropertyBean.class);
-        } catch (Exception e) {
-            throw new JcrImporterException(e.getMessage(), e);
+    public AbstractJcrImporter(Node rootNode) {
+        this.rootNode = rootNode;
+        if (rootNode == null) {
+            throw new JcrImporterException("rootNode is not allowed to be null");
         }
+        HashSet set = new HashSet<>();
+        set.add(JCR_PRIMARY_TYPE);
+        set.add(JCR_MIXIN_TYPES);
+        set.add(JCR_UUID);
+        this.protectedProperties = Collections.unmodifiableSet(set);
     }
 
-    public Node createNodesFromJson(String json) {
-        return createNodesFromJson(json, null, null);
+    @Override
+    public JcrImporter addMixins(boolean addMixins) {
+        this.addMixins = addMixins;
+        return this;
     }
 
-    public Node createNodesFromJson(String json, String path) {
-        return createNodesFromJson(json, path, null);
+    public boolean isAddMixins() {
+        return addMixins;
     }
 
-    public Node createNodesFromJson(String json, String path, String intermediateNodeType) {
-        try {
-            return createNodeFromNodeBean(JsonUtils.parseJsonMap(json), path, intermediateNodeType);
-        } catch (IOException e) {
-            throw new JcrImporterException(e.getMessage(), e);
-        }
+    @Override
+    public AbstractJcrImporter addUuid(boolean addUuid) {
+        this.addUuid = addUuid;
+        return this;
     }
 
-    public Node createNodesFromJson(InputStream inputStream) {
-        return createNodesFromJson(inputStream, null, null);
+    public boolean isAddUuid() {
+        return addUuid;
     }
 
-    public Node createNodesFromJson(InputStream inputStream, String path) {
-        return createNodesFromJson(inputStream, path, null);
+    @Override
+    public AbstractJcrImporter setProtectedProperties(boolean setProtectedProperties) {
+        this.setProtectedProperties = setProtectedProperties;
+        return this;
     }
 
-    public Node createNodesFromJson(InputStream inputStream, String path, String intermediateNodeType) {
-        try {
-            validate(inputStream);
-            return createNodeFromNodeBean(JsonUtils.parseJsonMap(inputStream), path, intermediateNodeType);
-        } catch (IOException e) {
-            throw new JcrImporterException(e.getMessage(), e);
-        }
+    public boolean isSetProtectedProperties() {
+        return setProtectedProperties;
     }
 
+    @Override
+    public AbstractJcrImporter saveSession(boolean saveSession) {
+        this.saveSession = saveSession;
+        return this;
+    }
 
-    public Node createNodesFromXml(String xml) {
-        return createNodesFromXml(xml, null);
+    public boolean isSaveSession() {
+        return saveSession;
     }
 
-    public Node createNodesFromXml(String xml, String path) {
-        return createNodesFromXml(xml, path, null);
+    @Override
+    public AbstractJcrImporter addUnknownTypes(boolean addUnknownTypes) {
+        this.addUnknownTypes = addUnknownTypes;
+        return this;
     }
 
-    public Node createNodesFromXml(String xml, String path, String intermediateNodeType) {
-        return this.createNodesFromXml(new ByteArrayInputStream(xml.getBytes()), path, intermediateNodeType);
+    public boolean isAddUnknownTypes() {
+        return addUnknownTypes;
     }
 
-    public Node createNodesFromXml(InputStream inputStream) {
-        return createNodesFromXml(inputStream, null, null);
+    @Override
+    public Node getRootNode() {
+        return rootNode;
     }
 
-    public Node createNodesFromXml(InputStream inputStream, String path) {
-        return createNodesFromXml(inputStream, path, null);
+
+    public Node createNodes(String source) {
+        return createNodes(source, null, null);
     }
 
-    public Node createNodesFromXml(InputStream inputStream, String path, String intermediateNodeType) {
-        try {
-            validate(inputStream);
-            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
-            Object unmarshaled = unmarshaller.unmarshal(inputStream);
-            if (unmarshaled instanceof NodeBean) {
-                return createNodeFromNodeBean(NodeBeanUtils.nodeBeanToMap((NodeBean) unmarshaled), path, intermediateNodeType);
-            } else {
-                throw new JcrImporterException("The given XML file is not of the right format");
-            }
-        } catch (JAXBException e) {
-            throw new JcrImporterException(e.getMessage(), e);
-        }
+    public Node createNodes(String source, String path) {
+        return createNodes(source, path, null);
     }
 
-    private void validate(InputStream inputStream) {
-        if (inputStream == null) {
-            throw new JcrImporterException("InputSteam may not be null.");
-        }
+    public Node createNodes(InputStream inputStream) {
+        return createNodes(inputStream, null, null);
+    }
+
+    public Node createNodes(InputStream inputStream, String path) {
+        return createNodes(inputStream, path, null);
     }
 
 
-    private Node createNodeFromNodeBean(Map map, String path, String intermediateNodeType) {
+    Node createNodeFromNodeBean(Map map, String path, String intermediateNodeType) {
         try {
             Node node = getOrCreateNode(rootNode, path, intermediateNodeType, map);
             updateNode(node, map);
@@ -364,55 +328,5 @@ private Value toJcrValue(Session session, Object value, String propertyName) thr
         return result;
     }
 
-    public static class Builder {
-        private boolean addMixins = true;
-        private boolean addUuid = false;
-        private boolean setProtectedProperties = false;
-        private boolean saveSession = true;
-        private boolean addUnknownTypes = false;
-        private final SupplierWithException rootNodeSupplier;
-
-
-        public Builder(SupplierWithException rootNodeSupplier) {
-            this.rootNodeSupplier = rootNodeSupplier;
-            if (this.rootNodeSupplier == null) {
-                throw new IllegalArgumentException("supplier is required.");
-            }
-        }
-
-        public Builder addMixins(boolean addMixins) {
-            this.addMixins = addMixins;
-            return this;
-        }
-
-        public Builder addUuid(boolean addUuid) {
-            this.addUuid = addUuid;
-            return this;
-        }
-
-        public Builder setProtectedProperties(boolean setProtectedProperties) {
-            this.setProtectedProperties = setProtectedProperties;
-            return this;
-        }
-
-        public Builder saveSession(boolean saveSession) {
-            this.saveSession = saveSession;
-            return this;
-        }
-
-        public Builder addUnknownTypes(boolean addUnknownTypes) {
-            this.addUnknownTypes = addUnknownTypes;
-            return this;
-        }
-
-        public Importer build() {
-            return new Importer(this);
-        }
-    }
-
-    @FunctionalInterface
-    public interface SupplierWithException {
-        T get() throws Exception;
-    }
 
 }
diff --git a/src/main/java/nl/openweb/jcr/importer/JcrImporter.java b/src/main/java/nl/openweb/jcr/importer/JcrImporter.java
new file mode 100644
index 0000000..763dfaa
--- /dev/null
+++ b/src/main/java/nl/openweb/jcr/importer/JcrImporter.java
@@ -0,0 +1,76 @@
+package nl.openweb.jcr.importer;
+
+import javax.jcr.Node;
+import java.io.InputStream;
+
+
+/**
+ * Imports JCR nodes from an outside source
+ * @author Ivor Boers
+ */
+public interface JcrImporter {
+    String JCR_PRIMARY_TYPE = "jcr:primaryType";
+    String JCR_MIXIN_TYPES = "jcr:mixinTypes";
+    String JCR_UUID = "jcr:uuid";
+
+    JcrImporter addMixins(boolean addMixins);
+
+    JcrImporter addUuid(boolean addUuid);
+
+    JcrImporter setProtectedProperties(boolean setProtectedProperties);
+
+    JcrImporter saveSession(boolean saveSession);
+
+    JcrImporter addUnknownTypes(boolean addUnknownTypes);
+
+    Node getRootNode();
+
+    /**
+     * Create nodes from source on the root
+     * @param source the textual representation of the nodes
+     * @return the created (top)node
+     */
+    Node createNodes(String source);
+
+    /**
+     * Create nodes from source at a specified path without a specified intermediate nodetype
+     * @param source the textual representation of the nodes
+     * @param path the path where the topnode should be imported
+     * @return the created (top)node
+     */
+    Node createNodes(String source, String path);
+
+    /**
+     *
+     * @param source the textual representation of the nodes
+     * @param path the path where the topnode should be imported
+     * @param intermediateNodeType the type of the nodes between the exisiting path and the path where to create the nodes
+     * @return the created (top)node
+     */
+    Node createNodes(String source, String path, String intermediateNodeType);
+
+    /**
+     * Create nodes from source on the root
+     * @param inputStream the stream representation of the nodes
+     * @return the created (top)node
+     */
+    Node createNodes(InputStream inputStream);
+
+    /**
+     * Create nodes from source at a specified path without a specified intermediate nodetype
+     * @param inputStream the stream representation of the nodes
+     * @param path the path where the topnode should be imported
+     * @return the created (top)node
+     */
+    Node createNodes(InputStream inputStream, String path);
+
+    /**
+     *
+     * @param inputStream the stream representation of the nodes
+     * @param path the path where the topnode should be imported
+     * @param intermediateNodeType the type of the nodes between the exisiting path and the path where to create the nodes
+     * @return the created (top)node
+     */
+    Node createNodes(InputStream inputStream, String path, String intermediateNodeType);
+
+}
diff --git a/src/main/java/nl/openweb/jcr/importer/JsonImporter.java b/src/main/java/nl/openweb/jcr/importer/JsonImporter.java
new file mode 100644
index 0000000..b65cfd5
--- /dev/null
+++ b/src/main/java/nl/openweb/jcr/importer/JsonImporter.java
@@ -0,0 +1,48 @@
+package nl.openweb.jcr.importer;
+
+import nl.openweb.jcr.JcrImporterException;
+import nl.openweb.jcr.NodeBeanUtils;
+import nl.openweb.jcr.domain.NodeBean;
+import nl.openweb.jcr.json.JsonUtils;
+
+import javax.jcr.Node;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Importer for JSON files
+ * @author Ivor Boers
+ */
+public class JsonImporter extends AbstractJcrImporter {
+    public static final String FORMAT = "json";
+
+    public JsonImporter(Node rootNode) {
+        super(rootNode);
+    }
+
+    @Override
+    public Node createNodes(String json, String path, String intermediateNodeType) {
+        try {
+            return createNodeFromNodeBean(JsonUtils.parseJsonMap(json), path, intermediateNodeType);
+        } catch (IOException e) {
+            throw new JcrImporterException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public Node createNodes(InputStream inputStream, String path, String intermediateNodeType) {
+        try {
+            validate(inputStream);
+            NodeBean json = JsonUtils.parseJson(inputStream);
+            return createNodeFromNodeBean(NodeBeanUtils.nodeBeanToMap(json), path, intermediateNodeType);
+        } catch (IOException e) {
+            throw new JcrImporterException(e.getMessage(), e);
+        }
+    }
+
+    private void validate(InputStream inputStream) {
+        if (inputStream == null) {
+            throw new JcrImporterException("InputSteam may not be null.");
+        }
+    }
+}
diff --git a/src/main/java/nl/openweb/jcr/importer/XmlImporter.java b/src/main/java/nl/openweb/jcr/importer/XmlImporter.java
new file mode 100644
index 0000000..6b4892b
--- /dev/null
+++ b/src/main/java/nl/openweb/jcr/importer/XmlImporter.java
@@ -0,0 +1,61 @@
+package nl.openweb.jcr.importer;
+
+import nl.openweb.jcr.JcrImporterException;
+import nl.openweb.jcr.NodeBeanUtils;
+import nl.openweb.jcr.domain.NodeBean;
+import nl.openweb.jcr.domain.PropertyBean;
+
+import javax.jcr.Node;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+/**
+ * @author Ivor
+ */
+public class XmlImporter extends AbstractJcrImporter {
+    public static final String FORMAT = "xml";
+    private final JAXBContext jaxbContext;
+
+    public XmlImporter(Node rootNode){
+        super(rootNode);
+        this.jaxbContext = createJxbContext();
+    }
+
+    private JAXBContext createJxbContext() {
+        try {
+            return JAXBContext.newInstance(NodeBean.class, PropertyBean.class);
+        } catch (JAXBException e) {
+            throw new JcrImporterException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public Node createNodes(String xml, String path, String intermediateNodeType) {
+        return this.createNodes(new ByteArrayInputStream(xml.getBytes()), path, intermediateNodeType);
+    }
+
+    @Override
+    public Node createNodes(InputStream inputStream, String path, String intermediateNodeType) {
+        try {
+            validate(inputStream);
+            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+            Object unmarshaled = unmarshaller.unmarshal(inputStream);
+            if (unmarshaled instanceof NodeBean) {
+                return createNodeFromNodeBean(NodeBeanUtils.nodeBeanToMap((NodeBean) unmarshaled), path, intermediateNodeType);
+            } else {
+                throw new JcrImporterException("The given XML file is not of the right format");
+            }
+        } catch (JAXBException e) {
+            throw new JcrImporterException(e.getMessage(), e);
+        }
+    }
+
+    private void validate(InputStream inputStream) {
+        if (inputStream == null) {
+            throw new JcrImporterException("InputSteam may not be null.");
+        }
+    }
+}
diff --git a/src/test/java/nl/openweb/jcr/AbstractImporterJsonTest.java b/src/test/java/nl/openweb/jcr/AbstractImporterJsonTest.java
index 8d677b2..abc4972 100644
--- a/src/test/java/nl/openweb/jcr/AbstractImporterJsonTest.java
+++ b/src/test/java/nl/openweb/jcr/AbstractImporterJsonTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+
 import java.io.InputStream;
 
 public abstract class AbstractImporterJsonTest extends AbstractImporterTest {
@@ -22,8 +25,8 @@ public abstract class AbstractImporterJsonTest extends AbstractImporterTest {
     @Override
     public void init() throws Exception {
         try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("nodes.json")) {
-            Importer importer = createImporter();
-            rootNode = importer.createNodesFromJson(inputStream);
+            JcrImporter importer = createImporter(JsonImporter.FORMAT);
+            rootNode = importer.createNodes(inputStream);
         }
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/AbstractImporterTest.java b/src/test/java/nl/openweb/jcr/AbstractImporterTest.java
index 4d878c4..6498d31 100644
--- a/src/test/java/nl/openweb/jcr/AbstractImporterTest.java
+++ b/src/test/java/nl/openweb/jcr/AbstractImporterTest.java
@@ -26,6 +26,7 @@
 import java.util.Date;
 import java.util.stream.Collectors;
 
+import nl.openweb.jcr.importer.JcrImporter;
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.Matchers;
 import org.junit.After;
@@ -54,7 +55,7 @@ protected String getImportPath() {
 
     protected abstract void shutdown() throws Exception;
 
-    protected abstract Importer createImporter() throws Exception;
+    protected abstract JcrImporter createImporter(String format) throws Exception;
 
     @Test
     public void propertyTest() throws RepositoryException {
diff --git a/src/test/java/nl/openweb/jcr/AbstractImporterWithPathTest.java b/src/test/java/nl/openweb/jcr/AbstractImporterWithPathTest.java
index 8080238..26f8904 100644
--- a/src/test/java/nl/openweb/jcr/AbstractImporterWithPathTest.java
+++ b/src/test/java/nl/openweb/jcr/AbstractImporterWithPathTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.*;
+import org.junit.Test;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -22,9 +25,6 @@
 import java.io.IOException;
 import java.net.URISyntaxException;
 
-import org.junit.Test;
-
-
 import static org.junit.Assert.assertEquals;
 
 /**
@@ -41,17 +41,21 @@ protected String getImportPath() {
     }
 
     @Override
-    protected Importer createImporter() throws IOException, RepositoryException, URISyntaxException {
+    protected JcrImporter createImporter(String format) throws IOException, RepositoryException, URISyntaxException {
         inMemoryJcrRepository = new InMemoryJcrRepository();
-        return new Importer.Builder(() -> {
             Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-            return session.getRootNode();
-        })
-                .addMixins(true)
+            AbstractJcrImporter importer;
+            if (JsonImporter.FORMAT.equals(format)) {
+                importer = new JsonImporter(session.getRootNode());
+            } else if (XmlImporter.FORMAT.equals(format)) {
+                importer = new XmlImporter(session.getRootNode());
+            } else {
+                throw new IllegalArgumentException("Unknown format: " + format);
+            }
+          return importer.addMixins(true)
                 .addUuid(true)
                 .addUnknownTypes(true)
-                .saveSession(true)
-                .build();
+                .saveSession(true);
     }
 
     @Test
diff --git a/src/test/java/nl/openweb/jcr/AbstractImporterXmlTest.java b/src/test/java/nl/openweb/jcr/AbstractImporterXmlTest.java
index 2834ae5..8d3772f 100644
--- a/src/test/java/nl/openweb/jcr/AbstractImporterXmlTest.java
+++ b/src/test/java/nl/openweb/jcr/AbstractImporterXmlTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 import java.io.InputStream;
 
 public abstract class AbstractImporterXmlTest extends AbstractImporterTest {
@@ -22,8 +25,8 @@ public abstract class AbstractImporterXmlTest extends AbstractImporterTest {
     @Override
     public void init() throws Exception {
         try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("nodes.xml")) {
-            Importer importer = createImporter();
-            rootNode = importer.createNodesFromXml(inputStream);
+            JcrImporter importer = createImporter(XmlImporter.FORMAT);
+            rootNode = importer.createNodes(inputStream);
         }
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/BoundaryCasesTest.java b/src/test/java/nl/openweb/jcr/BoundaryCasesTest.java
index 09c9f24..c8165c8 100644
--- a/src/test/java/nl/openweb/jcr/BoundaryCasesTest.java
+++ b/src/test/java/nl/openweb/jcr/BoundaryCasesTest.java
@@ -15,13 +15,14 @@
  */
 package nl.openweb.jcr;
 
-import javax.jcr.*;
-import java.io.IOException;
-import java.net.URISyntaxException;
-
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
 import org.junit.Assert;
 import org.junit.Test;
 
+import javax.jcr.*;
+import java.io.IOException;
+import java.net.URISyntaxException;
 
 import static org.junit.Assert.assertEquals;
 
@@ -35,10 +36,11 @@ public class BoundaryCasesTest {
     public void unknownPropertyTest() throws RepositoryException, IOException, URISyntaxException {
 
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()) {
-            Node rootNode = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUnknownTypes(true).build().createNodesFromJson("{\"namespace:unknown\": \"value01\", \"namespaceLessProperty\": \"value02\"}");
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            Node rootNode = session.getRootNode();
+            JcrImporter importer = new JsonImporter(rootNode)
+                    .addUnknownTypes(true);
+            importer.createNodes("{\"namespace:unknown\": \"value01\", \"namespaceLessProperty\": \"value02\"}");
             assertEquals("value01", rootNode.getProperty("namespace:unknown").getString());
             assertEquals("value02", rootNode.getProperty("namespaceLessProperty").getString());
 
@@ -48,34 +50,37 @@ public void unknownPropertyTest() throws RepositoryException, IOException, URISy
     @Test
     public void nullValuePropertyTest() throws IOException, RepositoryException, URISyntaxException {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()) {
-            Node rootNode = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUnknownTypes(true).build().createNodesFromJson("{\"namespace:unknown\": null}");
-            Assert.assertFalse(rootNode.hasNode("namespace:unknown"));
-            Assert.assertFalse(rootNode.hasProperty("namespace:unknown"));
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            Node rootNode = session.getRootNode();
+            JcrImporter importer = new JsonImporter(rootNode)
+                    .addUnknownTypes(true);
+            Node node = importer.createNodes("{\"namespace:unknown\": null}");
+            Assert.assertFalse(node.hasNode("namespace:unknown"));
+            Assert.assertFalse(node.hasProperty("namespace:unknown"));
         }
     }
 
     @Test
     public void nullValuePropertyTest2() throws IOException, RepositoryException, URISyntaxException {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()) {
-            Node rootNode = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUnknownTypes(true).build().createNodesFromJson("{\"namespace:unknown\": { \"primitiveType\" : \"Name\", \"value\" : null  }}");
-            Assert.assertFalse(rootNode.hasNode("namespace:unknown"));
-            Assert.assertFalse(rootNode.hasProperty("namespace:unknown"));
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            Node rootNode = session.getRootNode();
+            JcrImporter importer = new JsonImporter(rootNode)
+                    .addUnknownTypes(true);
+            Node node = importer.createNodes("{\"namespace:unknown\": { \"primitiveType\" : \"Name\", \"value\" : null  }}");
+            Assert.assertFalse(node.hasNode("namespace:unknown"));
+            Assert.assertFalse(node.hasProperty("namespace:unknown"));
         }
     }
 
     @Test
     public void multiValuePropertyWithNullValue() throws IOException, RepositoryException, URISyntaxException {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()) {
-            Node rootNode = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUnknownTypes(true).build().createNodesFromJson("{\"namespace:unknown\": [ null , \"value01\", \"value02\"]}");
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            Node rootNode = session.getRootNode();
+            JcrImporter importer = new JsonImporter(rootNode)
+                    .addUnknownTypes(true);
+            importer.createNodes("{\"namespace:unknown\": [ null , \"value01\", \"value02\"]}");
             Property property = rootNode.getProperty("namespace:unknown");
             Assert.assertTrue(property.isMultiple());
             Value[] values = property.getValues();
diff --git a/src/test/java/nl/openweb/jcr/ErrorHandlingTest.java b/src/test/java/nl/openweb/jcr/ErrorHandlingTest.java
index c5a8e0b..7fc13e9 100644
--- a/src/test/java/nl/openweb/jcr/ErrorHandlingTest.java
+++ b/src/test/java/nl/openweb/jcr/ErrorHandlingTest.java
@@ -15,49 +15,32 @@
  */
 package nl.openweb.jcr;
 
-import javax.jcr.RepositoryException;
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+import org.junit.Test;
+
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
-import java.io.IOException;
 import java.io.InputStream;
 
-import org.junit.Test;
-
 public class ErrorHandlingTest {
 
-    @Test(expected = JcrImporterException.class)
-    public void supplierThrowsException() throws IOException, RepositoryException {
-        Importer importer = new Importer.Builder(() -> {
-            throw new RepositoryException();
-        }).build();
-        importer.createNodesFromJson("{}");
-    }
-
     @Test
     public void addUuidWhileNotSupported() throws Exception {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()){
-            Importer importer = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUuid(true).build();
-            importer.createNodesFromJson("{}");
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            JcrImporter importer = new JsonImporter(session.getRootNode());
+            importer.createNodes("{}");
         }
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void nullSupplier() throws IOException, RepositoryException {
-        Importer importer = new Importer.Builder(null).addUuid(true).build();
-        importer.createNodesFromJson("{}");
-    }
-
     @Test(expected = JcrImporterException.class)
     public void nullXmlInputSteamTest() throws Exception {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()){
-            Importer importer = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUuid(false).build();
-            importer.createNodesFromXml((InputStream) null);
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            JcrImporter importer = new XmlImporter(session.getRootNode()).addUuid(false);
+            importer.createNodes((InputStream) null);
         }
     }
 
@@ -65,33 +48,27 @@ public void nullXmlInputSteamTest() throws Exception {
     @Test(expected = JcrImporterException.class)
     public void nullJsonInputSteamTest() throws Exception {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()){
-            Importer importer = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUuid(true).build();
-            importer.createNodesFromJson((InputStream) null);
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            JcrImporter importer = new JsonImporter(session.getRootNode()).addUuid(true);
+            importer.createNodes((InputStream) null);
         }
     }
 
     @Test(expected = JcrImporterException.class)
     public void malformedXmlTest() throws Exception {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()){
-            Importer importer = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUuid(true).build();
-            importer.createNodesFromXml("{}");
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            JcrImporter importer = new XmlImporter(session.getRootNode()).addUuid(true);
+            importer.createNodes("{}");
         }
     }
 
     @Test(expected = JcrImporterException.class)
     public void unexpectedXmlTest() throws Exception {
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()){
-            Importer importer = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            }).addUuid(true).build();
-            importer.createNodesFromXml(
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            JcrImporter importer = new XmlImporter(session.getRootNode()).addUuid(true);
+            importer.createNodes(
                     "" +
                             "" +
                             "rootNodePropertyValue" +
diff --git a/src/test/java/nl/openweb/jcr/ImporterJackrabbitJsonStringTest.java b/src/test/java/nl/openweb/jcr/ImporterJackrabbitJsonStringTest.java
index b99c21e..1364e5c 100644
--- a/src/test/java/nl/openweb/jcr/ImporterJackrabbitJsonStringTest.java
+++ b/src/test/java/nl/openweb/jcr/ImporterJackrabbitJsonStringTest.java
@@ -16,6 +16,10 @@
 
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
@@ -28,22 +32,28 @@ public class ImporterJackrabbitJsonStringTest extends AbstractImporterTest {
     @Override
     public void init() throws Exception {
         String json = loadFileAsString("nodes.json");
-        Importer importer = createImporter();
-        rootNode = importer.createNodesFromJson(json);
+        JcrImporter importer = createImporter(JsonImporter.FORMAT);
+        rootNode = importer.createNodes(json);
     }
 
     @Override
-    protected Importer createImporter() throws IOException, RepositoryException, URISyntaxException {
+    protected JcrImporter createImporter(String format) throws IOException, RepositoryException, URISyntaxException {
         inMemoryJcrRepository = new InMemoryJcrRepository();
-        return new Importer.Builder(() -> {
-            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-            return session.getRootNode();
-        })
+        Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+        JcrImporter importer;
+        if (JsonImporter.FORMAT.equals(format)) {
+            importer = new JsonImporter(session.getRootNode());
+        } else if (XmlImporter.FORMAT.equals(format)) {
+            importer = new XmlImporter(session.getRootNode());
+        } else {
+            throw new IllegalArgumentException("Unknown format: " + format);
+        }
+
+        return importer
                 .addMixins(true)
                 .addUuid(true)
                 .addUnknownTypes(true)
-                .saveSession(true)
-                .build();
+                .saveSession(true);
     }
 
     @Override
diff --git a/src/test/java/nl/openweb/jcr/ImporterJackrabbitTest.java b/src/test/java/nl/openweb/jcr/ImporterJackrabbitTest.java
index ef66ec3..4a9384f 100644
--- a/src/test/java/nl/openweb/jcr/ImporterJackrabbitTest.java
+++ b/src/test/java/nl/openweb/jcr/ImporterJackrabbitTest.java
@@ -16,6 +16,10 @@
 
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
@@ -26,17 +30,24 @@ public class ImporterJackrabbitTest extends AbstractImporterJsonTest {
     private InMemoryJcrRepository inMemoryJcrRepository;
 
     @Override
-    protected Importer createImporter() throws IOException, RepositoryException, URISyntaxException {
+    protected JcrImporter createImporter(String format) throws IOException, RepositoryException, URISyntaxException {
         inMemoryJcrRepository = new InMemoryJcrRepository();
-        return new Importer.Builder(() -> {
-            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-            return session.getRootNode();
-        })
+
+        Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+        JcrImporter importer;
+        if (JsonImporter.FORMAT.equals(format)) {
+            importer = new JsonImporter(session.getRootNode());
+        } else if (XmlImporter.FORMAT.equals(format)) {
+            importer = new XmlImporter(session.getRootNode());
+        } else {
+            throw new IllegalArgumentException("Unknown format: " + format);
+        }
+
+        return importer
                 .addMixins(true)
                 .addUuid(true)
                 .addUnknownTypes(true)
-                .saveSession(true)
-                .build();
+                .saveSession(true);
     }
 
     @Override
diff --git a/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlStringTest.java b/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlStringTest.java
index a352035..eb66f33 100644
--- a/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlStringTest.java
+++ b/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlStringTest.java
@@ -16,6 +16,10 @@
 
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
@@ -28,22 +32,29 @@ public class ImporterJackrabbitXmlStringTest extends AbstractImporterTest {
     @Override
     public void init() throws Exception {
         String xml = loadFileAsString("nodes.xml");
-        Importer importer = createImporter();
-        rootNode = importer.createNodesFromXml(xml);
+        JcrImporter importer = createImporter(XmlImporter.FORMAT);
+        rootNode = importer.createNodes(xml);
     }
 
     @Override
-    protected Importer createImporter() throws IOException, RepositoryException, URISyntaxException {
+    protected JcrImporter createImporter(String format) throws IOException, RepositoryException, URISyntaxException {
         inMemoryJcrRepository = new InMemoryJcrRepository();
-        return new Importer.Builder(() -> {
-            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-            return session.getRootNode();
-        })
+
+        Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+        JcrImporter importer;
+        if (JsonImporter.FORMAT.equals(format)) {
+            importer = new JsonImporter(session.getRootNode());
+        } else if (XmlImporter.FORMAT.equals(format)) {
+            importer = new XmlImporter(session.getRootNode());
+        } else {
+            throw new IllegalArgumentException("Unknown format: " + format);
+        }
+
+        return importer
                 .addMixins(true)
                 .addUuid(true)
                 .addUnknownTypes(true)
-                .saveSession(true)
-                .build();
+                .saveSession(true);
     }
 
     @Override
diff --git a/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlTest.java b/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlTest.java
index 7b62601..5aada45 100644
--- a/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlTest.java
+++ b/src/test/java/nl/openweb/jcr/ImporterJackrabbitXmlTest.java
@@ -16,6 +16,10 @@
 
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
@@ -26,17 +30,24 @@ public class ImporterJackrabbitXmlTest extends AbstractImporterXmlTest {
     private InMemoryJcrRepository inMemoryJcrRepository;
 
     @Override
-    protected Importer createImporter() throws IOException, RepositoryException, URISyntaxException {
+    protected JcrImporter createImporter(String format) throws IOException, RepositoryException, URISyntaxException {
         inMemoryJcrRepository = new InMemoryJcrRepository();
-        return new Importer.Builder(() -> {
-            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-            return session.getRootNode();
-        })
+
+        Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+        JcrImporter importer;
+        if (JsonImporter.FORMAT.equals(format)) {
+            importer = new JsonImporter(session.getRootNode());
+        } else if (XmlImporter.FORMAT.equals(format)) {
+            importer = new XmlImporter(session.getRootNode());
+        } else {
+            throw new IllegalArgumentException("Unknown format: " + format);
+        }
+
+        return importer
                 .addMixins(true)
                 .addUuid(true)
                 .addUnknownTypes(true)
-                .saveSession(true)
-                .build();
+                .saveSession(true);
     }
 
     @Override
diff --git a/src/test/java/nl/openweb/jcr/ImporterReflectionTest.java b/src/test/java/nl/openweb/jcr/ImporterReflectionTest.java
index fde0c12..de1a7b4 100644
--- a/src/test/java/nl/openweb/jcr/ImporterReflectionTest.java
+++ b/src/test/java/nl/openweb/jcr/ImporterReflectionTest.java
@@ -15,6 +15,10 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import org.junit.Test;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -22,9 +26,6 @@
 import java.io.IOException;
 import java.net.URISyntaxException;
 
-import org.junit.Test;
-
-
 import static org.junit.Assert.assertEquals;
 
 /**
@@ -37,16 +38,13 @@ public class ImporterReflectionTest {
     public void importerTest() throws RepositoryException, IOException, URISyntaxException {
 
         try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()) {
-            Importer importer = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                return session.getRootNode();
-            })
+            Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
+            JcrImporter importer = new JsonImporter(session.getRootNode())
                     .addMixins(true)
                     .addUuid(true)
                     .addUnknownTypes(true)
-                    .saveSession(true)
-                    .build();
-            Node rootNode = importer.createNodesFromJson("{\n" +
+                    .saveSession(true);
+            Node rootNode = importer.createNodes("{\n" +
                     "  \"subnode\": {\n" +
                     "    \"jcr:uuid\": \"e01ee3c8-dcbf-4bf8-9dc7-e08a425c259e\",\n" +
                     "    \"ns:stringProperty\": \"value\",\n" +
diff --git a/src/test/java/nl/openweb/jcr/ImporterSlingTest.java b/src/test/java/nl/openweb/jcr/ImporterSlingTest.java
index 76b189b..ca02536 100644
--- a/src/test/java/nl/openweb/jcr/ImporterSlingTest.java
+++ b/src/test/java/nl/openweb/jcr/ImporterSlingTest.java
@@ -16,25 +16,34 @@
 
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+import org.apache.sling.testing.mock.jcr.MockJcr;
+
 import javax.jcr.*;
 import java.io.IOException;
 
-import org.apache.sling.testing.mock.jcr.MockJcr;
-
 public class ImporterSlingTest extends AbstractImporterJsonTest {
 
 
     @Override
-    protected Importer createImporter() throws IOException, RepositoryException {
-        return new Importer.Builder(() -> {
-            Session session = MockJcr.newSession();
-            return session.getRootNode();
-        })
+    protected JcrImporter createImporter(String format) throws IOException, RepositoryException {
+        Session session = MockJcr.newSession();
+        JcrImporter importer;
+        if (JsonImporter.FORMAT.equals(format)) {
+            importer = new JsonImporter(session.getRootNode());
+        } else if (XmlImporter.FORMAT.equals(format)) {
+            importer = new XmlImporter(session.getRootNode());
+        } else {
+            throw new IllegalArgumentException("Unknown format: " + format);
+        }
+
+        return importer
                 .addMixins(false)
                 .addUuid(true)
                 .setProtectedProperties(true)
-                .saveSession(false)
-                .build();
+                .saveSession(false);
     }
 
     @Override
diff --git a/src/test/java/nl/openweb/jcr/ImporterSlingXmlTest.java b/src/test/java/nl/openweb/jcr/ImporterSlingXmlTest.java
index 9e520df..7b5e7b3 100644
--- a/src/test/java/nl/openweb/jcr/ImporterSlingXmlTest.java
+++ b/src/test/java/nl/openweb/jcr/ImporterSlingXmlTest.java
@@ -16,24 +16,33 @@
 
 package nl.openweb.jcr;
 
-import javax.jcr.*;
-import java.io.IOException;
-
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+import nl.openweb.jcr.importer.XmlImporter;
 import org.apache.sling.testing.mock.jcr.MockJcr;
 
+import javax.jcr.*;
+
 public class ImporterSlingXmlTest extends AbstractImporterXmlTest {
 
 
     @Override
-    protected Importer createImporter() throws IOException, RepositoryException {
-        return new Importer.Builder(() -> {
-            Session session = MockJcr.newSession();
-            return session.getRootNode();
-        })
+    protected JcrImporter createImporter(String format) throws RepositoryException {
+        Session session = MockJcr.newSession();
+        JcrImporter importer;
+        if (JsonImporter.FORMAT.equals(format)) {
+            importer = new JsonImporter(session.getRootNode());
+        } else if (XmlImporter.FORMAT.equals(format)) {
+            importer = new XmlImporter(session.getRootNode());
+        } else {
+            throw new IllegalArgumentException("Unknown format: " + format);
+        }
+
+        return importer
                 .addMixins(false)
                 .addUuid(true)
-                .setProtectedProperties(true)
-                .build();
+                .setProtectedProperties(true);
+
     }
 
     @Override
diff --git a/src/test/java/nl/openweb/jcr/JsonImporterWitPathTest.java b/src/test/java/nl/openweb/jcr/JsonImporterWitPathTest.java
index b144b38..aab57f3 100644
--- a/src/test/java/nl/openweb/jcr/JsonImporterWitPathTest.java
+++ b/src/test/java/nl/openweb/jcr/JsonImporterWitPathTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+
 import java.io.InputStream;
 
 /**
@@ -26,9 +29,9 @@ public class JsonImporterWitPathTest extends AbstractImporterWithPathTest {
     @Override
     public void init() throws Exception {
         try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("nodes.json")) {
-            Importer importer = createImporter();
-            importer.createNodesFromJson("{}", "/some");
-            rootNode = importer.createNodesFromJson(inputStream, getImportPath());
+            JcrImporter importer = createImporter(JsonImporter.FORMAT);
+            importer.createNodes("{}", "/some");
+            rootNode = importer.createNodes(inputStream, getImportPath());
         }
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathAndTypeTest.java b/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathAndTypeTest.java
index 80d086b..42c571c 100644
--- a/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathAndTypeTest.java
+++ b/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathAndTypeTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+
 /**
  * @author Ebrahim Aharpour
  * @since 9/3/2017
@@ -30,7 +33,7 @@ protected String expectedIntermediateNodeType() {
 
     @Override
     public void init() throws Exception {
-        Importer importer = createImporter();
-        rootNode = importer.createNodesFromJson(loadFileAsString("nodes.json"), getImportPath(), INTERMEDIATE_TYPE);
+        JcrImporter importer = createImporter(JsonImporter.FORMAT);
+        rootNode = importer.createNodes(loadFileAsString("nodes.json"), getImportPath(), INTERMEDIATE_TYPE);
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathTest.java b/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathTest.java
index 95497e1..26808c5 100644
--- a/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathTest.java
+++ b/src/test/java/nl/openweb/jcr/JsonStringImporterWitPathTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.JsonImporter;
+
 /**
  * @author Ebrahim Aharpour
  * @since 9/3/2017
@@ -23,7 +26,7 @@ public class JsonStringImporterWitPathTest extends AbstractImporterWithPathTest
 
     @Override
     public void init() throws Exception {
-        Importer importer = createImporter();
-        rootNode = importer.createNodesFromJson(loadFileAsString("nodes.json"), getImportPath());
+        JcrImporter importer = createImporter(JsonImporter.FORMAT);
+        rootNode = importer.createNodes(loadFileAsString("nodes.json"), getImportPath());
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/XmlImporterWitPathTest.java b/src/test/java/nl/openweb/jcr/XmlImporterWitPathTest.java
index 264e2ae..c286b19 100644
--- a/src/test/java/nl/openweb/jcr/XmlImporterWitPathTest.java
+++ b/src/test/java/nl/openweb/jcr/XmlImporterWitPathTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 import java.io.InputStream;
 
 /**
@@ -26,8 +29,8 @@ public class XmlImporterWitPathTest extends AbstractImporterWithPathTest {
     @Override
     public void init() throws Exception {
         try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("nodes.xml")) {
-            Importer importer = createImporter();
-            rootNode = importer.createNodesFromXml(inputStream, getImportPath());
+            JcrImporter importer = createImporter(XmlImporter.FORMAT);
+            rootNode = importer.createNodes(inputStream, getImportPath());
         }
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathAndTypeTest.java b/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathAndTypeTest.java
index 36a8819..c04043f 100644
--- a/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathAndTypeTest.java
+++ b/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathAndTypeTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 /**
  * @author Ebrahim Aharpour
  * @since 9/3/2017
@@ -30,7 +33,7 @@ protected String expectedIntermediateNodeType() {
 
     @Override
     public void init() throws Exception {
-        Importer importer = createImporter();
-        rootNode = importer.createNodesFromXml(loadFileAsString("nodes.xml"), getImportPath(), INTERMEDIATE_TYPE);
+        JcrImporter importer = createImporter(XmlImporter.FORMAT);
+        rootNode = importer.createNodes(loadFileAsString("nodes.xml"), getImportPath(), INTERMEDIATE_TYPE);
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathTest.java b/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathTest.java
index 31df51b..a37db4a 100644
--- a/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathTest.java
+++ b/src/test/java/nl/openweb/jcr/XmlStringImporterWitPathTest.java
@@ -15,6 +15,9 @@
  */
 package nl.openweb.jcr;
 
+import nl.openweb.jcr.importer.JcrImporter;
+import nl.openweb.jcr.importer.XmlImporter;
+
 /**
  * @author Ebrahim Aharpour
  * @since 9/3/2017
@@ -23,7 +26,7 @@ public class XmlStringImporterWitPathTest extends AbstractImporterWithPathTest {
 
     @Override
     public void init() throws Exception {
-        Importer importer = createImporter();
-        rootNode = importer.createNodesFromXml(loadFileAsString("nodes.xml"), getImportPath());
+        JcrImporter importer = createImporter(XmlImporter.FORMAT);
+        rootNode = importer.createNodes(loadFileAsString("nodes.xml"), getImportPath());
     }
 }
diff --git a/src/test/java/nl/openweb/jcr/importerSupplierTest.java b/src/test/java/nl/openweb/jcr/importerSupplierTest.java
deleted file mode 100644
index 351a24a..0000000
--- a/src/test/java/nl/openweb/jcr/importerSupplierTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2017 Open Web IT B.V. (https://www.openweb.nl/)
- *
- * 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.
- */
-
-package nl.openweb.jcr;
-
-import javax.jcr.Node;
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
-
-import org.junit.Test;
-
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/**
- * @author Ebrahim Aharpour
- * @since 12/7/2017
- */
-public class importerSupplierTest {
-    private int counter = 0;
-
-    @Test
-    public void makingSureThatSupplierIsCallOnlyOnce() throws Exception {
-        try (InMemoryJcrRepository inMemoryJcrRepository = new InMemoryJcrRepository()) {
-
-            Importer importer = new Importer.Builder(() -> {
-                Session session = inMemoryJcrRepository.login(new SimpleCredentials("admin", "admin".toCharArray()));
-                counter++;
-                return session.getRootNode();
-            })
-                    .addMixins(true)
-                    .addUuid(true)
-                    .addUnknownTypes(true)
-                    .saveSession(true)
-                    .build();
-
-            importer.createNodesFromJson("{\"node\": {\"property\":\"value\"}}");
-            Node rootNode = importer.createNodesFromJson("{\"node2\": {\"property\":\"value\"}}", "/some/path");
-            assertEquals(1, counter);
-
-            assertEquals("/", rootNode.getPath());
-            assertTrue( rootNode.hasNode("node"));
-            assertTrue("/", rootNode.hasNode("some/path/node2"));
-
-        }
-
-    }
-
-}