diff --git a/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java b/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java
index b68d53e..598e70e 100644
--- a/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java
+++ b/src/main/java/org/apache/sling/provisioning/model/ModelUtility.java
@@ -267,13 +267,85 @@
     }
 
     /**
+     * Optional artifact dependency version resolver
+     */
+    public interface ArtifactVersionResolver {
+
+        /**
+         * Setting a version for an artifact dependency in a Sling Provisioning file is optional.
+         * By default an artifact without a defined version gets "LATEST" as version.
+         * By defining an DependencyVersionResolver it is possible to plugin in an external dependency resolver
+         * which decides which version to use if no version is given in the provisioning file.
+         * If an exact version is given in the provisioning file this is always used.
+         * @param artifact Artifact without version (version is set to LATEST)
+         * @return New version, or null if the version should not be changed
+         */
+        String resolve(final Artifact artifact);
+    }
+    
+    /**
+     * Parameter builder class for {@link ModelUtility#getEffectiveModel(Model, ResolverOptions)} method.
+     */
+    public static final class ResolverOptions {
+        
+        private VariableResolver variableResolver;
+        private ArtifactVersionResolver artifactVersionResolver;
+        
+        public VariableResolver getVariableResolver() {
+            return variableResolver;
+        }
+        
+        public ResolverOptions variableResolver(VariableResolver variableResolver) {
+            this.variableResolver = variableResolver;
+            return this;
+        }
+        
+        public ArtifactVersionResolver getArtifactVersionResolver() {
+            return artifactVersionResolver;
+        }
+        
+        public ResolverOptions artifactVersionResolver(ArtifactVersionResolver dependencyVersionResolver) {
+            this.artifactVersionResolver = dependencyVersionResolver;
+            return this;
+        }
+        
+    }
+
+    /**
+     * Replace all variables in the model and return a new model with the replaced values.
+     * @param model The base model.
+     * @return The model with replaced variables.
+     * @throws IllegalArgumentException If a variable can't be replaced or configuration properties can't be parsed
+     */
+    public static Model getEffectiveModel(final Model model) {
+        return getEffectiveModel(model, new ResolverOptions());
+    }
+    
+    /**
      * Replace all variables in the model and return a new model with the replaced values.
      * @param model The base model.
      * @param resolver Optional variable resolver.
      * @return The model with replaced variables.
      * @throws IllegalArgumentException If a variable can't be replaced or configuration properties can't be parsed
+     * @deprecated Use {@link #getEffectiveModel(Model, ResolverOptions)} instead
      */
+    @Deprecated
     public static Model getEffectiveModel(final Model model, final VariableResolver resolver) {
+        return getEffectiveModel(model, new ResolverOptions().variableResolver(resolver));
+    }
+    
+    /**
+     * Replace all variables in the model and return a new model with the replaced values.
+     * @param model The base model.
+     * @param options Resolver options.
+     * @return The model with replaced variables.
+     * @throws IllegalArgumentException If a variable can't be replaced or configuration properties can't be parsed
+     */
+    public static Model getEffectiveModel(final Model model, final ResolverOptions options) {
+        if (options == null) {
+            throw new IllegalArgumentException("Resolver options is null");
+        }
+        
         final Model result = new Model();
         result.setLocation(model.getLocation());
 
@@ -296,11 +368,14 @@
                     newGroup.setLocation(group.getLocation());
 
                     for(final Artifact artifact : group) {
-                        final Artifact newArtifact = new Artifact(replace(newFeature, artifact.getGroupId(), resolver),
-                                replace(newFeature, artifact.getArtifactId(), resolver),
-                                replace(newFeature, artifact.getVersion(), resolver),
-                                replace(newFeature, artifact.getClassifier(), resolver),
-                                replace(newFeature, artifact.getType(), resolver));
+                        final String groupId = replace(newFeature, artifact.getGroupId(), options.getVariableResolver());
+                        final String artifactId = replace(newFeature, artifact.getArtifactId(), options.getVariableResolver());
+                        final String version = replace(newFeature, artifact.getVersion(), options.getVariableResolver());
+                        final String classifier = replace(newFeature, artifact.getClassifier(), options.getVariableResolver());
+                        final String type = replace(newFeature, artifact.getType(), options.getVariableResolver());
+                        final String resolvedVersion = resolveArtifactVersion(groupId, artifactId, version, classifier, type,
+                                options.getArtifactVersionResolver());
+                        final Artifact newArtifact = new Artifact(groupId, artifactId, resolvedVersion, classifier, type);
                         newArtifact.setComment(artifact.getComment());
                         newArtifact.setLocation(artifact.getLocation());
 
@@ -313,7 +388,7 @@
                 for(final Configuration config : runMode.getConfigurations()) {
                     final Configuration newConfig = newRunMode.getOrCreateConfiguration(config.getPid(), config.getFactoryPid());
 
-                    getProcessedConfiguration(newFeature, newConfig, config, resolver);
+                    getProcessedConfiguration(newFeature, newConfig, config, options.getVariableResolver());
                 }
 
                 newRunMode.getSettings().setComment(runMode.getSettings().getComment());
@@ -327,8 +402,8 @@
                                     if ( "sling.home".equals(name) ) {
                                         return "${sling.home}";
                                     }
-                                    if ( resolver != null ) {
-                                        return resolver.resolve(newFeature, name);
+                                    if ( options.getVariableResolver() != null ) {
+                                        return options.getVariableResolver().resolve(newFeature, name);
                                     }
                                     return newFeature.getVariables().get(name);
                                 }
@@ -382,7 +457,28 @@
         }
         return msg;
     }
