diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/FileBasedConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/FileBasedConfig.java
index 72dfec6e0118f1efc4c2bc9e46bd75c7b6fd69fb..315c4670ad20bcf34e266ec4fe2e1ca14f2260cb 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/FileBasedConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/FileBasedConfig.java
@@ -62,6 +62,7 @@
  */
 public class FileBasedConfig extends Config {
 	private final File configFile;
+	private volatile long lastModified;
 
 	/**
 	 * Create a configuration with no default fallback.
@@ -103,6 +104,7 @@ public final File getFile() {
 	 *             the file is not a properly formatted configuration file.
 	 */
 	public void load() throws IOException, ConfigInvalidException {
+		lastModified = getFile().lastModified();
 		try {
 			fromText(RawParseUtils.decode(IO.readFully(getFile())));
 		} catch (FileNotFoundException noFile) {
@@ -134,16 +136,26 @@ public void save() throws IOException {
 		if (!lf.lock())
 			throw new IOException("Cannot lock " + getFile());
 		try {
+			lf.setNeedStatInformation(true);
 			lf.write(out);
 			if (!lf.commit())
 				throw new IOException("Cannot commit write to " + getFile());
 		} finally {
 			lf.unlock();
 		}
+		lastModified = lf.getCommitLastModified();
 	}
 
 	@Override
 	public String toString() {
 		return getClass().getSimpleName() + "[" + getFile().getPath() + "]";
 	}
+
+	/**
+	 * @return returns true if the currently loaded configuration file is older
+	 * than the file on disk
+	 */
+	public boolean isOutdated() {
+		return getFile().lastModified() != lastModified;
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
index c00d81dcd1acb452a7369a7534116de039dcf2ee..e2d3da6bc2c7a7fbd6b91b956d2fc9b6121e4d2f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
@@ -96,6 +96,8 @@ public class Repository {
 
 	private final File gitDir;
 
+	private final FileBasedConfig userConfig;
+
 	private final RepositoryConfig config;
 
 	private final RefDatabase refs;
@@ -191,26 +193,11 @@ public Repository(final File d, final File workTree, final File objectDir,
 				throw new IllegalArgumentException("Either GIT_DIR or GIT_WORK_TREE must be passed to Repository constructor");
 		}
 
-		final FileBasedConfig userConfig;
 		userConfig = SystemReader.getInstance().openUserConfig();
-		try {
-			userConfig.load();
-		} catch (ConfigInvalidException e1) {
-			IOException e2 = new IOException("User config file "
-					+ userConfig.getFile().getAbsolutePath() + " invalid: "
-					+ e1);
-			e2.initCause(e1);
-			throw e2;
-		}
 		config = new RepositoryConfig(userConfig, FS.resolve(gitDir, "config"));
 
-		try {
-			getConfig().load();
-		} catch (ConfigInvalidException e1) {
-			IOException e2 = new IOException("Unknown repository format");
-			e2.initCause(e1);
-			throw e2;
-		}
+		loadUserConfig();
+		loadConfig();
 
 		if (workDir == null) {
 			String workTreeConfig = getConfig().getString("core", null, "worktree");
@@ -244,6 +231,29 @@ public Repository(final File d, final File workTree, final File objectDir,
 		}
 	}
 
+	private void loadUserConfig() throws IOException {
+		try {
+			userConfig.load();
+		} catch (ConfigInvalidException e1) {
+			IOException e2 = new IOException("User config file "
+					+ userConfig.getFile().getAbsolutePath() + " invalid: "
+					+ e1);
+			e2.initCause(e1);
+			throw e2;
+		}
+	}
+
+	private void loadConfig() throws IOException {
+		try {
+			config.load();
+		} catch (ConfigInvalidException e1) {
+			IOException e2 = new IOException("Unknown repository format");
+			e2.initCause(e1);
+			throw e2;
+		}
+	}
+
+
 	/**
 	 * Create a new Git repository initializing the necessary files and
 	 * directories. Repository with working tree is created using this method.
@@ -320,6 +330,20 @@ public RefDatabase getRefDatabase() {
 	 * @return the configuration of this repository
 	 */
 	public RepositoryConfig getConfig() {
+		if (userConfig.isOutdated()) {
+			try {
+				loadUserConfig();
+			} catch (IOException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		if (config.isOutdated()) {
+				try {
+					loadConfig();
+				} catch (IOException e) {
+					throw new RuntimeException(e);
+				}
+		}
 		return config;
 	}