diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/helper/StarResource.java b/src/main/java/org/apache/sling/resourceresolver/impl/helper/StarResource.java
index 75b3bfd..9b1c029 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/helper/StarResource.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/helper/StarResource.java
@@ -50,6 +50,8 @@
     /**
      * True if a StarResource should be used for the given request, if a real
      * Resource was not found
+     * @param path the path 
+     * @return true if the StarResource should be used, false otherwise
      */
     public static boolean appliesTo(String path) {
         return path.contains(SLASH_STAR) || path.endsWith(SLASH_STAR);
@@ -58,6 +60,8 @@
     /**
      * Returns true if the path of the resource ends with the
      * {@link #SLASH_STAR} and therefore should be considered a star resource.
+     * @param res the resource
+     * @return true if the StarResource should be used, false otherwise
      */
     public static boolean isStarResource(Resource res) {
         return res.getPath().endsWith(SLASH_STAR);
@@ -73,6 +77,7 @@
      * Calls {@link org.apache.sling.api.resource.ResourceUtil#getResourceSuperType(ResourceResolver, String)}
      * method to dynamically resolve the resource super type of this star
      * resource.
+     * @return the resource supertype
      */
     @Override
     public String getResourceSuperType() {
@@ -93,7 +98,10 @@
         return super.adaptTo(type);
     }
 
-    /** Get our ResourceMetadata for given path */
+    /** Get our ResourceMetadata for given path 
+     * @path the path
+     * @return the resource metadata for the given path
+     * */
     static ResourceMetadata getResourceMetadata(String path) {
         ResourceMetadata result = new ResourceMetadata();
 
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
index 26bebd6..aa22562 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java
@@ -79,13 +79,14 @@
     /**
      * A list of allow and deny list prefixes all ending with a slash.
      * If <code>null</code> is returned, all paths are allowed.
+     * @return the list of prefixes or {code}null{code}
      */
     List<VanityPathConfig> getVanityPathConfig();
 
     /**
      * A set of allow prefixes all ending with a slash.
      * If empty set is returned, all paths are allowed.
-     * @return
+     * @return the set of prefixes
      */
     Set<String> getAllowedAliasLocations();
 }
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
index a1372de..ee62ea1 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
@@ -222,6 +222,7 @@
      * Actual initializer. Guards itself against concurrent use by using a
      * ReentrantLock. Does nothing if the resource resolver has already been
      * null-ed.
+     * @return true if the optimizedAliasResolution is enabled, false otherwise
      */
     protected boolean doInit() {
 
@@ -270,7 +271,7 @@
      * using a ReentrantLock. Does nothing if the resource resolver has already
      * been null-ed.
      *
-     * @throws IOException
+     * @throws IOException in case of problems
      */
     protected void initializeVanityPaths() throws IOException {
         this.initializing.lock();
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
index 78e3024..58c53e1 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
@@ -80,6 +80,7 @@
     /**
      * Whether alias resolution optimization is enabled.
      * If it is enabled {@link #getAliasMap(String)} can be used.
+     * @return true if the optimizedAliasResolution should be used, false otherwise
      */
     boolean isOptimizeAliasResolutionEnabled();
 
@@ -106,6 +107,7 @@
      *
      * <p>The iterator will iterate over the mapping entries in the order of the pattern length.</p>
      *
+     * @param requestPath  the requestPath
      * @return the map entry iterator
      */
     @NotNull Iterator<MapEntry> getResolveMapsIterator(@NotNull String requestPath);
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
index d21bb9a..8a4bbb7 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntry.java
@@ -123,6 +123,8 @@
      * URI of the form http://host:77/the/path where any potential default port
      * (80 for http and 443 for https) is actually removed. If the path is just
      * a regular path such as /the/path, this method returns <code>null</code>.
+     * @param uriPath the uripath
+     * @return the cleaned URI string
      */
     public static String toURI(final String uriPath) {
         for (int i = 0; i < PATH_TO_URL_MATCH.length; i++) {
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImpl.java
index 9ae9351..4994b3a 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImpl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/StringInterpolationProviderImpl.java
@@ -52,6 +52,8 @@
 
     /**
      * Activates this component (called by SCR before)
+     * @param bundleContext the bundleContext
+     * @param config the configuration
      */
     @Activate
     protected void activate(final BundleContext bundleContext, final StringInterpolationProviderConfiguration config) {
@@ -77,6 +79,8 @@
 
     /**
      * Modifies this component (called by SCR to update this component)
+     * @param bundleContext the bundleContext
+     * @param config the configuration
      */
     @Modified
     protected void modified(final BundleContext bundleContext, final StringInterpolationProviderConfiguration config) {
@@ -85,6 +89,7 @@
 
     /**
      * Deactivates this component (called by SCR to take out of service)
+     * @param bundleContext the bundleContext
      */
     @Deactivate
     protected void deactivate(final BundleContext bundleContext) {
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java b/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java
index 7207b57..bc4895b 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/providers/stateful/AuthenticatedResourceProvider.java
@@ -64,10 +64,10 @@
 
     /**
      * Constructor
-     * @param providerHandler
-     * @param useRAS
-     * @param resolveContext
-     * @param tracker
+     * @param providerHandler the providerHandler
+     * @param useRAS useRAS
+     * @param resolveContext resolveContext
+     * @param tracker tracker
      */
     public AuthenticatedResourceProvider(@NotNull final ResourceProviderHandler providerHandler,
             final boolean useRAS,
@@ -133,6 +133,10 @@
 
     /**
      * @see ResourceProvider#getResource(ResolveContext, String, ResourceContext, Resource)
+     * @param path the path
+     * @param parent parent
+     * @param parameters parameters
+     * @return the resource
      */
     public Resource getResource(final String path, final Resource parent, final Map<String, String> parameters) {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -156,6 +160,8 @@
 
     /**
      * @see ResourceProvider#listChildren(ResolveContext, Resource)
+     * @param parent parent
+     * @return the iterator
      */
     public Iterator<Resource> listChildren(final Resource parent) {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -167,6 +173,7 @@
 
     /**
      * @see ResourceProvider#getAttributeNames(ResolveContext)
+     * @param attributeNames attributeNames
      */
     public void getAttributeNames(final Set<String> attributeNames) {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -180,6 +187,8 @@
 
     /**
      * @see ResourceProvider#getAttribute(ResolveContext, String)
+     * @param name name
+     * @return the attribute
      */
     public Object getAttribute(final String name) {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -191,6 +200,11 @@
 
     /**
      * @see ResourceProvider#create(ResolveContext, String, Map)
+     * @param resolver the resolver
+     * @param path path
+     * @param properties properties
+     * @return the resource
+     * @throws PersistenceException in case of problems
      */
     public Resource create(final ResourceResolver resolver,
             final String path,
@@ -205,6 +219,11 @@
 
     /**
      * @see ResourceProvider#orderBefore(ResolveContext, Resource, String, String)
+     * @param parent parent
+     * @param name name
+     * @param followingSiblingName followingSiblingName
+     * @return true if the order was changed, false if the order was correct already before
+     * @throws PersistenceException in case of problems
      */
     public boolean orderBefore(final @NotNull Resource parent, final @NotNull String name, final @Nullable String followingSiblingName) 
         throws PersistenceException {
@@ -218,6 +237,8 @@
     
     /**
      * @see ResourceProvider#delete(ResolveContext, Resource)
+     * @param resource resource
+     * @throws PersistenceException in case of problems
      */
     public void delete(final Resource resource) throws PersistenceException {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -240,6 +261,7 @@
 
     /**
      * @see ResourceProvider#commit(ResolveContext)
+     * @throws PersistenceException in case of problems
      */
     public void commit() throws PersistenceException {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -250,6 +272,7 @@
 
     /**
      * @see ResourceProvider#hasChanges(ResolveContext)
+     * @return true if there are transient changes
      */
     public boolean hasChanges() {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -261,6 +284,7 @@
 
     /**
      * @see ResourceProvider#getQueryLanguageProvider()
+     * @return the QueryLanguageProvider
      */
     private QueryLanguageProvider<Object> getQueryLanguageProvider() {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -272,6 +296,7 @@
 
     /**
      * @see QueryLanguageProvider#getSupportedLanguages(ResolveContext)
+     * @return array with the support query languages
      */
     public String[] getSupportedLanguages() {
         final QueryLanguageProvider<Object> jcrQueryProvider = getQueryLanguageProvider();
@@ -283,6 +308,9 @@
 
     /**
      * @see QueryLanguageProvider#findResources(ResolveContext, String, String)
+     * @param query the query
+     * @param language the language of the query
+     * @return an iterator covering the found resources
      */
     public Iterator<Resource> findResources(final String query, final String language) {
         final QueryLanguageProvider<Object> jcrQueryProvider = getQueryLanguageProvider();
@@ -294,6 +322,9 @@
 
     /**
      * @see QueryLanguageProvider#queryResources(ResolveContext, String, String)
+     * @param query the query
+     * @param language the language of the query
+     * @return a map with the result
      */
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public Iterator<Map<String, Object>> queryResources(final String query, final String language) {
@@ -306,6 +337,9 @@
 
     /**
      * @see ResourceProvider#adaptTo(ResolveContext, Class)
+     * @param type the type to convert to
+     * @param <AdapterType> the adapter target
+     * @return the adapter target or {code}null{code} if the adaption failed
      */
     public <AdapterType> AdapterType adaptTo(final Class<AdapterType> type) {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -317,6 +351,10 @@
 
     /**
      * @see ResourceProvider#copy(ResolveContext, String, String)
+     * @param srcAbsPath the absolute source path
+     * @param destAbsPath the absolute target path
+     * @return true if the copy succeeded, false otherwise
+     * @throws PersistenceException in case of problems
      */
     public boolean copy(final String srcAbsPath, final String destAbsPath) throws PersistenceException {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
@@ -328,6 +366,10 @@
 
     /**
      * @see ResourceProvider#move(ResolveContext, String, String)
+     * @param srcAbsPath the absolute source path
+     * @param destAbsPath the absolute target path
+     * @return true if the move succeeded, false otherwise
+     * @throws PersistenceException in case of problems
      */
     public boolean move(final String srcAbsPath, final String destAbsPath) throws PersistenceException {
         final ResourceProvider<Object> rp = this.providerHandler.getResourceProvider();