-
+    
+    /**
+     * Tries to resolves artifact version via {@link ArtifactVersionResolver} if no version was defined in provisioning file.
+     * @param groupId Group ID
+     * @param artifactId Artifact ID
+     * @param version Version
+     * @param classifier Classifier
+     * @param type Type
+     * @param artifactVersionResolver Artifact Version Resolver (may be null)
+     * @return Version to use for this artifact
+     */
+    static String resolveArtifactVersion(final String groupId, final String artifactId, final String version,
+            final String classifier, final String type, ArtifactVersionResolver artifactVersionResolver) {
+        if (artifactVersionResolver != null && "LATEST".equals(version)) {
+            String newVersion = artifactVersionResolver.resolve(new Artifact(groupId, artifactId, version, classifier, type));
+            if (newVersion != null) {
+                return newVersion;
+            }
+        }
+        return version;       
+    }
+    
     /**
      * Validates the model.
      * @param model The model to validate
diff --git a/src/main/java/org/apache/sling/provisioning/model/package-info.java b/src/main/java/org/apache/sling/provisioning/model/package-info.java
index 552f509..46ea4e8 100644
--- a/src/main/java/org/apache/sling/provisioning/model/package-info.java
+++ b/src/main/java/org/apache/sling/provisioning/model/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@Version("1.2.0")
+@Version("1.3.0")
 package org.apache.sling.provisioning.model;
 
 import aQute.bnd.annotation.Version;
diff --git a/src/test/java/org/apache/sling/provisioning/model/CustomResolverTest.java b/src/test/java/org/apache/sling/provisioning/model/CustomResolverTest.java
index 4f7598d..dd7bece 100644
--- a/src/test/java/org/apache/sling/provisioning/model/CustomResolverTest.java
+++ b/src/test/java/org/apache/sling/provisioning/model/CustomResolverTest.java
@@ -16,7 +16,9 @@
  */
 package org.apache.sling.provisioning.model;
 
+import org.apache.sling.provisioning.model.ModelUtility.ArtifactVersionResolver;
 import org.apache.sling.provisioning.model.ModelUtility.VariableResolver;
