diff --git a/src/main/java/org/apache/sling/api/resource/ResourceResolver.java b/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
index 8a2b27d..73be59e 100644
--- a/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
+++ b/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
@@ -22,12 +22,13 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.sling.api.adapter.Adaptable;
+import org.apache.sling.api.resource.mapping.PathRewriter;
 import org.apache.sling.api.resource.mapping.ResourceMapper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
@@ -172,16 +173,39 @@
     String PROPERTY_RESOURCE_TYPE = "sling:resourceType";
 
     /**
-     * Resolves the resource from the given <code>absPath</code> optionally
-     * taking <code>HttpServletRequest</code> into account, such as the value of
-     * the <code>Host</code> request header. Returns a
+     * Resolves the resource from the given absolute path. Returns a
      * {@link NonExistingResource} if the path cannot be resolved to an existing
      * and accessible resource.
      * <p>
-     * The difference between this method and the {@link #resolve(String)}
-     * method is, that this method may take request properties like the scheme,
-     * the host header or request parameters into account to resolve the
-     * resource.
+     *
+     * @param absPath The absolute path to be resolved to a resource. If this
+     *            parameter is <code>null</code>, it is assumed to address the
+     *            root of the resource tree. If the path is relative it is
+     *            assumed relative to the root, that is a slash is prepended to
+     *            the path before resolving it.
+     * @return The {@link Resource} addressed by the <code>absPath</code> or a
+     *         {@link NonExistingResource} if no such resource can be resolved.
+     * @throws org.apache.sling.api.SlingException Or a subclass thereof may be
+     *             thrown if an error occurs trying to resolve the resource.
+     * @throws IllegalStateException if this resource resolver has already been
+     *             {@link #close() closed}.
+     * @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+      * Resolve a resource based on the path.
+     * @param path The full path
+     * @return The resolved resource
+     * @since 2.13.0
+     */
+    @NotNull Resource resolveResource(@NotNull String path);
+
+    /**
+     * Return the path rewriter associated with this resolver
+     * @return The path rewriter.
+     * @since 2.13.0
+     */
+    @NotNull PathRewriter getPathRewriter();
+
+    /**
+     * Same as calling rewrite on the path rewriter and resolveResource with the result.
      *
      * @param request The http servlet request object providing more hints at
      *            how to resolve the <code>absPath</code>. This parameter may be
@@ -200,22 +224,13 @@
      *             {@link #close() closed}.
      * @since 2.0.4 (Sling API Bundle 2.0.4)
      * @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+     * @deprecated
      */
+    @Deprecated
     @NotNull Resource resolve(@NotNull HttpServletRequest request, @NotNull String absPath);
 
     /**
-     * Resolves the resource from the given absolute path. Returns a
-     * {@link NonExistingResource} if the path cannot be resolved to an existing
-     * and accessible resource.
-     * <p>
-     * This method is intended to apply the same algorithm to the absolute path
-     * as is used by the {@link #resolve(HttpServletRequest)} method except for
-     * cases where the latter uses request property such as request headers or
-     * request parameters to resolve a resource.
-     * <p>
-     * It is ok for the implementation of this method to just call the
-     * {@link #resolve(HttpServletRequest, String)} method with
-     * <code>null</code> as the request argument.
+     * Same as calling rewrite on the path rewriter and resolveResource with the result.
      *
      * @param absPath The absolute path to be resolved to a resource. If this
      *            parameter is <code>null</code>, it is assumed to address the
@@ -229,7 +244,9 @@
      * @throws IllegalStateException if this resource resolver has already been
      *             {@link #close() closed}.
      * @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+     * @deprecated
      */
