diff --git a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java
index e7d5792fda94f738f23b9026d18b3554db53e95b..2ccf6b7ec6623477f9e9c19cf517bd3581de2fb5 100644
--- a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java
+++ b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java
@@ -1,25 +1,25 @@
 package tdt4250.servletsupport.impl;
 
+import org.eclipse.emf.ecore.EAttribute;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.osgi.service.component.annotations.Component;
 
 import tdt4250.servletsupport.IReferenceResolver;
 
 @Component
-public class NameReferenceResolver implements IReferenceResolver {
+public class NameReferenceResolver extends AbstractReferenceResolver implements IReferenceResolver {
 
 	@Override
-	public EObject resolveReference(String reference, EObject context) {
-		for (EObject contained : context.eContents()) {
-			EStructuralFeature nameFeature = contained.eClass().getEStructuralFeature("name");
-			if (nameFeature != null) {
-				Object name = contained.eGet(nameFeature);
-				if (reference.equals(String.valueOf(name))) {
-					return contained;
-				}
+	protected boolean isReferenced(String reference, EObject eObject) {
+		EStructuralFeature nameFeature = eObject.eClass().getEStructuralFeature("name");
+		if (nameFeature instanceof EAttribute) {
+			Object name = eObject.eGet(nameFeature);
+			if (reference.equals(EcoreUtil.convertToString(((EAttribute) nameFeature).getEAttributeType(), name))) {
+				return true;
 			}
 		}
-		return null;
+		return false;
 	}
 }
diff --git a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java
index e5a3fc10df41e45ad97c9331bcd0a4f8463c6ea1..cedad44bc6210a30fd61006ee66fd99312534ac9 100644
--- a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java
+++ b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java
@@ -119,15 +119,14 @@ public class RequestSupport {
 			}
 		}
 		if (count == 0) {
+			EList<EObject> selected = null;
 			if (Character.isUpperCase(step.charAt(0))) {
-				objects = selectEClass(objects, step);
-				if (objects.isEmpty()) {
-					objects = selectKey(objects, step.split(","));					
-				}
-			} else {
-				objects = selectKey(objects, step.split(","));					
+				selected = selectEClass(objects, step);
+			}
+			if (selected == null || selected.isEmpty()) {
+				selected = selectKey(objects, step.split(","));					
 			}
-			return objects;
+			return objects = selected;
 		}
 		if (values != null) {
 			return objects = values;
@@ -235,55 +234,49 @@ public class RequestSupport {
 	}
 
 	protected EList<EObject> selectRelation(Collection<?> objects, final String featureName, final String featureValueString, final String rel) {
-		return selectEObjects(objects, new EObjectFilter() {
-			@Override
-			public boolean accept(EObject eObject) {
-				EAttribute attr = findEStructuralFeature(featureName, eObject.eClass().getEAllAttributes());
-				if (attr != null) {
-					Object featureValue1 = eObject.eGet(attr);
-					Object featureValue2 = EcoreUtil.createFromString(attr.getEAttributeType(), featureValueString);
-					if (rel == null || rel.equals("=")) {
-						if (featureValue1 == featureValue2 || (featureValue1 != null && featureValue1.equals(featureValue2))) {
-							return true;
-						}
-					} else if (featureValue1 instanceof Comparable<?>) {
-						try {
-							int comp = ((Comparable) featureValue1).compareTo(featureValue2);
-							return (rel.equals("==") && comp == 0)
-									|| (rel.equals(">") && comp > 0)
-									|| ((rel.equals(">=") || rel.equals("=>")) && comp >= 0)
-									|| ((rel.equals("<=") || rel.equals("=<")) && comp <= 0)
-									|| (rel.equals("<") && comp < 0)
-									|| ((rel.equals("<>") || rel.equals("><")) && comp != 0);
-						} catch (RuntimeException e) {
-						}
+		return selectEObjects(objects, eObject -> {
+			EAttribute attr = findEStructuralFeature(featureName, eObject.eClass().getEAllAttributes());
+			if (attr != null) {
+				Object featureValue1 = eObject.eGet(attr);
+				Object featureValue2 = EcoreUtil.createFromString(attr.getEAttributeType(), featureValueString);
+				if (rel == null || rel.equals("=")) {
+					if (featureValue1 == featureValue2 || (featureValue1 != null && featureValue1.equals(featureValue2))) {
+						return true;
+					}
+				} else if (featureValue1 instanceof Comparable<?>) {
+					try {
+						int comp = ((Comparable) featureValue1).compareTo(featureValue2);
+						return (rel.equals("==") && comp == 0)
+								|| (rel.equals(">") && comp > 0)
+								|| ((rel.equals(">=") || rel.equals("=>")) && comp >= 0)
+								|| ((rel.equals("<=") || rel.equals("=<")) && comp <= 0)
+								|| (rel.equals("<") && comp < 0)
+								|| ((rel.equals("<>") || rel.equals("><")) && comp != 0);
+					} catch (RuntimeException e) {
 					}
 				}
-				return false;
 			}
+			return false;
 		});
 	}
 
 	protected EList<EObject> selectKey(Collection<?> objects, final String[] keyValueStrings) {
-		return selectEObjects(objects, new EObjectFilter() {
-			@Override
-			public boolean accept(EObject eObject) {
-				EStructuralFeature containingFeature = eObject.eContainingFeature();
-				if (containingFeature instanceof EReference) {
-					EList<EAttribute> keyAttributes = ((EReference) containingFeature).getEKeys();
-					if (keyAttributes.size() == keyValueStrings.length) {
-						for (int i = 0; i < keyAttributes.size(); i++) {
-							EAttribute attr = keyAttributes.get(i);
-							Object value = EcoreUtil.createFromString(attr.getEAttributeType(), keyValueStrings[i]);
-							if (value == null || (! value.equals(eObject.eGet(attr)))) {
-								return false;
-							}
+		return selectEObjects(objects, eObject -> {
+			EStructuralFeature containingFeature = eObject.eContainingFeature();
+			if (containingFeature instanceof EReference) {
+				EList<EAttribute> keyAttributes = ((EReference) containingFeature).getEKeys();
+				if (keyAttributes.size() == keyValueStrings.length) {
+					for (int i = 0; i < keyAttributes.size(); i++) {
+						EAttribute attr = keyAttributes.get(i);
+						Object value = EcoreUtil.createFromString(attr.getEAttributeType(), keyValueStrings[i]);
+						if (value == null || (! value.equals(eObject.eGet(attr)))) {
+							return false;
 						}
-						return true;
 					}
+					return true;
 				}
-				return false;
 			}
+			return false;
 		});
 	}
 
diff --git a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java
index c9da8760cc9cddee58f70817a0c6c69ef2b333c7..f6b3064e236d78840ae493290875908571287add 100644
--- a/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java
+++ b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java
@@ -10,11 +10,25 @@ import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Modified;
 
 import tdt4250.servletsupport.IResourceProvider;
 
+@Component(
+		configurationPid = ResourceProvider.FACTORY_PID,
+		configurationPolicy = ConfigurationPolicy.REQUIRE
+		)
 public class ResourceProvider implements IResourceProvider {
 
+	public static final String FACTORY_PID = "tdt4250.servletsupport.impl.ResourceProvider";
+
+	public static final String RESOURCE_NAME_PROP = "resourceName";
+	public static final String RESOURCE_URI_PROP = "resourceUri";
+
 	private URI uri;
 	private Resource resource;
 	
@@ -27,6 +41,26 @@ public class ResourceProvider implements IResourceProvider {
 	public void setUri(URI uri) {
 		this.uri = uri;
 	}
+	
+	public @interface ResourceProviderConfig {
+		String name();
+		String resourceUri();
+	}
+
+	@Activate
+	public void activate(BundleContext bc, ResourceProviderConfig config) {
+		update(bc, config);
+	}
+
+	@Modified
+	public void modify(BundleContext bc, ResourceProviderConfig config) {
+		update(bc, config);		
+	}
+
+	protected void update(BundleContext bc, ResourceProviderConfig config) {
+		this.resource = null;
+		this.uri = URI.createURI(config.resourceUri());
+	}
 
 	public ResourceProvider(Resource resource) {
 		this.resource = resource;
diff --git a/emf-ws/tdt4250.emf.servletsupport/bnd.bnd b/emf-ws/tdt4250.emf.servletsupport/bnd.bnd
index 60fbd43f239b38a0e7cf510356c17628ac34a288..c75f28ff45407dddc4ea7594225f76775f684feb 100644
--- a/emf-ws/tdt4250.emf.servletsupport/bnd.bnd
+++ b/emf-ws/tdt4250.emf.servletsupport/bnd.bnd
@@ -1,8 +1,7 @@
-Bundle-Version: 1.0.0.${tstamp}
-
--baseline: *
 -buildpath: \
+	osgi.core;version=7.0.0,\
 	osgi.annotation;version=7.0.0,\
+	osgi.cmpn;version=7.0.0,\
 	com.fasterxml.jackson.core.jackson-annotations,\
 	com.fasterxml.jackson.core.jackson-core,\
 	com.fasterxml.jackson.core.jackson-databind,\
@@ -11,4 +10,5 @@ Bundle-Version: 1.0.0.${tstamp}
 
 javac.source: 1.8
 javac.target: 1.8
+
 -runrequires: bnd.identity;id='tdt4250.emf.servletsupport'
\ No newline at end of file