+import org.apache.sling.provisioning.model.ModelUtility.ResolverOptions;
 import org.junit.Test;
 
 /** Read and merge our test models, write and read them again
@@ -24,18 +26,36 @@
  */
 public class CustomResolverTest {
 
-    public static class CustomResolver implements VariableResolver {
+    public static class CustomVariableResolver implements VariableResolver {
         @Override
         public String resolve(Feature feature, String name) {
             return "#" + feature.getName() + "#" + name + "#";
         }
     }
     
-    @Test public void testCustomResolverNoFilter() throws Exception {
+    @Test
+    public void testCustomVariableResolverNoFilter() throws Exception {
         final Model m = U.readCompleteTestModel();
-        final VariableResolver r = new CustomResolver();
-        final Model effective = ModelUtility.getEffectiveModel(m, r);
+        final VariableResolver r = new CustomVariableResolver();
+        final Model effective = ModelUtility.getEffectiveModel(m, new ResolverOptions().variableResolver(r));
         final ArtifactGroup g = U.getGroup(effective, "example", "jackrabbit", 15);
         U.assertArtifact(g, "mvn:org.apache.sling/org.apache.sling.jcr.jackrabbit.server/#example#jackrabbit.version#/jar");
     }
+
+    public static class CustomArtifactVersionResolver implements ArtifactVersionResolver {
+        @Override
+        public String resolve(Artifact artifact) {
+            return "9.9.9";
+        }
+    }
+    
+    @Test
+    public void testCustomArtifactVersionResolver() throws Exception {
+        final Model m = U.readCompleteTestModel();
+        final ArtifactVersionResolver r = new CustomArtifactVersionResolver();
+        final Model effective = ModelUtility.getEffectiveModel(m, new ResolverOptions().artifactVersionResolver(r));
+        final ArtifactGroup g = U.getGroup(effective, "example", null, 0);
+        U.assertArtifact(g, "mvn:org.example/jar-without-version/9.9.9");
+    }
+
 }
diff --git a/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java b/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java
index d5d18ef..7440d0a 100644
--- a/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java
+++ b/src/test/java/org/apache/sling/provisioning/model/ModelUtilityTest.java
@@ -113,8 +113,8 @@
         final Model baseRaw = U.readCompleteTestModel(new String[] {"merge/config-base.txt"});
         final Model mergeRaw = U.readCompleteTestModel(new String[] {"merge/config-merge.txt"});
 
-        final Model baseEffective = ModelUtility.getEffectiveModel(baseRaw, null);
-        final Model mergeEffective = ModelUtility.getEffectiveModel(mergeRaw, null);
+        final Model baseEffective = ModelUtility.getEffectiveModel(baseRaw);
+        final Model mergeEffective = ModelUtility.getEffectiveModel(mergeRaw);
 
         ModelUtility.merge(baseEffective, mergeEffective);
 
@@ -147,7 +147,7 @@
     @Test public void mergeBaseRawTest() throws Exception {
         final Model baseRaw = U.readCompleteTestModel(new String[] {"merge/config-base.txt"});
         final Model mergeRaw = U.readCompleteTestModel(new String[] {"merge/config-merge.txt"});
-        final Model mergeEffective = ModelUtility.getEffectiveModel(mergeRaw, null);
+        final Model mergeEffective = ModelUtility.getEffectiveModel(mergeRaw);
 
         ModelUtility.merge(baseRaw, mergeEffective);
 
@@ -180,7 +180,7 @@
     @Test public void mergeBaseEffectiveTest() throws Exception {
         final Model baseRaw = U.readCompleteTestModel(new String[] {"merge/config-base.txt"});
         final Model mergeRaw = U.readCompleteTestModel(new String[] {"merge/config-merge.txt"});
-        final Model baseEffective = ModelUtility.getEffectiveModel(baseRaw, null);
+        final Model baseEffective = ModelUtility.getEffectiveModel(baseRaw);
 
         ModelUtility.merge(baseEffective, mergeRaw);
 
diff --git a/src/test/java/org/apache/sling/provisioning/model/io/IOTest.java b/src/test/java/org/apache/sling/provisioning/model/io/IOTest.java
index e271a00..5fa6a1e 100644
--- a/src/test/java/org/apache/sling/provisioning/model/io/IOTest.java
+++ b/src/test/java/org/apache/sling/provisioning/model/io/IOTest.java
@@ -64,7 +64,7 @@
         U.verifyTestModel(readModel, false);
 
         // Resolve variables and verify the result
-        final Model effective = ModelUtility.getEffectiveModel(readModel, null);
+        final Model effective = ModelUtility.getEffectiveModel(readModel);
         U.verifyTestModel(effective, true);
 
         // write effective model
@@ -84,7 +84,7 @@
     }
 
     @Test public void testMultilineConfiguration() throws Exception {
-        final Model m = ModelUtility.getEffectiveModel(U.readCompleteTestModel(new String[] {"configadmin.txt"}), null);
+        final Model m = ModelUtility.getEffectiveModel(U.readCompleteTestModel(new String[] {"configadmin.txt"}));
 
         final List<Configuration> configs = new ArrayList<Configuration>();
         for(final Configuration c :  m.getFeature("configadmin").getRunMode().getConfigurations()) {
diff --git a/src/test/resources/example.txt b/src/test/resources/example.txt
index 0264693..a409266 100644
--- a/src/test/resources/example.txt
+++ b/src/test/resources/example.txt
@@ -43,7 +43,8 @@
     commons-lang/commons-lang/2.6/jar
     org.apache.commons/commons-math/2.2/jar
     org.example/jar-is-default/1.2
-    
+    org.example/jar-without-version
+
 # Artifacts can have additional information like a SHA1 etc.
 #
     org.apache.commons/commons-math/2.2/jar [sha1=2353750701ABE]
@@ -82,4 +83,3 @@
     org.apache.derby/derby/10.5.3.0_1/jar
     org.apache.sling/org.apache.sling.jcr.jackrabbit.server/${jackrabbit.version}/jar
 
-