+    @Deprecated
     @NotNull Resource resolve(@NotNull String absPath);
 
     /**
@@ -262,60 +279,23 @@
     @NotNull Resource resolve(@NotNull HttpServletRequest request);
 
     /**
-     * Returns a (request) path mapped from the (resource) path applying the reverse
-     * mapping used by the {@link #resolve(String)} such that when the path is
-     * given to the {@link #resolve(String)} method the same resource is
-     * returned.
-     * <p>
-     * Note, that technically the <code>resourcePath</code> need not refer to an
-     * existing resource. This method just applies the mappings and returns the
-     * resulting string. If the <code>resourcePath</code> does not address an
-     * existing resource roundtripping may of course not work and calling
-     * {@link #resolve(String)} with the path returned may return
-     * <code>null</code>.
-     * <p>
-     * This method is intended as the reverse operation of the
-     * {@link #resolve(String)} method.
-     * <p>
-     * This method also does percent-encoding before returning the (request) path
-     * (with charset UTF-8). Due to this calling this method multiple times in a nested 
-     * fashion might lead to an invalid (request) path which can subsequently not
-     * be resolved via {@link #resolve(String)}. 
+     * Same as calling reverseRewrite on the path rewriter
      *
      * @param resourcePath The path for which to return a mapped path.
      * @return The mapped path.
      * @throws IllegalStateException if this resource resolver has already been
      *             {@link #close() closed}.
-     * 
+     *
      * @see ResourceMapper#getMapping(String, HttpServletRequest)
      * @see <a href="https://tools.ietf.org/html/rfc3986#section-2.1">Percent-Encoding</a>
      * @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+     * @deprecated
      */
+    @Deprecated
     @NotNull String map(@NotNull String resourcePath);
 
     /**
-     * Returns an URL mapped from the (resource) path applying the reverse
-     * mapping used by the {@link #resolve(HttpServletRequest, String)} such
-     * that when the path is given to the
-     * {@link #resolve(HttpServletRequest, String)} method the same resource is
-     * returned.
-     * <p>
-     * Note, that technically the <code>resourcePath</code> need not refer to an
-     * existing resource. This method just applies the mappings and returns the
-     * resulting string. If the <code>resourcePath</code> does not address an
-     * existing resource roundtripping may of course not work and calling
-     * {@link #resolve(HttpServletRequest, String)} with the path returned may
-     * return <code>null</code>.
-     * <p>
-     * This method is intended as the reverse operation of the
-     * {@link #resolve(HttpServletRequest, String)} method. As such the URL
-     * returned is expected to be an absolute URL including scheme, host, any
-     * servlet context path and the actual path used to resolve the resource.
-     * <p>
-     * This method also does percent-encoding before returning the URL
-     * (with charset UTF-8). Due to this calling this method multiple times in a nested 
-     * fashion might lead to an invalid URL which can subsequently not
-     * be resolved via {@link #resolve(String)}. 
+     * Same as calling reverseRewrite on the path rewriter
      *
      * @param request The http servlet request object which may be used to apply
      *            more mapping functionality.
@@ -324,11 +304,13 @@
      * @throws IllegalStateException if this resource resolver has already been
      *             {@link #close() closed}.
      * @since 2.0.4 (Sling API Bundle 2.0.4)
-     * 
+     *
      * @see ResourceMapper#getMapping(String, HttpServletRequest)
      * @see <a href="https://tools.ietf.org/html/rfc3986#section-2.1">Percent-Encoding</a>
      * @see <a href="https://sling.apache.org/documentation/the-sling-engine/mappings-for-resource-resolution.html">Mappings for Resource Resolution</a>
+     * @deprecated
      */
+    @Deprecated
     @Nullable String map(@NotNull HttpServletRequest request, @NotNull String resourcePath);
 
     /**
diff --git a/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java b/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
index 111c34c..8ce3967 100644
--- a/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
+++ b/src/main/java/org/apache/sling/api/resource/ResourceResolverFactory.java
@@ -21,9 +21,8 @@
 import java.util.List;
 import java.util.Map;
 
-import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.NotNull;
-
+import org.jetbrains.annotations.Nullable;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
@@ -100,6 +99,13 @@
     String SUBSERVICE = "sling.service.subservice";
 
     /**
+     * Name of the authentication information property to pass in a
+     * dedicated PathRewriter object
+     * @since 2.13.0
+     */
+    String PATH_REWRITER = "service.path.rewriter";
+
+    /**
      * Returns a new {@link ResourceResolver} instance with further
      * configuration taken from the given <code>authenticationInfo</code> map.
      * Generally this map will contain a user name and password to authenticate.
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/PathRewriter.java b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriter.java
new file mode 100644
index 0000000..47d9124
--- /dev/null
+++ b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriter.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.api.resource.mapping;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * @since 1.1.0
+ */
+@ProviderType
+public interface PathRewriter {
+
+    @NotNull String rewrite(@NotNull String path);
+
+    @NotNull String rewrite(@NotNull HttpServletRequest request, @NotNull String path);
+
+    @NotNull String reverseRewrite(@NotNull String path);
+
+    @NotNull String reverseRewrite(@NotNull HttpServletRequest request, @NotNull String path);
+
+
+    @Nullable HttpServletRequest getDefaultRequest();
+}
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/PathRewriterFactory.java b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriterFactory.java
new file mode 100644
index 0000000..b6c3d88
--- /dev/null
+++ b/src/main/java/org/apache/sling/api/resource/mapping/PathRewriterFactory.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.api.resource.mapping;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * @since 1.1.0
+ */
+@ProviderType
+public interface PathRewriterFactory {
+
+    @NotNull PathRewriter newPathWriter();
+
+    @NotNull PathRewriter newPathWriter(@NotNull HttpServletRequest request);
+}
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java b/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java
index a302469..b218bc6 100644
--- a/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java
+++ b/src/main/java/org/apache/sling/api/resource/mapping/ResourceMapper.java
@@ -22,45 +22,44 @@
 
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.sling.api.resource.ResourceResolver;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * Allows access to resource mappings
- * 
+ *
  * <p>This interface superceeds the resource mapping functionality present
