Index: src/main/java/geniusweb/profilesserver/AutoUpdatingProfilesFactory.java
===================================================================
--- src/main/java/geniusweb/profilesserver/AutoUpdatingProfilesFactory.java	(revision 8)
+++ src/main/java/geniusweb/profilesserver/AutoUpdatingProfilesFactory.java	(revision 12)
@@ -2,5 +2,7 @@
 
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
+import java.io.Writer;
 import java.net.URISyntaxException;
 import java.nio.file.Path;
@@ -63,4 +65,32 @@
 	}
 
+	@Override
+	public synchronized void putProfile(Profile profile) throws IOException {
+		if (!available.containsKey(profile.getDomain())) {
+			throw new IOException("profile's domain does not exist");
+		}
+		String domainname = profile.getDomain().getName();
+		String profilename = profile.getName();
+		if (!profilename.matches("[a-zA-Z0-9-]+"))
+			throw new IOException("illegal profile name " + profilename
+					+ ", only letters, numbers and - allowed");
+		File file = Paths
+				.get(rootdir.toString(), domainname, profilename + JSON)
+				.toFile();
+		if (file.exists()) {
+			String msg = fileCheck(file, false, true);
+			if (msg != null)
+				throw new IOException(msg);
+		}
+
+		// CHECK utf-8 compatibility? Do we need that anyway?
+		try (Writer out = new FileWriter(file, false)) {
+			out.write(Jackson.instance().writeValueAsString(profile));
+		}
+		// trigger the update immediately, avoid wait for FileChecker.
+		super.add(profile);
+
+	}
+
 	/**
 	 * Called when some file that may be relevant has changed. Synchronized to
@@ -267,5 +297,6 @@
 
 	/**
-	 * check and report basic problems with a file.
+	 * Silent check and report basic problems with a file. Silent in the sense
+	 * that errors are logged but cause no exception.
 	 * 
 	 * @param file              the file to check
@@ -275,25 +306,42 @@
 	 */
 	private boolean basicFileCheck(File file, boolean shouldbeDirectory) {
+		String msg = fileCheck(file, shouldbeDirectory, false);
+		if (msg != null) {
+			log.log(Level.WARNING, msg);
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 
+	 * @param file              the file to check
+	 * @param shouldbeDirectory true if expected a directory
+	 * @param shouldbeWritable  true if expected to be writable
+	 * @return null if file is there, is file/directory, allows reading and
+	 *         allows writing (if specified).
+	 */
+	private String fileCheck(File file, boolean shouldbeDirectory,
+			boolean shouldbeWritable) {
 		if (!file.exists()) {
-			log.log(Level.WARNING, file + " is missing");
-			return false;
+			return file + " is missing";
 		}
 		if (!file.canRead()) {
-			log.log(Level.WARNING,
-					"directory " + file + "does not allow reading ");
-			return false;
+			return "directory " + file + "does not allow reading ";
 		}
 		if (shouldbeDirectory) {
 			if (!file.isDirectory()) {
-				log.log(Level.WARNING, file + " is not a directory");
-				return false;
+				return file + " is not a directory";
 			}
 		} else {
 			if (!file.isFile()) {
-				log.log(Level.WARNING, file + " is not a file");
-				return false;
-			}
-		}
-		return true;
+				return file + " is not a file";
+			}
+		}
+		if (shouldbeWritable && !file.canWrite()) {
+			return file + "is read-only";
+		}
+		return null;
+
 	}
 
Index: src/main/java/geniusweb/profilesserver/DefaultProfilesFactory.java
===================================================================
--- src/main/java/geniusweb/profilesserver/DefaultProfilesFactory.java	(revision 8)
+++ src/main/java/geniusweb/profilesserver/DefaultProfilesFactory.java	(revision 12)
@@ -1,4 +1,5 @@
 package geniusweb.profilesserver;
 
+import java.io.IOException;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -84,4 +85,12 @@
 	}
 
+	@Override
+	public synchronized void putProfile(Profile profile) throws IOException {
+		if (!available.containsKey(profile.getDomain())) {
+			throw new IOException("profile's domain does not exist");
+		}
+		add(profile);
+	}
+
 	/**************** support for updating ***************/
 	/**
Index: src/main/java/geniusweb/profilesserver/ProfilesFactory.java
===================================================================
--- src/main/java/geniusweb/profilesserver/ProfilesFactory.java	(revision 8)
+++ src/main/java/geniusweb/profilesserver/ProfilesFactory.java	(revision 12)
@@ -1,4 +1,5 @@
 package geniusweb.profilesserver;
 
+import java.io.IOException;
 import java.util.List;
 
@@ -40,3 +41,12 @@
 	List<Profile> getProfiles(String domainname);
 
+	/**
+	 * Permanently (over)write a profile to the repository (not just in memory).
+	 * 
+	 * @param profile the profile to be written. The domain file must exist and
+	 *                match.
+	 * @throws IOException if the profile does not meet the requirements.
+	 */
+	void putProfile(Profile profile) throws IOException;
+
 }
