diff --git a/config/src/main/java/com/typesafe/config/ConfigParseable.java b/config/src/main/java/com/typesafe/config/ConfigParseable.java
index 8196f6cb..1cc39614 100644
--- a/config/src/main/java/com/typesafe/config/ConfigParseable.java
+++ b/config/src/main/java/com/typesafe/config/ConfigParseable.java
@@ -3,7 +3,6 @@
  */
 package com.typesafe.config;
 
-import java.net.URL;
 
 /**
  * An opaque handle to something that can be parsed, obtained from
@@ -21,7 +20,7 @@ public interface ConfigParseable {
      * Parse whatever it is. The options should come from
      * {@link ConfigParseable#options options()} but you could tweak them if you
      * like.
-     * 
+     *
      * @param options
      *            parse options, should be based on the ones from
      *            {@link ConfigParseable#options options()}
@@ -29,10 +28,10 @@ public interface ConfigParseable {
     ConfigObject parse(ConfigParseOptions options);
 
     /**
-     * Possibly return a URL representing the resource; this may return null if
-     * the resource has no meaningful URL representation.
+     * Returns a {@link ConfigOrigin} describing the origin of the parseable
+     * item.
      */
-    URL url();
+    ConfigOrigin origin();
 
     /**
      * Get the initial options, which can be modified then passed to parse().
diff --git a/config/src/main/java/com/typesafe/config/impl/Parseable.java b/config/src/main/java/com/typesafe/config/impl/Parseable.java
index 64f13f56..71808188 100644
--- a/config/src/main/java/com/typesafe/config/impl/Parseable.java
+++ b/config/src/main/java/com/typesafe/config/impl/Parseable.java
@@ -40,6 +40,7 @@ import com.typesafe.config.ConfigValue;
 public abstract class Parseable implements ConfigParseable {
     private ConfigIncludeContext includeContext;
     private ConfigParseOptions initialOptions;
+    private ConfigOrigin initialOrigin;
 
     protected Parseable() {
 
@@ -69,6 +70,11 @@ public abstract class Parseable implements ConfigParseable {
                 return Parseable.this.relativeTo(filename);
             }
         };
+
+        if (initialOptions.getOriginDescription() != null)
+            initialOrigin = SimpleConfigOrigin.newSimple(initialOptions.getOriginDescription());
+        else
+            initialOrigin = createOrigin();
     }
 
     // the general idea is that any work should be in here, not in the
@@ -118,7 +124,7 @@ public abstract class Parseable implements ConfigParseable {
         if (options.getOriginDescription() != null)
             origin = SimpleConfigOrigin.newSimple(options.getOriginDescription());
         else
-            origin = origin();
+            origin = initialOrigin;
         return parseValue(origin, options);
     }
 
@@ -165,13 +171,13 @@ public abstract class Parseable implements ConfigParseable {
         return parseValue(options());
     }
 
-    abstract ConfigOrigin origin();
-
     @Override
-    public URL url() {
-        return null;
+    public final ConfigOrigin origin() {
+        return initialOrigin;
     }
 
+    protected abstract ConfigOrigin createOrigin();
+
     @Override
     public ConfigParseOptions options() {
         return initialOptions;
@@ -255,7 +261,7 @@ public abstract class Parseable implements ConfigParseable {
         }
 
         @Override
-        ConfigOrigin origin() {
+        protected ConfigOrigin createOrigin() {
             return SimpleConfigOrigin.newSimple("Reader");
         }
     }
@@ -282,7 +288,7 @@ public abstract class Parseable implements ConfigParseable {
         }
 
         @Override
-        ConfigOrigin origin() {
+        protected ConfigOrigin createOrigin() {
             return SimpleConfigOrigin.newSimple("String");
         }
     }
@@ -320,15 +326,10 @@ public abstract class Parseable implements ConfigParseable {
         }
 
         @Override
-        ConfigOrigin origin() {
+        protected ConfigOrigin createOrigin() {
             return SimpleConfigOrigin.newURL(input);
         }
 
-        @Override
-        public URL url() {
-            return input;
-        }
-
         @Override
         public String toString() {
             return getClass().getSimpleName() + "(" + input.toExternalForm()
@@ -372,19 +373,10 @@ public abstract class Parseable implements ConfigParseable {
         }
 
         @Override
-        ConfigOrigin origin() {
+        protected ConfigOrigin createOrigin() {
             return SimpleConfigOrigin.newFile(input.getPath());
         }
 
-        @Override
-        public URL url() {
-            try {
-                return input.toURI().toURL();
-            } catch (MalformedURLException e) {
-                return null;
-            }
-        }
-
         @Override
         public String toString() {
             return getClass().getSimpleName() + "(" + input.getPath() + ")";
@@ -483,17 +475,10 @@ public abstract class Parseable implements ConfigParseable {
         }
 
         @Override
-        ConfigOrigin origin() {
+        protected ConfigOrigin createOrigin() {
             return SimpleConfigOrigin.newResource(resource);
         }
 
-        @Override
-        public URL url() {
-            // because we may represent multiple resources, there's nothing
-            // good to return here.
-            return null;
-        }
-
         @Override
         public String toString() {
             return getClass().getSimpleName() + "(" + resource + ","
@@ -562,15 +547,10 @@ public abstract class Parseable implements ConfigParseable {
         }
 
         @Override
-        ConfigOrigin origin() {
+        protected ConfigOrigin createOrigin() {
             return SimpleConfigOrigin.newSimple("properties");
         }
 
-        @Override
-        public URL url() {
-            return null;
-        }
-
         @Override
         public String toString() {
             return getClass().getSimpleName() + "(" + props.size() + " props)";