- * in the {@link ResourceResolver}. Although the methods present in that
+ * in the {@link org.apache.sling.api.resource.ResourceResolver}. Although the methods present in that
  * interface will continue to work, the resource mapper will provide better
  * APIs to access the resource mappings.</p>
- * 
- * <p>Implementations of this class are obtained by adapting a {@link ResourceResolver}
+ *
+ * <p>Implementations of this class are obtained by adapting a {@link org.apache.sling.api.resource.ResourceResolver}
  * instance. As such, the mappings returned by its methods reflect the repository
- * permissions of the underyling resolver instance.</p> 
+ * permissions of the underyling resolver instance.</p>
  */
 @ProviderType
 public interface ResourceMapper {
-    
+
     /**
      * Returns a path mapped from the (resource) path applying the reverse
-     * mapping used by the {@link ResourceResolver#resolve(String)} such that when the path is
-     * given to the {@link ResourceResolver#resolve(String)} method the same resource is
+     * mapping used by the {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} such that when the path is
+     * given to the {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} method the same resource is
      * returned.
      * <p>
      * Note, that technically the <code>resourcePath</code> need not refer to an
      * existing resource. This method just applies the mappings and returns the
      * resulting string. If the <code>resourcePath</code> does not address an
      * existing resource roundtripping may of course not work and calling
-     * {@link ResourceResolver#resolve(String)} with the path returned may return
+     * {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} with the path returned may return
      * <code>null</code>.
      * <p>
      * This method is intended as the reverse operation of the
-     * {@link ResourceResolver#resolve(String)} method.
+     * {@link org.apache.sling.api.resource.ResourceResolver#resolve(String)} method.
      *
      * @param resourcePath The path for which to return a mapped path.
      * @return The mapped path.
      * @throws IllegalStateException if the underlying resource resolver has already been
-     *             {@link ResourceResolver#close() closed}.
+     *             {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
      *
      * @since 1.0.0 (Sling API Bundle 2.19.0)
      */
@@ -68,20 +67,20 @@
 
     /**
      * Returns an URL mapped from the (resource) path applying the reverse
-     * mapping used by the {@link ResourceResolver#resolve(HttpServletRequest, String)} such
+     * mapping used by the {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} such
      * that when the path is given to the
-     * {@link ResourceResolver#resolve(HttpServletRequest, String)} method the same resource is
+     * {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} method the same resource is
      * returned.
      * <p>
      * Note, that technically the <code>resourcePath</code> need not refer to an
      * existing resource. This method just applies the mappings and returns the
      * resulting string. If the <code>resourcePath</code> does not address an
      * existing resource roundtripping may of course not work and calling
-     * {@link ResourceResolver#resolve(HttpServletRequest, String)} with the path returned may
+     * {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} with the path returned may
      * return <code>null</code>.
      * <p>
      * This method is intended as the reverse operation of the
-     * {@link ResourceResolver#resolve(HttpServletRequest, String)} method. As such the URL
+     * {@link org.apache.sling.api.resource.ResourceResolver#resolve(HttpServletRequest, String)} method. As such the URL
      * returned is expected to be an absolute URL including scheme, host, any
      * servlet context path and the actual path used to resolve the resource.
 
@@ -90,46 +89,46 @@
      *            more mapping functionality.
      * @return The mapped URL.
      * @throws IllegalStateException if the underlying resource resolver has already been
-     *             {@link ResourceResolver#close() closed}.
+     *             {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
      * @since 1.0.0 (Sling API Bundle 2.19.0)
      */
     @NotNull String getMapping(@NotNull String resourcePath, @NotNull HttpServletRequest request);
-    
+
     /**
      * Returns all possible mappings for a given {@code resourcePath} as paths.
-     * 
+     *
      * <p>
      * This method differs from the {@link #getMapping(String)} variant
      * by guaranteeing that all possible mappings are returned for a specified path.
-     * 
+     *
      * <p>
      * The mappings are not returned in any particular order.
-     * 
+     *
      * @param resourcePath The path for which to return a mapped path.
      * @return a collection of mapped URLs, in no particular order. May not be null or empty.
      * @throws IllegalStateException if the underlying resource resolver has already been
-     *             {@link ResourceResolver#close() closed}.
+     *             {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
      * @since 1.0.0 (Sling API Bundle 2.19.0)
      */
     Collection<String> getAllMappings(@NotNull String resourcePath);
 
     /**
      * Returns all possible mappings for a given {@code resourcePath} as URLs.
-     * 
+     *
      * <p>
      * This method differs from the {@link #getMapping(String, HttpServletRequest)} variant
      * by guaranteeing that all possible mappings are returned for a specified path.
-     * 
+     *
      * <p>
      * The mappings are not returned in any particular order.
-     * 
+     *
      * @param resourcePath The path for which to return a mapped path.
      * @param request The http servlet request object which may be used to apply
      *            more mapping functionality.
 
      * @return a collection of mapped URLs, in no particular order. May not be null or empty.
      * @throws IllegalStateException if the underlying resource resolver has already been
-     *             {@link ResourceResolver#close() closed}.
+     *             {@link org.apache.sling.api.resource.ResourceResolver#close() closed}.
      * @since 1.0.0 (Sling API Bundle 2.19.0)
      */
     Collection<String> getAllMappings(@NotNull String resourcePath, @NotNull HttpServletRequest request);
diff --git a/src/main/java/org/apache/sling/api/resource/mapping/package-info.java b/src/main/java/org/apache/sling/api/resource/mapping/package-info.java
index e871225..00a1ea1 100644
--- a/src/main/java/org/apache/sling/api/resource/mapping/package-info.java
+++ b/src/main/java/org/apache/sling/api/resource/mapping/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.0.1")
+@Version("1.1.0")
 package org.apache.sling.api.resource.mapping;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/api/resource/package-info.java b/src/main/java/org/apache/sling/api/resource/package-info.java
index 7bd85e6..ac05b61 100644
--- a/src/main/java/org/apache/sling/api/resource/package-info.java
+++ b/src/main/java/org/apache/sling/api/resource/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("2.12.2")
+@Version("2.13.0")
 package org.apache.sling.api.resource;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java b/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java
index 67c2fbf..5f650b8 100644
--- a/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java
+++ b/src/main/java/org/apache/sling/api/wrappers/ResourceResolverWrapper.java
@@ -18,7 +18,7 @@
 
 import java.util.Iterator;
 import java.util.Map;
-import org.jetbrains.annotations.NotNull;
+
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.sling.api.resource.LoginException;
@@ -26,6 +26,8 @@
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceWrapper;
+import org.apache.sling.api.resource.mapping.PathRewriter;
+import org.jetbrains.annotations.NotNull;
 import org.osgi.annotation.versioning.ConsumerType;
 
 /**
@@ -107,6 +109,16 @@
         return wrapped.map(request, resourcePath);
     }
 
+    @Override
+    public @NotNull Resource resolveResource(@NotNull String path) {
+        return wrapped.resolveResource(path);
+    }
+
+    @Override
+    public @NotNull PathRewriter getPathRewriter() {
+        return wrapped.getPathRewriter();
+    }
+
     /**
      * Wraps and returns the {@code Resource} obtained by calling {@code getResource} on the wrapped resource resolver.
      *
