diff --git a/pom.xml b/pom.xml
index 1123441..cba0071 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.sling</groupId>
         <artifactId>sling-bundle-parent</artifactId>
-        <version>36</version>
+        <version>38</version>
         <relativePath />
     </parent>
 
@@ -69,12 +69,11 @@
         </dependency>
     
         <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>15.0</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.1</version>
             <scope>compile</scope>
         </dependency>
-    
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
@@ -102,6 +101,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>15.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
diff --git a/src/main/java/org/apache/sling/testing/mock/jcr/MockNamespaceRegistry.java b/src/main/java/org/apache/sling/testing/mock/jcr/MockNamespaceRegistry.java
index 477a2fe..26763b2 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/MockNamespaceRegistry.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/MockNamespaceRegistry.java
@@ -23,15 +23,15 @@
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.RepositoryException;
 
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
+import org.apache.commons.collections4.BidiMap;
+import org.apache.commons.collections4.bidimap.TreeBidiMap;
 
 /**
  * Mock {@link NamespaceRegistry} implementation.
  */
 class MockNamespaceRegistry implements NamespaceRegistry {
 
-    private final BiMap<String, String> namespacePrefixMapping = HashBiMap.create();
+    private final BidiMap<String, String> namespacePrefixMapping = new TreeBidiMap<>();
 
     public MockNamespaceRegistry() {
         this.namespacePrefixMapping.put("jcr", "http://www.jcp.org/jcr/1.0");
@@ -44,7 +44,7 @@
 
     @Override
     public String getPrefix(final String uri) throws RepositoryException {
-        return this.namespacePrefixMapping.inverse().get(uri);
+        return this.namespacePrefixMapping.getKey(uri);
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/testing/mock/jcr/MockQuery.java b/src/main/java/org/apache/sling/testing/mock/jcr/MockQuery.java
index 0e56026..cb6b385 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/MockQuery.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/MockQuery.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.testing.mock.jcr;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -30,8 +31,6 @@
 
 import org.osgi.annotation.versioning.ConsumerType;
 
-import com.google.common.collect.ImmutableMap;
-
 /**
  * Mock implementation of {@link Query}.
  */
@@ -97,7 +96,7 @@
     }
     
     public Map<String, Value> getBindVariables() throws RepositoryException {
-        return ImmutableMap.copyOf(variables);
+        return Collections.unmodifiableMap(variables);
     }
     
 
diff --git a/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryManager.java b/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryManager.java
index ddf2c12..6682321 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryManager.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryManager.java
@@ -19,7 +19,10 @@
 package org.apache.sling.testing.mock.jcr;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -31,8 +34,6 @@
 
 import org.apache.commons.lang3.StringUtils;
 
-import com.google.common.collect.ImmutableList;
-
 /**
  * Mock implementation of {@link QueryManager}.
  */
@@ -41,12 +42,12 @@
     private List<MockQueryResultHandler> resultHandlers = new ArrayList<MockQueryResultHandler>();
     
     @SuppressWarnings("deprecation")
-    private static final List<String> SUPPORTED_QUERY_LANGUAGES = ImmutableList.of(
+    private static final List<String> SUPPORTED_QUERY_LANGUAGES = Stream.of(
       Query.JCR_SQL2,
       Query.JCR_JQOM,
       Query.XPATH,
       Query.SQL
-    );
+    ).collect(Collectors.toList());
     
     @Override
     public Query createQuery(String statement, String language) throws RepositoryException {
@@ -73,7 +74,7 @@
             }
         }
         // fallback to empty result
-        return new MockQueryResult(ImmutableList.<Node>of());
+        return new MockQueryResult(Collections.emptyList());
     }
 
     // --- unsupported operations ---
diff --git a/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryResult.java b/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryResult.java
index 3ab0842..84cd1b9 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryResult.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/MockQueryResult.java
@@ -18,24 +18,19 @@
  */
 package org.apache.sling.testing.mock.jcr;
 
+import java.util.Collections;
 import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.query.QueryResult;
-import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
 
 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 import org.apache.jackrabbit.commons.iterator.RowIteratorAdapter;
-import org.jetbrains.annotations.Nullable;
 import org.osgi.annotation.versioning.ProviderType;
 
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
 /**
  * Mock implementation of {@link QueryResult}.
  * Allows to manually set the expected result, optional with column names 
@@ -48,7 +43,7 @@
     private final List<String> columnNames;
     
     public MockQueryResult(List<Node> nodes) {
-        this(nodes, ImmutableList.<String>of());
+        this(nodes, Collections.emptyList());
     }
 
     public MockQueryResult(List<Node> nodes, List<String> columnNames) {
@@ -63,12 +58,9 @@
 
     @Override
     public RowIterator getRows() throws RepositoryException {
-        return new RowIteratorAdapter(Lists.transform(nodes, new Function<Node, Row>() {
-            @Override
-            public Row apply(@Nullable Node node) {
-                return new MockRow(columnNames, node);
-            }
-        }));
+        return new RowIteratorAdapter(nodes.stream()
+                .map(node -> new MockRow(columnNames, node))
+                .iterator());
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/testing/mock/jcr/MockSession.java b/src/main/java/org/apache/sling/testing/mock/jcr/MockSession.java
index f650365..6271c03 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/MockSession.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/MockSession.java
@@ -46,8 +46,6 @@
 import org.apache.jackrabbit.value.ValueFactoryImpl;
 import org.xml.sax.ContentHandler;
 
-import com.google.common.collect.ImmutableSet;
-
 /**
  * Mock {@link Session} implementation. This instance holds the JCR data in a
  * simple ordered map.
@@ -228,8 +226,8 @@
         }
 
         // Find all items matching the source
-        List<ItemData> itemsToMove = new LinkedList<>();
-        for (String key : ImmutableSet.copyOf(items.keySet())) {
+        List<ItemData> itemsToMove = new LinkedList<>();        
+        for (String key : new ArrayList<>(items.keySet())) {
             if (key.startsWith(source.getPath())) {
                 itemsToMove.add(items.remove(key));
             }
@@ -244,7 +242,7 @@
         }
 
         // Cycle items and add them back at the end
-        for (String key : ImmutableSet.copyOf(items.keySet())) {
+        for (String key : new ArrayList<>(items.keySet())) {
             if (key.equals(destination.getPath())) {
                 // Move items before destination
                 for (ItemData item : itemsToMove) {
