diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
index 4d5f507..0a59f1b 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
@@ -41,7 +41,6 @@
 import org.apache.felix.dm.impl.dependencies.ServiceDependencyImpl;
 import org.apache.felix.dm.impl.dependencies.TemporalServiceDependencyImpl;
 import org.apache.felix.dm.impl.metatype.PropertyMetaDataImpl;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.BundleContext;
 
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/dependencies/ResourceDependency.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/dependencies/ResourceDependency.java
index 366e3ae..fb9a992 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/dependencies/ResourceDependency.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/dependencies/ResourceDependency.java
@@ -18,7 +18,8 @@
  */
 package org.apache.felix.dm.dependencies;
 
-import org.apache.felix.dm.resources.Resource;
+import java.net.URL;
+
 import org.apache.felix.dm.resources.ResourceHandler;
 
 public interface ResourceDependency extends Dependency, ResourceHandler {
@@ -94,7 +95,7 @@
      */
      public ResourceDependency setAutoConfig(String instanceName);
     
-     public ResourceDependency setResource(Resource resource);
+     public ResourceDependency setResource(URL resource);
 	
      public ResourceDependency setRequired(boolean required);
 
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
index cb9803e..f2afb90 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.dm.impl;
 
+import java.net.URL;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -26,7 +27,6 @@
 
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.dependencies.Dependency;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.service.Service;
 import org.apache.felix.dm.service.ServiceStateListener;
 import org.osgi.framework.Bundle;
@@ -173,13 +173,13 @@
     }
 
     // callbacks for resources
