diff --git a/src/main/java/org/apache/commons/configuration2/io/FileLocator.java b/src/main/java/org/apache/commons/configuration2/io/FileLocator.java
index f0d02f7..bb7932c 100644
--- a/src/main/java/org/apache/commons/configuration2/io/FileLocator.java
+++ b/src/main/java/org/apache/commons/configuration2/io/FileLocator.java
@@ -56,181 +56,6 @@
  */
 public final class FileLocator
 {
-    /** The file name. */
-    private final String fileName;
-
-    /** The base path. */
-    private final String basePath;
-
-    /** The source URL. */
-    private final URL sourceURL;
-
-    /** The encoding. */
-    private final String encoding;
-
-    /** The file system. */
-    private final FileSystem fileSystem;
-
-    /** The file location strategy. */
-    private final FileLocationStrategy locationStrategy;
-
-    /**
-     * Creates a new instance of {@code FileLocatorImpl} and initializes it from
-     * the given builder instance
-     *
-     * @param builder the builder
-     */
-    public FileLocator(final FileLocatorBuilder builder)
-    {
-        fileName = builder.fileName;
-        basePath = builder.basePath;
-        sourceURL = builder.sourceURL;
-        encoding = builder.encoding;
-        fileSystem = builder.fileSystem;
-        locationStrategy = builder.locationStrategy;
-    }
-
-    /**
-     * Returns the file name stored in this locator or <b>null</b> if it is
-     * undefined.
-     *
-     * @return the file name
-     */
-    public String getFileName()
-    {
-        return fileName;
-    }
-
-    /**
-     * Returns the base path stored in this locator or <b>null</b> if it is
-     * undefined.
-     *
-     * @return the base path
-     */
-    public String getBasePath()
-    {
-        return basePath;
-    }
-
-    /**
-     * Returns the URL pointing to the referenced source file or <b>null</b> if
-     * it is undefined.
-     *
-     * @return the source URL
-     */
-    public URL getSourceURL()
-    {
-        return sourceURL;
-    }
-
-    /**
-     * Returns the encoding stored in this locator or <b>null</b> if it is
-     * undefined.
-     *
-     * @return the encoding
-     */
-    public String getEncoding()
-    {
-        return encoding;
-    }
-
-    /**
-     * Returns the {@code FileSystem} to be used for accessing the file
-     * referenced by this locator or <b>null</b> if it is undefined.
-     *
-     * @return the {@code FileSystem}
-     */
-    public FileSystem getFileSystem()
-    {
-        return fileSystem;
-    }
-
-    /**
-     * Returns the {@code FileLocationStrategy} to be used for locating the
-     * referenced file. If no specific {@code FileLocationStrategy} has been
-     * set, result is <b>null</b>. This means that the default strategy should
-     * be used.
-     *
-     * @return the {@code FileLocationStrategy} to be used
-     */
-    public FileLocationStrategy getLocationStrategy()
-    {
-        return locationStrategy;
-    }
-
-    /**
-     * Returns a hash code for this object.
-     *
-     * @return a hash code for this object
-     */
-    @Override
-    public int hashCode()
-    {
-        return new HashCodeBuilder().append(getFileName())
-                .append(getBasePath()).append(sourceURLAsString())
-                .append(getEncoding()).append(getFileSystem())
-                .append(getLocationStrategy()).toHashCode();
-    }
-
-    /**
-     * Compares this object with another one. Two instances of
-     * {@code FileLocatorImpl} are considered equal if all of their properties
-     * are equal.
-     *
-     * @param obj the object to compare to
-     * @return a flag whether these objects are equal
-     */
-    @Override
-    public boolean equals(final Object obj)
-    {
-        if (this == obj)
-        {
-            return true;
-        }
-        if (!(obj instanceof FileLocator))
-        {
-            return false;
-        }
-
-        final FileLocator c = (FileLocator) obj;
-        return new EqualsBuilder().append(getFileName(), c.getFileName())
-                .append(getBasePath(), c.getBasePath())
-                .append(sourceURLAsString(), c.sourceURLAsString())
-                .append(getEncoding(), c.getEncoding())
-                .append(getFileSystem(), c.getFileSystem())
-                .append(getLocationStrategy(), c.getLocationStrategy())
-                .isEquals();
-    }
-
-    /**
-     * Returns a string representation of this object. This string contains the
-     * values of all properties.
-     *
-     * @return a string for this object
-     */
-    @Override
-    public String toString()
-    {
-        return new ToStringBuilder(this).append("fileName", getFileName())
-                .append("basePath", getBasePath())
-                .append("sourceURL", sourceURLAsString())
-                .append("encoding", getEncoding())
-                .append("fileSystem", getFileSystem())
-                .append("locationStrategy", getLocationStrategy()).toString();
-    }
-
-    /**
-     * Returns the source URL as a string. Result is never null. Comparisons are
-     * done on this string to avoid blocking network calls.
-     *
-     * @return the source URL as a string (not null)
-     */
-    private String sourceURLAsString()
-    {
-        return sourceURL != null ? sourceURL.toExternalForm()
-                : StringUtils.EMPTY;
-    }
-
     /**
      * A typical <em>builder</em> implementation for creating
      * {@code FileLocator} objects. An instance of this class is returned by the
@@ -275,30 +100,6 @@
         }
 
         /**
-         * Specifies the encoding of the new {@code FileLocator}.
-         *
-         * @param enc the encoding
-         * @return a reference to this builder for method chaining
-         */
-        public FileLocatorBuilder encoding(final String enc)
-        {
-            encoding = enc;
-            return this;
-        }
-
-        /**
-         * Specifies the {@code FileSystem} of the new {@code FileLocator}.
-         *
-         * @param fs the {@code FileSystem}
-         * @return a reference to this builder for method chaining
-         */
-        public FileLocatorBuilder fileSystem(final FileSystem fs)
-        {
-            fileSystem = fs;
-            return this;
-        }
-
-        /**
          * Specifies the base path of the new {@code FileLocator}.
          *
          * @param path the base path
@@ -311,6 +112,29 @@
         }
 
         /**
+         * Creates a new immutable {@code FileLocatorImpl} object based on the
+         * properties set so far for this builder.
+         *
+         * @return the newly created {@code FileLocator} object
+         */
+        public FileLocator create()
+        {
+            return new FileLocator(this);
+        }
+
+        /**
+         * Specifies the encoding of the new {@code FileLocator}.
+         *
+         * @param enc the encoding
+         * @return a reference to this builder for method chaining
+         */
+        public FileLocatorBuilder encoding(final String enc)
+        {
+            encoding = enc;
+            return this;
+        }
+
+        /**
          * Specifies the file name of the new {@code FileLocator}.
          *
          * @param name the file name
@@ -323,42 +147,18 @@
         }
 
         /**
-         * Specifies the source URL of the new {@code FileLocator}.
+         * Specifies the {@code FileSystem} of the new {@code FileLocator}.
          *
-         * @param url the source URL
+         * @param fs the {@code FileSystem}
          * @return a reference to this builder for method chaining
          */
-        public FileLocatorBuilder sourceURL(final URL url)
+        public FileLocatorBuilder fileSystem(final FileSystem fs)
         {
-            sourceURL = url;
+            fileSystem = fs;
             return this;
         }
 
         /**
-         * Specifies the {@code FileLocationStrategy} to be used when the
-         * referenced file is to be located.
-         *
-         * @param strategy the {@code FileLocationStrategy}
-         * @return a reference to this builder for method chaining
-         */
-        public FileLocatorBuilder locationStrategy(final FileLocationStrategy strategy)
-        {
-            locationStrategy = strategy;
-            return this;
-        }
-
-        /**
-         * Creates a new immutable {@code FileLocatorImpl} object based on the
-         * properties set so far for this builder.
-         *
-         * @return the newly created {@code FileLocator} object
-         */
-        public FileLocator create()
-        {
-            return new FileLocator(this);
-        }
-
-        /**
          * Initializes the properties of this builder from the passed in locator
          * object.
          *
@@ -373,5 +173,205 @@
             fileSystem = src.getFileSystem();
             locationStrategy = src.getLocationStrategy();
         }
+
+        /**
+         * Specifies the {@code FileLocationStrategy} to be used when the
+         * referenced file is to be located.
+         *
+         * @param strategy the {@code FileLocationStrategy}
+         * @return a reference to this builder for method chaining
+         */
+        public FileLocatorBuilder locationStrategy(final FileLocationStrategy strategy)
+        {
+            locationStrategy = strategy;
+            return this;
+        }
+
+        /**
+         * Specifies the source URL of the new {@code FileLocator}.
+         *
+         * @param url the source URL
+         * @return a reference to this builder for method chaining
+         */
+        public FileLocatorBuilder sourceURL(final URL url)
+        {
+            sourceURL = url;
+            return this;
+        }
+    }
+
+    /** The file name. */
+    private final String fileName;
+
+    /** The base path. */
+    private final String basePath;
+
+    /** The source URL. */
+    private final URL sourceURL;
+
+    /** The encoding. */
+    private final String encoding;
+
+    /** The file system. */
+    private final FileSystem fileSystem;
+
+    /** The file location strategy. */
+    private final FileLocationStrategy locationStrategy;
+
+    /**
+     * Creates a new instance of {@code FileLocatorImpl} and initializes it from
+     * the given builder instance
+     *
+     * @param builder the builder
+     */
+    public FileLocator(final FileLocatorBuilder builder)
+    {
+        fileName = builder.fileName;
+        basePath = builder.basePath;
+        sourceURL = builder.sourceURL;
+        encoding = builder.encoding;
+        fileSystem = builder.fileSystem;
+        locationStrategy = builder.locationStrategy;
+    }
+
+    /**
+     * Compares this object with another one. Two instances of
+     * {@code FileLocatorImpl} are considered equal if all of their properties
+     * are equal.
+     *
+     * @param obj the object to compare to
+     * @return a flag whether these objects are equal
+     */
+    @Override
+    public boolean equals(final Object obj)
+    {
+        if (this == obj)
+        {
+            return true;
+        }
+        if (!(obj instanceof FileLocator))
+        {
+            return false;
+        }
+
+        final FileLocator c = (FileLocator) obj;
+        return new EqualsBuilder().append(getFileName(), c.getFileName())
+                .append(getBasePath(), c.getBasePath())
+                .append(sourceURLAsString(), c.sourceURLAsString())
+                .append(getEncoding(), c.getEncoding())
+                .append(getFileSystem(), c.getFileSystem())
+                .append(getLocationStrategy(), c.getLocationStrategy())
+                .isEquals();
+    }
+
+    /**
+     * Returns the base path stored in this locator or <b>null</b> if it is
+     * undefined.
+     *
+     * @return the base path
+     */
+    public String getBasePath()
+    {
+        return basePath;
+    }
+
+    /**
+     * Returns the encoding stored in this locator or <b>null</b> if it is
+     * undefined.
+     *
+     * @return the encoding
+     */
+    public String getEncoding()
+    {
+        return encoding;
+    }
+
+    /**
+     * Returns the file name stored in this locator or <b>null</b> if it is
+     * undefined.
+     *
+     * @return the file name
+     */
+    public String getFileName()
+    {
+        return fileName;
+    }
+
+    /**
+     * Returns the {@code FileSystem} to be used for accessing the file
+     * referenced by this locator or <b>null</b> if it is undefined.
+     *
+     * @return the {@code FileSystem}
+     */
+    public FileSystem getFileSystem()
+    {
+        return fileSystem;
+    }
+
+    /**
+     * Returns the {@code FileLocationStrategy} to be used for locating the
+     * referenced file. If no specific {@code FileLocationStrategy} has been
+     * set, result is <b>null</b>. This means that the default strategy should
+     * be used.
+     *
+     * @return the {@code FileLocationStrategy} to be used
+     */
+    public FileLocationStrategy getLocationStrategy()
+    {
+        return locationStrategy;
+    }
+
+    /**
+     * Returns the URL pointing to the referenced source file or <b>null</b> if
+     * it is undefined.
+     *
+     * @return the source URL
+     */
+    public URL getSourceURL()
+    {
+        return sourceURL;
+    }
+
+    /**
+     * Returns a hash code for this object.
+     *
+     * @return a hash code for this object
+     */
+    @Override
+    public int hashCode()
+    {
+        return new HashCodeBuilder().append(getFileName())
+                .append(getBasePath()).append(sourceURLAsString())
+                .append(getEncoding()).append(getFileSystem())
+                .append(getLocationStrategy()).toHashCode();
+    }
+
+    /**
+     * Returns the source URL as a string. Result is never null. Comparisons are
+     * done on this string to avoid blocking network calls.
+     *
+     * @return the source URL as a string (not null)
+     */
+    private String sourceURLAsString()
+    {
+        return sourceURL != null ? sourceURL.toExternalForm()
+                : StringUtils.EMPTY;
+    }
+
+    /**
+     * Returns a string representation of this object. This string contains the
+     * values of all properties.
+     *
+     * @return a string for this object
+     */
+    @Override
+    public String toString()
+    {
+        return new ToStringBuilder(this).append("fileName", getFileName())
+                .append("basePath", getBasePath())
+                .append("sourceURL", sourceURLAsString())
+                .append("encoding", getEncoding())
+                .append("fileSystem", getFileSystem())
+                .append("locationStrategy", getLocationStrategy()).toString();
     }
 }