-    public void added(Resource resource) {
+    public void added(URL resource) {
         Service newService = createService(new Object[] { resource });
         m_services.put(resource, newService);
         m_manager.add(newService);
     }
 
-    public void removed(Resource resource) {
+    public void removed(URL resource) {
         Service newService = (Service) m_services.remove(resource);
         if (newService == null) {
             System.out.println("Service should not be null here, dumping stack.");
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
index ea6f3e9..7bd7ca7 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterServiceImpl.java
@@ -18,13 +18,13 @@
  */
 package org.apache.felix.dm.impl;
 
+import java.net.URL;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Properties;
 
 import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.dependencies.Dependency;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.service.Service;
 import org.apache.felix.dm.service.ServiceStateListener;
 
@@ -61,7 +61,7 @@
         }
 
         public Service createService(Object[] properties) {
-            Resource resource = (Resource) properties[0]; 
+            URL resource = (URL) properties[0]; 
             Properties props = new Properties();
             if (m_serviceProperties != null) {
                 Enumeration e = m_serviceProperties.keys();
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java
index 7bb7546..189e0a0 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java
@@ -1,7 +1,6 @@
 package org.apache.felix.dm.impl.dependencies;
 
-public interface DependencyActivation
-{
+public interface DependencyActivation {
   public void start(DependencyService service);
   public void stop(DependencyService service);
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
index ddefa1e..b7faaab 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.dm.impl.dependencies;
 
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.List;
@@ -27,7 +28,6 @@
 import org.apache.felix.dm.dependencies.ResourceDependency;
 import org.apache.felix.dm.impl.Logger;
 import org.apache.felix.dm.management.ServiceComponentDependency;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.resources.ResourceHandler;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.BundleContext;
@@ -46,10 +46,10 @@
     private String m_autoConfigInstance;
     protected List m_services = new ArrayList();
 	private String m_resourceFilter;
-	private Resource m_trackedResource;
+	private URL m_trackedResource;
     private boolean m_isStarted;
     private List m_resources = new ArrayList();
-    private Resource m_resourceInstance;
+    private URL m_resourceInstance;
     private boolean m_propagate;
 	
     public ResourceDependencyImpl(BundleContext context, Logger logger) {
@@ -93,7 +93,7 @@
 	        Properties props = null;
 	        if (m_resourceFilter != null) {
 	            props = new Properties();
-	            props.setProperty(Resource.FILTER, m_resourceFilter);
+	            props.setProperty(ResourceHandler.FILTER, m_resourceFilter);
 	        }
 	        m_registration = m_context.registerService(ResourceHandler.class.getName(), this, props);
 	    }
@@ -114,7 +114,7 @@
 	    }
 	}
 
-	public void added(Resource resource) {
+	public void added(URL resource) {
 	    if (m_trackedResource == null || m_trackedResource.equals(resource)) {
     		long counter;
     		Object[] services;
@@ -139,7 +139,7 @@
 	    }
 	}
 
-	public void changed(Resource resource) {
+	public void changed(URL resource) {
         if (m_trackedResource == null || m_trackedResource.equals(resource)) {
             Object[] services;
             synchronized (this) {
@@ -152,7 +152,7 @@
         }
 	}
 
-	public void removed(Resource resource) {
+	public void removed(URL resource) {
         if (m_trackedResource == null || m_trackedResource.equals(resource)) {
     		long counter;
     		Object[] services;
@@ -177,22 +177,22 @@
         }
 	}
 	
-    public void invokeAdded(DependencyService ds, Resource serviceInstance) {
+    public void invokeAdded(DependencyService ds, URL serviceInstance) {
         invoke(ds, serviceInstance, m_callbackAdded);
     }
 
-    public void invokeChanged(DependencyService ds, Resource serviceInstance) {
+    public void invokeChanged(DependencyService ds, URL serviceInstance) {
         invoke(ds, serviceInstance, m_callbackChanged);
     }
 
-    public void invokeRemoved(DependencyService ds, Resource serviceInstance) {
+    public void invokeRemoved(DependencyService ds, URL serviceInstance) {
         invoke(ds, serviceInstance, m_callbackRemoved);
     }
     
-    private void invoke(DependencyService ds, Resource serviceInstance, String name) {
+    private void invoke(DependencyService ds, URL serviceInstance, String name) {
         if (name != null) {
             ds.invokeCallbackMethod(getCallbackInstances(ds), name,
-                new Class[][] {{ Service.class, Resource.class }, { Service.class, Object.class }, { Service.class },  { Resource.class }, { Object.class }, {}},
+                new Class[][] {{ Service.class, URL.class }, { Service.class, Object.class }, { Service.class },  { URL.class }, { Object.class }, {}},
                 new Object[][] {{ ds.getServiceInterface(), serviceInstance }, { ds.getServiceInterface(), serviceInstance }, { ds.getServiceInterface() }, { serviceInstance }, { serviceInstance }, {}}
             );
         }
@@ -368,7 +368,7 @@
         }
     }
 
-	public ResourceDependency setResource(Resource resource) {
+	public ResourceDependency setResource(URL resource) {
 		m_trackedResource = resource;
 		return this;
 	}
@@ -388,13 +388,13 @@
         return m_autoConfig;
     }
     
-    public Resource getResource() {
+    public URL getResource() {
     	return lookupResource();
     }
 
-    private Resource lookupResource() {
+    private URL lookupResource() {
         try {
-            return (Resource) m_resources.get(0);
+            return (URL) m_resources.get(0);
         }
         catch (IndexOutOfBoundsException e) {
             return null;
@@ -410,7 +410,7 @@
     }
 
     public Class getAutoConfigType() {
-        return Resource.class;
+        return URL.class;
     }
 
     public void invokeAdded(DependencyService service) {
@@ -431,12 +431,13 @@
     }
     
     public Dictionary getProperties() {
-        Resource resource = lookupResource();
+        URL resource = lookupResource();
         if (resource != null) {
             Properties props = new Properties();
-            props.put(Resource.NAME, resource.getName());
-            props.put(Resource.PATH, resource.getPath());
-            props.put(Resource.REPOSITORY, resource.getRepository());
+            props.setProperty(ResourceHandler.HOST, resource.getHost());
+            props.setProperty(ResourceHandler.PATH, resource.getPath());
+            props.setProperty(ResourceHandler.PROTOCOL, resource.getProtocol());
+            props.setProperty(ResourceHandler.PORT, Integer.toString(resource.getPort()));
             return props;
         }
         else {
@@ -459,7 +460,7 @@
             sb.append(m_resourceFilter);
         }
         if (m_trackedResource != null) {
-            sb.append(m_trackedResource.getID());
+            sb.append(m_trackedResource.toString());
         }
         return sb.toString();
     }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java
deleted file mode 100644
index 53b5d67..0000000
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * 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.felix.dm.resources;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Dictionary;
-import java.util.Enumeration;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-
-public class BundleResourceRepository {
-	private final Bundle m_bundle;
-	
-	public BundleResourceRepository(Bundle bundle) {
-		m_bundle = bundle;
-	}
-
-	public synchronized void addHandler(ServiceReference ref, ResourceHandler handler) {
-		String filter = (String) ref.getProperty("filter"); // "(&(repository=a)(path=b)(name=*.xml))"
-		Filter filterObject = null;
-		if (filter != null) {
-    		try {
-    			filterObject = FrameworkUtil.createFilter(filter);
-    		} 
-    		catch (InvalidSyntaxException e) {
-    			e.printStackTrace();
-    			return;
-    		}
-		}
-		Enumeration entries = m_bundle.findEntries("/", null, true);
-		while (entries.hasMoreElements()) {
-			EntryResource resource = new EntryResource(m_bundle, (URL) entries.nextElement());
-			if (filterObject == null || filterObject.match(resource)) {
-                handler.added(resource);
-			}
-		}
-	}
-
-	public synchronized void removeHandler(ServiceReference ref, ResourceHandler handler) {
-		String filter = (String) ref.getProperty("filter"); // "(&(repository=a)(path=b)(name=*.xml))"
-		Filter filterObject = null;
-		if (filter != null) {
-    		try {
-    			filterObject = FrameworkUtil.createFilter(filter);
-    		}
-    		catch (InvalidSyntaxException e) {
-    			e.printStackTrace();
-    			return;
-    		}
-		}
-		Enumeration entries = m_bundle.findEntries("/", null, true);
-        while (entries.hasMoreElements()) {
-            EntryResource resource = new EntryResource(m_bundle, (URL) entries.nextElement());
-            if (filterObject == null || filterObject.match(resource)) {
-                handler.removed(resource);
-            }
-        }
-	}
-
-	static class EntryResource extends Dictionary implements Resource {
-		private final URL m_entry;
-        private final String m_id;
-        private final String m_repository;
-        private final String m_path;
-        private final String m_name;
-        private static Object[] m_keys;
-        private Object[] m_values;
-
-		public EntryResource(Bundle bundle, URL entry) {
-			m_entry = entry;
-			// TODO is this unique? can we have the same url in more than one repository?
-			m_id = m_entry.toString();
-			m_repository = bundle.getSymbolicName() + "_" + bundle.getHeaders().get("Bundle-Version");
-			String path = entry.getPath();
-			int i = path.lastIndexOf('/');
-			if (i == -1) {
-			    m_path = "/";
-			    m_name = path;
-			}
-			else {
-			    if (path.length() > (i + 1)) {
-    			    m_path = path.substring(0, i);
-    			    m_name = path.substring(i + 1);
-			    }
-			    else {
-			        m_path = path;
-			        m_name = "";
-			    }
-			}
-		}
-
-		public final String getID() {
-		    return m_id;
-		}
-		
-		public final String getName() {
-			return m_name;
-		}
-
-		public final String getPath() {
-			return m_path;
-		}
-		
-		public final String getRepository() {
-			return m_repository;
-		}
-
-		public final InputStream openStream() throws IOException {
-			return m_entry.openStream();
-		}
-
-        public Enumeration elements() {
-            if (m_values == null) {
-                m_values = new Object[] { m_id, m_repository, m_path, m_name };
-            }
-            return new ArrayEnumeration(m_values);
-        }
-
-        public Object get(Object key) {
-            if (Resource.ID.equals(key)) {
-                return m_id;
-            }
-            else if (Resource.REPOSITORY.equals(key)) {
-                return m_repository;
-            }
-            else if (Resource.PATH.equals(key)) {
-                return m_path;
-            }
-            else if (Resource.NAME.equals(key)) {
-                return m_name;
-            }
-            return null;
-        }
-
-        public boolean isEmpty() {
-            return false;
-        }
-
-        public Enumeration keys() {
-            if (m_keys == null) {
-                m_keys = new Object[] { Resource.ID, Resource.REPOSITORY, Resource.PATH, Resource.NAME };
-            }
-            return new ArrayEnumeration(m_keys);
-        }
-
-        public Object put(Object key, Object value) {
-            return null;
-        }
-
-        public Object remove(Object key) {
-            return null;
-        }
-
-        public int size() {
-            return 4;
-        }
-	}
-	
-	static class ArrayEnumeration implements Enumeration {
-	    private int m_counter = 0;
-	    private Object[] m_elements;
-	    
-	    public ArrayEnumeration(Object[] array) {
-	        m_elements = array;
-	    }
-	    
-	    public boolean hasMoreElements() {
-	        return (m_counter < m_elements.length);
-	    }
-	    
-	    public Object nextElement() {
-	        return m_elements[m_counter++];
-	    }
-	}
-}
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java
deleted file mode 100644
index 37cd638..0000000
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.felix.dm.resources;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/** 
- * Interface that defines a resource. Each resource has a unique ID, which should be
- * used for equality tests. Resources also have a repository name, path and name, which
- * can all be used to filter on. To access a resource, use the <code>openStream()</code>
- * method.
- */
-public interface Resource {
-    public static final String ID = "id";
-    public static final String FILTER = "filter";
-	public static final String PATH = "path";
-	public static final String NAME = "name";
-	public static final String REPOSITORY = "repository";
-	
-	/** Returns the unique identification of this resource. */
-	public String getID();
-	/** Returns the name of this resource. */
-	public String getName();
-	/** Returns the path of this resource. */
-	public String getPath();
-	/** Returns the repository of this resource. */
-	public String getRepository();
-	/**	Returns an input stream containing all data behind this resource. */
-	public InputStream openStream() throws IOException;
-}
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java
index 27b4fd8..898aacd 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java
@@ -18,14 +18,28 @@
  */
 package org.apache.felix.dm.resources;
 
+import java.net.URL;
+
 /** 
  * Service interface for anybody wanting to be notified of changes to resources. 
  */
 public interface ResourceHandler {
+    /** Name of the property that's used to describe the filter condition for a resource. */
+    public static final String FILTER = "filter";
+    
+    /** The host part of the URL. */
+    public static final String HOST = "host";
+    /** The path part of the URL. */
+    public static final String PATH = "path";
+    /** The protocol part of the URL. */
+    public static final String PROTOCOL = "protocol";
+    /** The port part of the URL. */
+    public static final String PORT = "port";
+
     /** Invoked whenever a new resource is added. */
-	public void added(Resource resource);
+	public void added(URL resource);
 	/** Invoked whenever an existing resource changes. */
-	public void changed(Resource resource);
+	public void changed(URL resource);
 	/** Invoked whenever an existing resource is removed. */
-	public void removed(Resource resource);
+	public void removed(URL resource);
 }
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceUtil.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceUtil.java
new file mode 100644
index 0000000..b004b43
--- /dev/null
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceUtil.java
@@ -0,0 +1,16 @@
+package org.apache.felix.dm.resources;
+
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Properties;
+
+public class ResourceUtil {
+    public static Dictionary createProperties(URL url) {
+        Properties props = new Properties();
+        props.setProperty(ResourceHandler.PROTOCOL, url.getProtocol());
+        props.setProperty(ResourceHandler.HOST, url.getHost());
+        props.setProperty(ResourceHandler.PORT, Integer.toString(url.getPort()));
+        props.setProperty(ResourceHandler.PATH, url.getPath());
+        return props;
+    }
+}
diff --git a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceConsumer.java b/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceConsumer.java
index e14188d..2e51e4d 100644
--- a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceConsumer.java
+++ b/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceConsumer.java
@@ -18,6 +18,8 @@
 */
 package org.apache.felix.dm.test.bundle.annotation.resource;
 
+import java.net.URL;
+
 import junit.framework.Assert;
 
 import org.apache.felix.dm.annotation.api.ResourceDependency;
@@ -25,7 +27,6 @@
 import org.apache.felix.dm.annotation.api.ServiceDependency;
 import org.apache.felix.dm.annotation.api.Start;
 import org.apache.felix.dm.annotation.api.Stop;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.test.bundle.annotation.sequencer.Sequencer;
 
 /**
@@ -45,30 +46,28 @@
         System.out.println("ResourceConsumer.start: sequencer=" + m_sequencer);
     }
     
-    @ResourceDependency(required = false, filter = "(&(path=/test)(name=*.txt)(repository=TestRepository))")
-    public void add(Resource resource)
+    @ResourceDependency(required = false, filter = "(&(path=/path/to/*.txt)(host=localhost))")
+    public void add(URL resource)
     {
-        System.out.println("ResourceConsumer.add: resource=" + resource.getName() + ", m_sequencer=" + m_sequencer);
-        if (match(resource, "test1.txt", "/test", "TestRepository"))
+        System.out.println("ResourceConsumer.add: resource=" + resource + ", m_sequencer=" + m_sequencer);
+        if (match(resource, "file://localhost/path/to/test1.txt"))
         {
             m_resourcesSeen ++;
             return;
         }
 
-        if (match(resource, "test2.txt", "/test", "TestRepository"))
+        if (match(resource, "file://localhost/path/to/test2.txt"))
         {
             m_resourcesSeen ++;
             return;
         }
 
-        Assert.fail("Got unexpected resource: " + resource.getName() + "/" + resource.getPath()
-            + "/" + resource.getRepository());
+        Assert.fail("Got unexpected resource: " + resource);
     }
 
-    private boolean match(Resource resource, String name, String path, String repo)
+    private boolean match(URL resource, String url)
     {
-        return name.equals(resource.getName()) && path.equals(resource.getPath())
-            && repo.equals(resource.getRepository());
+        return url.equals(resource.toString());
     }
     
     @Stop
diff --git a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceProvider.java b/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceProvider.java
index 87b9492..5d3c117 100644
--- a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceProvider.java
+++ b/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ResourceProvider.java
@@ -18,8 +18,7 @@
 */
 package org.apache.felix.dm.test.bundle.annotation.resource;
 
-import java.io.IOException;
-import java.io.InputStream;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -30,6 +29,7 @@
 import org.apache.felix.dm.annotation.api.Service;
 import org.apache.felix.dm.annotation.api.ServiceDependency;
 import org.apache.felix.dm.resources.ResourceHandler;
+import org.apache.felix.dm.resources.ResourceUtil;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
@@ -42,28 +42,16 @@
 {
     private volatile BundleContext m_context;
     private final Map m_handlers = new HashMap();
-    private StaticResource[] m_resources = {
-            new StaticResource("test1.txt", "/test", "TestRepository")
-            {
-                public InputStream openStream() throws IOException
-                {
-                    return null;
-                };
-            }, new StaticResource("test2.txt", "/test", "TestRepository")
-            {
-                public InputStream openStream() throws IOException
-                {
-                    return null;
-                };
-            }, new StaticResource("README.doc", "/", "TestRepository")
-            {
-                public InputStream openStream() throws IOException
-                {
-                    Assert.fail("resource should not have matched the filter");
-                    return null;
-                };
-            } };
-
+    private URL[] m_resources;
+    
+    public ResourceProvider() throws Exception {
+        m_resources = new URL[] {
+            new URL("file://localhost/path/to/test1.txt"),
+            new URL("file://localhost/path/to/test2.txt"),
+            new URL("file://localhost/path/to/README.doc")
+            };
+    }
+    
     /**
      * Handles a new Resource consumer
      * @param serviceProperties
@@ -91,7 +79,7 @@
         }
         for (int i = 0; i < m_resources.length; i++)
         {
-            if (filter == null || filter.match(m_resources[i].getProperties()))
+            if (filter == null || filter.match(ResourceUtil.createProperties(m_resources[i])))
             {
                 handler.added(m_resources[i]);
             }
@@ -116,7 +104,7 @@
     {
         for (int i = 0; i < m_resources.length; i++)
         {
-            if (filter == null || filter.match(m_resources[i].getProperties()))
+            if (filter == null || filter.match(ResourceUtil.createProperties(m_resources[i])))
             {
                 handler.removed(m_resources[i]);
             }
diff --git a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ServiceProvider.java b/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ServiceProvider.java
index ba1c68f..a844981 100644
--- a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ServiceProvider.java
+++ b/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/ServiceProvider.java
@@ -18,25 +18,26 @@
 */
 package org.apache.felix.dm.test.bundle.annotation.resource;
 
+import java.net.URL;
+
 import junit.framework.Assert;
 
 import org.apache.felix.dm.annotation.api.Property;
 import org.apache.felix.dm.annotation.api.ResourceAdapterService;
 import org.apache.felix.dm.annotation.api.ServiceDependency;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.test.bundle.annotation.sequencer.Sequencer;
 
 /**
  * Our ServiceInterface provider, which service is activated by a ResourceAdapter.
  */
 @ResourceAdapterService(
-    filter = "(&(path=/test)(name=test1.txt)(repository=TestRepository))", 
+    filter = "(&(path=/path/to/test1.txt)(host=localhost))", 
     properties = {@Property(name="foo", value="bar")},
     propagate = true)
 public class ServiceProvider implements ServiceInterface
 {
     // Injected by reflection
-    Resource m_resource;
+    URL m_resource;
         
     @ServiceDependency(filter="(test=adapter)")
     Sequencer m_sequencer;
@@ -44,9 +45,7 @@
     public void run()
     {
         Assert.assertNotNull("Resource has not been injected in the adapter", m_resource);
-        Assert.assertEquals("ServiceProvider did not get expected resource", "test1.txt", m_resource.getName());
-        Assert.assertEquals("ServiceProvider did not get expected resource", "/test", m_resource.getPath());
-        Assert.assertEquals("ServiceProvider did not get expected resource", "TestRepository", m_resource.getRepository());
+        Assert.assertEquals("ServiceProvider did not get expected resource", "file://localhost/path/to/test1.txt", m_resource.toString());
         m_sequencer.step(2);
     }
 }
diff --git a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/StaticResource.java b/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/StaticResource.java
deleted file mode 100644
index 5fd9627..0000000
--- a/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/resource/StaticResource.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-* 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.felix.dm.test.bundle.annotation.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Dictionary;
-import java.util.Properties;
-
-import org.apache.felix.dm.resources.Resource;
-
-public class StaticResource implements Resource
-{
-    private String m_id;
-    private String m_name;
-    private String m_path;
-    private String m_repository;
-
-    public StaticResource(String name, String path, String repository) {
-        m_id = repository + ":" + path + "/" + name;
-        m_name = name;
-        m_path = path;
-        m_repository = repository;
-    }
-    
-    public String getID() {
-        return m_id;
-    }
-
-    public String getName() {
-        return m_name;
-    }
-
-    public String getPath() {
-        return m_path;
-    }
-
-    public String getRepository() {
-        return m_repository;
-    }
-    
-    public Dictionary getProperties() {
-        return new Properties() {{
-            put(Resource.ID, getID());
-            put(Resource.NAME, getName());
-            put(Resource.PATH, getPath());
-            put(Resource.REPOSITORY, getRepository());
-        }};
-    }
-
-    public InputStream openStream() throws IOException {
-        return null;
-    }
-}
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2348_ResourceAdapterTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2348_ResourceAdapterTest.java
index a58e4e0..7024dbc 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2348_ResourceAdapterTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FELIX2348_ResourceAdapterTest.java
@@ -22,21 +22,20 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Dictionary;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Map.Entry;
 
 import junit.framework.Assert;
 
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.resources.ResourceHandler;
+import org.apache.felix.dm.resources.ResourceUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Option;
@@ -60,18 +59,18 @@
     }    
 
     @Test
-    public void testBasicResourceAdapter(BundleContext context) {
+    public void testBasicResourceAdapter(BundleContext context) throws Exception {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
-        m.add(m.createResourceAdapterService("(&(path=/test)(name=*.txt)(repository=TestRepository))", false, null, "changed")
+        m.add(m.createResourceAdapterService("(&(path=/path/to/*.txt)(host=localhost))", false, null, "changed")
               .setImplementation(new ResourceAdapter(e)));
         m.add(m.createService().setImplementation(new ResourceProvider(e)).add(m.createServiceDependency().setService(ResourceHandler.class).setCallbacks("add", "remove")));
         e.waitForStep(3, 5000);
      }
     
     static class ResourceAdapter {
-        protected Resource m_resource; // injected by reflection.
+        protected URL m_resource; // injected by reflection.
         private Ensure m_ensure;
         
         ResourceAdapter(Ensure e) {
@@ -83,19 +82,14 @@
             Assert.assertNotNull("resource not injected", m_resource);
             m_ensure.step(2);
             try {
-                InputStream in= m_resource.openStream();
-                ByteArrayOutputStream out = new ByteArrayOutputStream();
-                int c;
-                while ((c = in.read()) != -1) {
-                    out.write(c);
-                }
-                String msg = new String(out.toByteArray(), "UTF8");
-                Assert.assertEquals("resource", msg);
-            } catch (Throwable t) {
-                t.printStackTrace();
-                Assert.fail();
+                InputStream in = m_resource.openStream();
+            } 
+            catch (FileNotFoundException e) {
+                m_ensure.step(3);
             }
-            m_ensure.step(3);
+            catch (IOException e) {
+                Assert.fail("We should not have gotten this exception.");
+            }
         }
     }
     
@@ -103,16 +97,13 @@
         private volatile BundleContext m_context;
         private final Ensure m_ensure;
         private final Map m_handlers = new HashMap();
-        private StaticResource[] m_resources = {
-            new StaticResource("test1.txt", "/test", "TestRepository") {
-                public InputStream openStream() throws IOException {
-                    return new ByteArrayInputStream("resource".getBytes("UTF8"));
-                };
-            }
-        };
+        private URL[] m_resources;
 
-        public ResourceProvider(Ensure ensure) {
+        public ResourceProvider(Ensure ensure) throws MalformedURLException {
             m_ensure = ensure;
+            m_resources = new URL[] {
+                new URL("file://localhost/path/to/file1.txt")
+            };
         }
         
         public void add(ServiceReference ref, ResourceHandler handler) {
@@ -131,7 +122,7 @@
                 m_handlers.put(handler, filter);
             }
             for (int i = 0; i < m_resources.length; i++) {
-                if (filter == null || filter.match(m_resources[i].getProperties())) {
+                if (filter == null || filter.match(ResourceUtil.createProperties(m_resources[i]))) {
                     handler.added(m_resources[i]);
                 }
             }
@@ -147,7 +138,7 @@
 
         private void removeResources(ResourceHandler handler, Filter filter) {
                 for (int i = 0; i < m_resources.length; i++) {
-                    if (filter == null || filter.match(m_resources[i].getProperties())) {
+                    if (filter == null || filter.match(ResourceUtil.createProperties(m_resources[i]))) {
                         handler.removed(m_resources[i]);
                     }
                 }
@@ -165,47 +156,4 @@
             System.out.println("DESTROY..." + m_handlers.size());
         }
     }
-    
-    static class StaticResource implements Resource {
-        private String m_id;
-        private String m_name;
-        private String m_path;
-        private String m_repository;
-
-        public StaticResource(String name, String path, String repository) {
-            m_id = repository + ":" + path + "/" + name;
-            m_name = name;
-            m_path = path;
-            m_repository = repository;
-        }
-        
-        public String getID() {
-            return m_id;
-        }
-
-        public String getName() {
-            return m_name;
-        }
-
-        public String getPath() {
-            return m_path;
-        }
-
-        public String getRepository() {
-            return m_repository;
-        }
-        
-        public Dictionary getProperties() {
-            return new Properties() {{
-                put(Resource.ID, getID());
-                put(Resource.NAME, getName());
-                put(Resource.PATH, getPath());
-                put(Resource.REPOSITORY, getRepository());
-            }};
-        }
-
-        public InputStream openStream() throws IOException {
-            return null;
-        }
-    }
 }
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
index 2af35b9..866866e 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
@@ -22,22 +22,20 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 
-import java.io.IOException;
-import java.io.InputStream;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
-import java.util.Dictionary;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Map.Entry;
 
 import junit.framework.Assert;
 
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.resources.ResourceHandler;
+import org.apache.felix.dm.resources.ResourceUtil;
 import org.apache.felix.dm.service.Service;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -67,16 +65,16 @@
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
         // create a service provider and consumer
-        ResourceConsumer c = new ResourceConsumer();
+        ResourceConsumer c = new ResourceConsumer(e);
         Service consumer = m.createService()
             .setImplementation(c)
             .add(m.createResourceDependency()
-                .setFilter("(&(path=/test)(name=*.txt)(repository=TestRepository))")
+                .setFilter("(&(path=/path/to/*.txt)(host=localhost))")
                 .setCallbacks("add", "remove"));
         Service dynamicProxyConsumer = m.createService()
             .setFactory(new ResourceConsumerFactory(e), "create")
             .add(m.createResourceDependency()
-                    .setFilter("(name=*.doc)")
+                    .setFilter("(path=*.doc)")
                     .setCallbacks("add", null)); 
         Service resourceProvider = m.createService()
             .setImplementation(new ResourceProvider(e))
@@ -110,16 +108,17 @@
     
     static class ResourceConsumer {
         private volatile int m_counter;
-        public void add(Resource resource) {
-            m_counter++;
-            try {
-                resource.openStream();
-            }
-            catch (IOException e) {
-                e.printStackTrace();
-            }
+        private Ensure m_ensure;
+        
+        public ResourceConsumer(Ensure ensure) {
+            m_ensure = ensure;
         }
-        public void remove(Resource resource) {
+        
+        public void add(URL resource) {
+            m_counter++;
+            m_ensure.step();
+        }
+        public void remove(URL resource) {
             m_counter--;
         }
         public void ensure() {
@@ -131,29 +130,20 @@
         private volatile BundleContext m_context;
         private final Ensure m_ensure;
         private final Map m_handlers = new HashMap();
-        private StaticResource[] m_resources = {
-            new StaticResource("test1.txt", "/test", "TestRepository") {
-                public InputStream openStream() throws IOException {
-                    m_ensure.step(1);
-                    return null;
-                };
-            },
-            new StaticResource("test2.txt", "/test", "TestRepository") {
-                public InputStream openStream() throws IOException {
-                    m_ensure.step(2);
-                    return null;
-                };
-            },
-            new StaticResource("README.doc", "/", "TestRepository") {
-                public InputStream openStream() throws IOException {
-                    Assert.fail("resource should not have matched the filter");
-                    return null;
-                };
-            }
-        };
-
+        private URL[] m_resources;
+        
         public ResourceProvider(Ensure ensure) {
             m_ensure = ensure;
+            try {
+                m_resources = new URL[] {
+                    new URL("file://localhost/path/to/file1.txt"),
+                    new URL("file://localhost/path/to/file2.txt"),
+                    new URL("file://localhost/path/to/file3.doc")
+                };
+            }
+            catch (MalformedURLException e) {
+                throw new IllegalStateException(e);
+            }
         }
         
         public void add(ServiceReference ref, ResourceHandler handler) {
@@ -170,7 +160,7 @@
                 m_handlers.put(handler, filter);
             }
                 for (int i = 0; i < m_resources.length; i++) {
-                    if (filter.match(m_resources[i].getProperties())) {
+                    if (filter.match(ResourceUtil.createProperties(m_resources[i]))) {
                         handler.added(m_resources[i]);
                     }
                 }
@@ -186,7 +176,7 @@
 
         private void removeResources(ResourceHandler handler, Filter filter) {
                 for (int i = 0; i < m_resources.length; i++) {
-                    if (filter.match(m_resources[i].getProperties())) {
+                    if (filter.match(ResourceUtil.createProperties(m_resources[i]))) {
                         handler.removed(m_resources[i]);
                     }
                 }
@@ -205,49 +195,6 @@
         }
     }
     
-    static class StaticResource implements Resource {
-        private String m_id;
-        private String m_name;
-        private String m_path;
-        private String m_repository;
-
-        public StaticResource(String name, String path, String repository) {
-            m_id = repository + ":" + path + "/" + name;
-            m_name = name;
-            m_path = path;
-            m_repository = repository;
-        }
-        
-        public String getID() {
-            return m_id;
-        }
-
-        public String getName() {
-            return m_name;
-        }
-
-        public String getPath() {
-            return m_path;
-        }
-
-        public String getRepository() {
-            return m_repository;
-        }
-        
-        public Dictionary getProperties() {
-            return new Properties() {{
-                put(Resource.ID, getID());
-                put(Resource.NAME, getName());
-                put(Resource.PATH, getPath());
-                put(Resource.REPOSITORY, getRepository());
-            }};
-        }
-
-        public InputStream openStream() throws IOException {
-            return null;
-        }
-    }
-    
     static class ResourceConsumerFactory {
         private final Ensure m_ensure;
         public ResourceConsumerFactory(Ensure ensure) {
@@ -255,7 +202,7 @@
         }
         public Object create() {
             System.out.println("create");
-            ResourceConsumer resourceConsumer = new ResourceConsumer();
+            ResourceConsumer resourceConsumer = new ResourceConsumer(m_ensure);
             // create a dynamic proxy for the ResourceProvider
             return Proxy.newProxyInstance(resourceConsumer.getClass().getClassLoader(), resourceConsumer.getClass().getInterfaces(), new DynamicProxyHandler(resourceConsumer, m_ensure));
         }
@@ -270,7 +217,7 @@
             m_ensure = ensure;
         }
 
-        public void add(Resource resource) {
+        public void add(URL resource) {
             m_ensure.step(4);
             System.out.println("Add resource: " + resource);
         }
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java
index 4066d1b..4214b85 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java
@@ -22,8 +22,7 @@
 import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 
-import java.io.IOException;
-import java.io.InputStream;
+import java.net.URL;
 import java.util.Dictionary;
 import java.util.Properties;
 
@@ -32,8 +31,8 @@
 import org.apache.felix.dm.dependencies.ConfigurationDependency;
 import org.apache.felix.dm.dependencies.ResourceDependency;
 import org.apache.felix.dm.dependencies.ServiceDependency;
-import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.resources.ResourceHandler;
+import org.apache.felix.dm.resources.ResourceUtil;
 import org.apache.felix.dm.service.Service;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -132,12 +131,12 @@
     }
     
     @Test
-    public void testShareResourceDependencyWithMultipleServices(BundleContext context) {
+    public void testShareResourceDependencyWithMultipleServices(BundleContext context) throws Exception {
         DependencyManager m = new DependencyManager(context);
         // helper class that ensures certain steps get executed in sequence
         Ensure e = new Ensure();
         // create a service provider and consumer
-        ResourceDependency dependency = m.createResourceDependency().setFilter("(" + Resource.REPOSITORY + "=TestRepository)").setRequired(true);
+        ResourceDependency dependency = m.createResourceDependency().setFilter("(" + ResourceHandler.HOST + "=localhost)").setRequired(true);
         Service consumer1 = m.createService().setImplementation(new ResourceConsumer(e, 1)).add(dependency);
         Service consumer2 = m.createService().setImplementation(new ResourceConsumer(e, 2)).add(dependency);
         Service resourceProvider = m.createService().setImplementation(new ResourceProvider()).add(m.createServiceDependency().setService(ResourceHandler.class).setCallbacks("add", "remove"));;
@@ -250,17 +249,22 @@
     
     static class ResourceProvider {
         private volatile BundleContext m_context;
-        private StaticResource[] m_resources = {
-            new StaticResource("test1.txt", "/test", "TestRepository"),
-            new StaticResource("test2.txt", "/test", "TestRepository")
-        };
+        private URL[] m_resources;
+        
+        public ResourceProvider() throws Exception {
+            m_resources = new URL[] {
+                new URL("file://localhost/path/to/test1.txt"),
+                new URL("file://localhost/path/to/test2.txt")        
+                };
+            
+        }
 
         public void add(ServiceReference ref, ResourceHandler handler) {
             String filterString = (String) ref.getProperty("filter");
             try {
                 Filter filter = m_context.createFilter(filterString);
                 for (int i = 0; i < m_resources.length; i++) {
-                    if (filter.match(m_resources[i].getProperties())) {
+                    if (filter.match(ResourceUtil.createProperties(m_resources[i]))) {
                         handler.added(m_resources[i]);
                     }
                 }
@@ -275,7 +279,7 @@
             try {
                 Filter filter = m_context.createFilter(filterString);
                 for (int i = 0; i < m_resources.length; i++) {
-                    if (filter.match(m_resources[i].getProperties())) {
+                    if (filter.match(ResourceUtil.createProperties(m_resources[i]))) {
                         handler.removed(m_resources[i]);
                     }
                 }
@@ -285,46 +289,4 @@
             }
         }
     }
-    
-    static class StaticResource implements Resource {
-        private String m_id;
-        private String m_name;
-        private String m_path;
-        private String m_repository;
-
-        public StaticResource(String name, String path, String repository) {
-            m_id = repository + ":" + path + "/" + name;
-            m_name = name;
-            m_path = path;
-            m_repository = repository;
-        }
-        
-        public String getID() {
-            return m_id;
-        }
-
-        public String getName() {
-            return m_name;
-        }
-
-        public String getPath() {
-            return m_path;
-        }
-
-        public String getRepository() {
-            return m_repository;
-        }
-        
-        public Dictionary getProperties() {
-            return new Properties() {{
-                put(Resource.NAME, getName());
-                put(Resource.PATH, getPath());
-                put(Resource.REPOSITORY, getRepository());
-            }};
-        }
-
-        public InputStream openStream() throws IOException {
-            return null;
-        }
-    }
 }
