[freenet-cvs] r11718 - in trunk/freenet/src/freenet: client client/async clients/http config crypt node node/fcp support support/io support/math tools

toad at freenetproject.org toad at freenetproject.org
Fri Feb 9 20:54:58 UTC 2007


Author: toad
Date: 2007-02-09 20:54:57 +0000 (Fri, 09 Feb 2007)
New Revision: 11718

Modified:
   trunk/freenet/src/freenet/client/FailureCodeTracker.java
   trunk/freenet/src/freenet/client/async/SingleFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
   trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
   trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java
   trunk/freenet/src/freenet/config/FilePersistentConfig.java
   trunk/freenet/src/freenet/config/SubConfig.java
   trunk/freenet/src/freenet/crypt/DSAGroup.java
   trunk/freenet/src/freenet/crypt/DSAPrivateKey.java
   trunk/freenet/src/freenet/crypt/DSAPublicKey.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeStarter.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/node/ThrottleWindowManager.java
   trunk/freenet/src/freenet/node/fcp/AddPeer.java
   trunk/freenet/src/freenet/node/fcp/AllDataMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientPut.java
   trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientRequest.java
   trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java
   trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java
   trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java
   trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java
   trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java
   trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java
   trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java
   trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java
   trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
   trunk/freenet/src/freenet/node/fcp/PeerNote.java
   trunk/freenet/src/freenet/node/fcp/PeerRemoved.java
   trunk/freenet/src/freenet/node/fcp/PersistentGet.java
   trunk/freenet/src/freenet/node/fcp/PersistentPut.java
   trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
   trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java
   trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java
   trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java
   trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java
   trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java
   trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java
   trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java
   trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
   trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java
   trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
   trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java
   trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java
   trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java
   trunk/freenet/src/freenet/node/fcp/WatchGlobal.java
   trunk/freenet/src/freenet/support/SimpleFieldSet.java
   trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
   trunk/freenet/src/freenet/support/io/FileBucket.java
   trunk/freenet/src/freenet/support/io/NullBucket.java
   trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
   trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java
   trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java
   trunk/freenet/src/freenet/support/io/TempFileBucket.java
   trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java
   trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java
   trunk/freenet/src/freenet/tools/AddRef.java
Log:
SimpleFieldSet: APIs must be as simple as possible AND NO SIMPLER.
Also some minor code cleanups.

Modified: trunk/freenet/src/freenet/client/FailureCodeTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/FailureCodeTracker.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/FailureCodeTracker.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -117,7 +117,8 @@
 	}
 
 	/** Copy verbosely to a SimpleFieldSet */
-	public synchronized void copyToFieldSet(SimpleFieldSet sfs, String prefix, boolean verbose) {
+	public synchronized SimpleFieldSet toFieldSet(boolean verbose) {
+		SimpleFieldSet sfs = new SimpleFieldSet();
 		Iterator keys = map.keySet().iterator();
 		while(keys.hasNext()) {
 			Integer k = (Integer) keys.next();
@@ -126,10 +127,11 @@
 			// prefix.num.Description=<code description>
 			// prefix.num.Count=<count>
 			if(verbose)
-				sfs.put(prefix+Integer.toString(code)+".Description", 
+				sfs.putSingle(Integer.toString(code)+".Description", 
 						insert ? InserterException.getMessage(code) : FetchException.getMessage(code));
-			sfs.put(prefix+Integer.toString(code)+".Count", Integer.toString(item.x));
+			sfs.putSingle(Integer.toString(code)+".Count", Integer.toString(item.x));
 		}
+		return sfs;
 	}
 
 	public synchronized boolean isOneCodeOnly() {

Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -582,7 +582,7 @@
 				curMetadataPutter = metadataPutter;
 			}
 			SimpleFieldSet fs = new SimpleFieldSet();
-			fs.put("Type", "SplitHandler");
+			fs.putSingle("Type", "SplitHandler");
 			if(curSFI != null)
 				fs.put("SplitFileInserter", curSFI.getProgressFieldset());
 			if(curMetadataPutter != null)

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserter.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserter.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -48,18 +48,18 @@
 		SimpleFieldSet fs = new SimpleFieldSet();
 		// don't save basic infrastructure such as ctx and parent
 		// only save details of the request
-		fs.put("Type", "SplitFileInserter");
-		fs.put("DataLength", Long.toString(dataLength));
-		fs.put("CompressionCodec", Short.toString(compressionCodec));
-		fs.put("SplitfileCodec", Short.toString(splitfileAlgorithm));
-		fs.put("Finished", Boolean.toString(finished));
-		fs.put("SegmentSize", Integer.toString(segmentSize));
-		fs.put("CheckSegmentSize", Integer.toString(checkSegmentSize));
+		fs.putSingle("Type", "SplitFileInserter");
+		fs.putSingle("DataLength", Long.toString(dataLength));
+		fs.putSingle("CompressionCodec", Short.toString(compressionCodec));
+		fs.putSingle("SplitfileCodec", Short.toString(splitfileAlgorithm));
+		fs.putSingle("Finished", Boolean.toString(finished));
+		fs.putSingle("SegmentSize", Integer.toString(segmentSize));
+		fs.putSingle("CheckSegmentSize", Integer.toString(checkSegmentSize));
 		SimpleFieldSet segs = new SimpleFieldSet();
 		for(int i=0;i<segments.length;i++) {
 			segs.put(Integer.toString(i), segments[i].getProgressFieldset());
 		}
-		segs.put("Count", Integer.toString(segments.length));
+		segs.putSingle("Count", Integer.toString(segments.length));
 		fs.put("Segments", segs);
 		return fs;
 	}

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserterSegment.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -230,19 +230,19 @@
 
 	public synchronized SimpleFieldSet getProgressFieldset() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "SplitFileInserterSegment");
-		fs.put("Finished", Boolean.toString(finished));
+		fs.putSingle("Type", "SplitFileInserterSegment");
+		fs.putSingle("Finished", Boolean.toString(finished));
 		// If true, check blocks which are null are finished 
-		fs.put("Encoded", Boolean.toString(encoded));
+		fs.putSingle("Encoded", Boolean.toString(encoded));
 		// If true, data blocks which are null are finished
-		fs.put("Started", Boolean.toString(started));
-		errors.copyToFieldSet(fs, "Errors.", false);
+		fs.putSingle("Started", Boolean.toString(started));
+		fs.put("Errors", errors.toFieldSet(false));
 		SimpleFieldSet dataFS = new SimpleFieldSet();
-		dataFS.put("Count", Integer.toString(dataBlocks.length));
+		dataFS.putSingle("Count", Integer.toString(dataBlocks.length));
 		for(int i=0;i<dataBlocks.length;i++) {
 			SimpleFieldSet block = new SimpleFieldSet();
 			if(dataURIs[i] != null)
-				block.put("URI", dataURIs[i].toString());
+				block.putSingle("URI", dataURIs[i].toString());
 			SingleBlockInserter sbi =
 				dataBlockInserters[i];
 			// If started, then sbi = null => block finished.
@@ -270,11 +270,11 @@
 		}
 		fs.put("DataBlocks", dataFS);
 		SimpleFieldSet checkFS = new SimpleFieldSet();
-		checkFS.put("Count", Integer.toString(checkBlocks.length));
+		checkFS.putSingle("Count", Integer.toString(checkBlocks.length));
 		for(int i=0;i<checkBlocks.length;i++) {
 			SimpleFieldSet block = new SimpleFieldSet();
 			if(checkURIs[i] != null)
-				block.put("URI", checkURIs[i].toString());
+				block.putSingle("URI", checkURIs[i].toString());
 			SingleBlockInserter sbi =
 				checkBlockInserters[i];
 			// If encoded, then sbi == null => block finished

Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -669,7 +669,7 @@
 			SimpleFieldSet fs;
 			
 			try {
-				fs = new SimpleFieldSet(ref.toString());
+				fs = new SimpleFieldSet(ref.toString(), false);
 				fs.setEndMarker("End"); // It's always End ; the regex above doesn't always grok this
 			} catch (IOException e) {
 				this.sendErrorPage(ctx, 200, "Failed To Add Node", "Unable to parse the given text as a node reference ("+e+"). Please try again.");

Modified: trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/clients/http/N2NTMToadlet.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -133,12 +133,12 @@
 					try {
 						long now = System.currentTimeMillis();
 						SimpleFieldSet fs = new SimpleFieldSet();
-						fs.put("type", Integer.toString(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT));
-						fs.put("source_nodename", Base64.encode(node.getMyName().getBytes()));
-						fs.put("target_nodename", Base64.encode(pn.getName().getBytes()));
-						fs.put("text", Base64.encode(message.getBytes()));
-						fs.put("composedTime", Long.toString(now));
-						fs.put("sentTime", Long.toString(now));
+						fs.putSingle("type", Integer.toString(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT));
+						fs.putSingle("source_nodename", Base64.encode(node.getMyName().getBytes()));
+						fs.putSingle("target_nodename", Base64.encode(pn.getName().getBytes()));
+						fs.putSingle("text", Base64.encode(message.getBytes()));
+						fs.putSingle("composedTime", Long.toString(now));
+						fs.putSingle("sentTime", Long.toString(now));
 						Message n2ntm;
 						if(Version.buildNumber() < 1000) {  // FIXME/TODO: This test shouldn't be needed eventually
 							n2ntm = DMT.createNodeToNodeTextMessage(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT, node.getMyName(), pn.getName(), message);

Modified: trunk/freenet/src/freenet/config/FilePersistentConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/FilePersistentConfig.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/config/FilePersistentConfig.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -96,7 +96,7 @@
 		try {
 			LineReadingInputStream lis = new LineReadingInputStream(bis);
 			// Config file is UTF-8 too!
-			return new SimpleFieldSet(lis, 32768, 128, true, true);
+			return new SimpleFieldSet(lis, 32768, 128, true, true, true); // FIXME? advanced users may edit the config file, hence true?
 		} finally {
 			try {
 				fis.close();

Modified: trunk/freenet/src/freenet/config/SubConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/SubConfig.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/config/SubConfig.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -210,7 +210,7 @@
 					Logger.minor(this, "Skipping "+key+" - "+o.isDefault());
 				continue;
 			}
-			fs.put(key, o.getValueString());
+			fs.putSingle(key, o.getValueString());
 			if(logMINOR)
 				Logger.minor(this, "Key="+prefix+'.'+key+" value="+o.getValueString());
 		}

Modified: trunk/freenet/src/freenet/crypt/DSAGroup.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAGroup.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/crypt/DSAGroup.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -342,9 +342,9 @@
     
 	public SimpleFieldSet asFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("p", Base64.encode(p.toByteArray()));
-		fs.put("q", Base64.encode(q.toByteArray()));
-		fs.put("g", Base64.encode(g.toByteArray()));
+		fs.putSingle("p", Base64.encode(p.toByteArray()));
+		fs.putSingle("q", Base64.encode(q.toByteArray()));
+		fs.putSingle("g", Base64.encode(g.toByteArray()));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/crypt/DSAPrivateKey.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAPrivateKey.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/crypt/DSAPrivateKey.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -71,7 +71,7 @@
 
 	public SimpleFieldSet asFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("x", Base64.encode(x.toByteArray()));
+		fs.putSingle("x", Base64.encode(x.toByteArray()));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/crypt/DSAPublicKey.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAPublicKey.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/crypt/DSAPublicKey.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -188,7 +188,7 @@
 
 	public SimpleFieldSet asFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("y", Base64.encode(y.toByteArray()));
+		fs.putSingle("y", Base64.encode(y.toByteArray()));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/Node.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -526,7 +526,7 @@
 		FileInputStream fis = new FileInputStream(filename);
 		InputStreamReader isr = new InputStreamReader(fis);
 		BufferedReader br = new BufferedReader(isr);
-		SimpleFieldSet fs = new SimpleFieldSet(br);
+		SimpleFieldSet fs = new SimpleFieldSet(br, false);
 		br.close();
 		// Read contents
 		String[] udp = fs.getAll("physical.udp");
@@ -642,8 +642,14 @@
 			myARKNumber = 0;
 		} else {
 			ark = null;
-			s = fs.get("old-ark.number");
-			privARK = fs.get("old-ark.privURI");
+			// FIXME remove in a few versions; back compat support for 1012 only
+			// and not very important; remove in 1014??
+			// Note that "old-ark" doesn't work because it is stripped by the manually
+			// posted references filter.
+			s = fs.get("oldark.number");
+			if(s == null) s = fs.get("old-ark.number");
+			privARK = fs.get("oldark.privURI");
+			if(privARK == null) privARK = fs.get("old-ark.privURI");
 			try {
 				if(privARK != null) {
 					FreenetURI uri = new FreenetURI(privARK);
@@ -1347,10 +1353,10 @@
 		
 		SimpleFieldSet throttleFS = null;
 		try {
-			throttleFS = SimpleFieldSet.readFrom(persistTarget);
+			throttleFS = SimpleFieldSet.readFrom(persistTarget, false);
 		} catch (IOException e) {
 			try {
-				throttleFS = SimpleFieldSet.readFrom(persistTemp);
+				throttleFS = SimpleFieldSet.readFrom(persistTemp, false);
 			} catch (FileNotFoundException e1) {
 				// Ignore
 			} catch (IOException e1) {
@@ -1734,9 +1740,9 @@
 	public SimpleFieldSet exportPrivateFieldSet() {
 		SimpleFieldSet fs = exportPublicFieldSet(false);
 		fs.put("dsaPrivKey", myPrivKey.asFieldSet());
-		fs.put("ark.privURI", this.myARK.getInsertURI().toString(false, false));
+		fs.putSingle("ark.privURI", this.myARK.getInsertURI().toString(false, false));
 		if(myOldARK != null) {
-			fs.put("old-ark.privURI", this.myOldARK.getInsertURI().toString(false, false));
+			fs.putSingle("oldark.privURI", this.myOldARK.getInsertURI().toString(false, false));
 		}
 		return fs;
 	}
@@ -1761,34 +1767,40 @@
 		Peer[] ips = ipDetector.getPrimaryIPAddress();
 		if(ips != null) {
 			for(int i=0;i<ips.length;i++)
-				fs.put("physical.udp", ips[i].toString()); // Keep; important that node know all our IPs
+				fs.putAppend("physical.udp", ips[i].toString()); // Keep; important that node know all our IPs
 		}
-		fs.put("identity", Base64.encode(myIdentity)); // FIXME !forSetup after 11104 is mandatory
-		fs.put("location", Double.toString(lm.getLocation().getValue())); // FIXME maybe !forSetup; see #943
-		fs.put("version", Version.getVersionString()); // Keep, vital that peer know our version. For example, some types may be sent in different formats to different node versions (e.g. Peer).
-		fs.put("testnet", Boolean.toString(testnetEnabled)); // Vital that peer know this!
-		fs.put("lastGoodVersion", Version.getLastGoodVersionString()); // Also vital
+		fs.putSingle("identity", Base64.encode(myIdentity)); // FIXME !forSetup after 11104 is mandatory
+		fs.putSingle("location", Double.toString(lm.getLocation().getValue())); // FIXME maybe !forSetup; see #943
+		fs.putSingle("version", Version.getVersionString()); // Keep, vital that peer know our version. For example, some types may be sent in different formats to different node versions (e.g. Peer).
+		fs.putSingle("testnet", Boolean.toString(testnetEnabled)); // Vital that peer know this!
+		fs.putSingle("lastGoodVersion", Version.getLastGoodVersionString()); // Also vital
 		if(testnetEnabled)
-			fs.put("testnetPort", Integer.toString(testnetHandler.getPort())); // Useful, saves a lot of complexity
-		fs.put("myName", myName); // FIXME see #942
+			fs.putSingle("testnetPort", Integer.toString(testnetHandler.getPort())); // Useful, saves a lot of complexity
+		fs.putSingle("myName", myName); // FIXME see #942
 		if(!forSetup) {
 			// These are invariant. They cannot change on connection setup. They can safely be excluded.
 			fs.put("dsaGroup", myCryptoGroup.asFieldSet());
 			fs.put("dsaPubKey", myPubKey.asFieldSet());
 		}
-		fs.put("ark.number", Long.toString(this.myARKNumber)); // Can be changed on setup
-		fs.put("ark.pubURI", this.myARK.getURI().toString(false, false)); // Can be changed on setup
+		fs.putSingle("ark.number", Long.toString(this.myARKNumber)); // Can be changed on setup
+		fs.putSingle("ark.pubURI", this.myARK.getURI().toString(false, false)); // Can be changed on setup
 		if(myOldARK != null) {
-			fs.put("old-ark.number", Long.toString(this.myOldARKNumber));
-			fs.put("old-ark.pubURI", this.myOldARK.getURI().toString(false, false));
+			fs.putSingle("oldark.number", Long.toString(this.myOldARKNumber));
+			fs.putSingle("oldark.pubURI", this.myOldARK.getURI().toString(false, false));
 		}
 		
 		synchronized (referenceSync) {
 			if(myReferenceSignature == null || mySignedReference == null || !mySignedReference.equals(fs.toOrderedString())){
-				mySignedReference = fs.toOrderedString();	
+				mySignedReference = fs.toOrderedString();
+				if(logMINOR) Logger.minor(this, "Signing reference:\n"+mySignedReference);
 
 				try{
-					myReferenceSignature = DSA.sign(myCryptoGroup, myPrivKey, new BigInteger(1, SHA256.digest(mySignedReference.getBytes("UTF-8"))), random);
+					byte[] ref = mySignedReference.getBytes("UTF-8");
+					BigInteger m = new BigInteger(1, SHA256.digest(ref));
+					if(logMINOR) Logger.minor(this, "m = "+m.toString(16));
+					myReferenceSignature = DSA.sign(myCryptoGroup, myPrivKey, m, random);
+					if(!DSA.verify(myPubKey, myReferenceSignature, m))
+						Logger.normal(this, "Signature failed!");
 				} catch(UnsupportedEncodingException e){
 					//duh ?
 					Logger.error(this, "Error while signing the node identity!"+e);
@@ -1797,10 +1809,10 @@
 					exit(EXIT_CRAPPY_JVM);
 				}
 			}
-			fs.put("sig", myReferenceSignature.toString());
+			fs.putSingle("sig", myReferenceSignature.toString());
 		}
 		
-		if(logMINOR) Logger.minor(this, "My reference: "+fs);
+		if(logMINOR) Logger.minor(this, "My reference: "+fs.toOrderedString());
 		return fs;
 	}
 
@@ -1810,24 +1822,24 @@
 	public SimpleFieldSet exportVolatileFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
 		long now = System.currentTimeMillis();
-		fs.put("isUsingWrapper", Boolean.toString(isUsingWrapper()));
+		fs.putSingle("isUsingWrapper", Boolean.toString(isUsingWrapper()));
 		long nodeUptimeSeconds = 0;
 		synchronized(this) {
-			fs.put("startupTime", Long.toString(startupTime));
+			fs.putSingle("startupTime", Long.toString(startupTime));
 			nodeUptimeSeconds = (now - startupTime) / 1000;
-			fs.put("uptimeSeconds", Long.toString(nodeUptimeSeconds));
+			fs.putSingle("uptimeSeconds", Long.toString(nodeUptimeSeconds));
 		}
-		fs.put("averagePingTime", Double.toString(getNodeAveragePingTime()));
-		fs.put("bwlimitDelayTime", Double.toString(getBwlimitDelayTime()));
-		fs.put("networkSizeEstimateSession", Integer.toString(getNetworkSizeEstimate(-1)));
+		fs.putSingle("averagePingTime", Double.toString(getNodeAveragePingTime()));
+		fs.putSingle("bwlimitDelayTime", Double.toString(getBwlimitDelayTime()));
+		fs.putSingle("networkSizeEstimateSession", Integer.toString(getNetworkSizeEstimate(-1)));
 		int networkSizeEstimate24hourRecent = getNetworkSizeEstimate(now - (24*60*60*1000));  // 24 hours
-		fs.put("networkSizeEstimate24hourRecent", Integer.toString(networkSizeEstimate24hourRecent));
+		fs.putSingle("networkSizeEstimate24hourRecent", Integer.toString(networkSizeEstimate24hourRecent));
 		int networkSizeEstimate48hourRecent = getNetworkSizeEstimate(now - (48*60*60*1000));  // 48 hours
-		fs.put("networkSizeEstimate48hourRecent", Integer.toString(networkSizeEstimate48hourRecent));
-		fs.put("routingMissDistance", Double.toString(routingMissDistance.currentValue()));
-		fs.put("backedOffPercent", Double.toString(backedOffPercent.currentValue()));
-		fs.put("pInstantReject", Double.toString(pRejectIncomingInstantly()));
-		fs.put("unclaimedFIFOSize", Integer.toString(usm.getUnclaimedFIFOSize()));
+		fs.putSingle("networkSizeEstimate48hourRecent", Integer.toString(networkSizeEstimate48hourRecent));
+		fs.putSingle("routingMissDistance", Double.toString(routingMissDistance.currentValue()));
+		fs.putSingle("backedOffPercent", Double.toString(backedOffPercent.currentValue()));
+		fs.putSingle("pInstantReject", Double.toString(pRejectIncomingInstantly()));
+		fs.putSingle("unclaimedFIFOSize", Integer.toString(usm.getUnclaimedFIFOSize()));
 		
 		/* gather connection statistics */
 		PeerNodeStatus[] peerNodeStatuses = getPeerNodeStatuses();
@@ -1857,24 +1869,24 @@
 		int numberOfSimpleConnected = numberOfConnected + numberOfRoutingBackedOff;
 		int numberOfNotConnected = numberOfTooNew + numberOfTooOld + numberOfDisconnected + numberOfNeverConnected + numberOfDisabled + numberOfBursting + numberOfListening + numberOfListenOnly;
 
-		fs.put("numberOfConnected", Integer.toString(numberOfConnected));
-		fs.put("numberOfRoutingBackedOff", Integer.toString(numberOfRoutingBackedOff));
-		fs.put("numberOfTooNew", Integer.toString(numberOfTooNew));
-		fs.put("numberOfTooOld", Integer.toString(numberOfTooOld));
-		fs.put("numberOfDisconnected", Integer.toString(numberOfDisconnected));
-		fs.put("numberOfNeverConnected", Integer.toString(numberOfNeverConnected));
-		fs.put("numberOfDisabled", Integer.toString(numberOfDisabled));
-		fs.put("numberOfBursting", Integer.toString(numberOfBursting));
-		fs.put("numberOfListening", Integer.toString(numberOfListening));
-		fs.put("numberOfListenOnly", Integer.toString(numberOfListenOnly));
+		fs.putSingle("numberOfConnected", Integer.toString(numberOfConnected));
+		fs.putSingle("numberOfRoutingBackedOff", Integer.toString(numberOfRoutingBackedOff));
+		fs.putSingle("numberOfTooNew", Integer.toString(numberOfTooNew));
+		fs.putSingle("numberOfTooOld", Integer.toString(numberOfTooOld));
+		fs.putSingle("numberOfDisconnected", Integer.toString(numberOfDisconnected));
+		fs.putSingle("numberOfNeverConnected", Integer.toString(numberOfNeverConnected));
+		fs.putSingle("numberOfDisabled", Integer.toString(numberOfDisabled));
+		fs.putSingle("numberOfBursting", Integer.toString(numberOfBursting));
+		fs.putSingle("numberOfListening", Integer.toString(numberOfListening));
+		fs.putSingle("numberOfListenOnly", Integer.toString(numberOfListenOnly));
 		
-		fs.put("numberOfSimpleConnected", Integer.toString(numberOfSimpleConnected));
-		fs.put("numberOfNotConnected", Integer.toString(numberOfNotConnected));
+		fs.putSingle("numberOfSimpleConnected", Integer.toString(numberOfSimpleConnected));
+		fs.putSingle("numberOfNotConnected", Integer.toString(numberOfNotConnected));
 
-		fs.put("numberOfInserts", Integer.toString(getNumInserts()));
-		fs.put("numberOfRequests", Integer.toString(getNumRequests()));
-		fs.put("numberOfTransferringRequests", Integer.toString(getNumTransferringRequests()));
-		fs.put("numberOfARKFetchers", Integer.toString(getNumARKFetchers()));
+		fs.putSingle("numberOfInserts", Integer.toString(getNumInserts()));
+		fs.putSingle("numberOfRequests", Integer.toString(getNumRequests()));
+		fs.putSingle("numberOfTransferringRequests", Integer.toString(getNumTransferringRequests()));
+		fs.putSingle("numberOfARKFetchers", Integer.toString(getNumARKFetchers()));
 
 		long[] total = IOStatisticCollector.getTotalIO();
 		long total_output_rate = (total[0]) / nodeUptimeSeconds;
@@ -1882,19 +1894,19 @@
 		long totalPayloadOutput = getTotalPayloadSent();
 		long total_payload_output_rate = totalPayloadOutput / nodeUptimeSeconds;
 		int total_payload_output_percent = (int) (100 * totalPayloadOutput / total[0]);
-		fs.put("totalOutputBytes", Long.toString(total[0]));
-		fs.put("totalOutputRate", Long.toString(total_output_rate));
-		fs.put("totalPayloadOutputBytes", Long.toString(totalPayloadOutput));
-		fs.put("totalPayloadOutputRate", Long.toString(total_payload_output_rate));
-		fs.put("totalPayloadOutputPercent", Integer.toString(total_payload_output_percent));
-		fs.put("totalInputBytes", Long.toString(total[1]));
-		fs.put("totalInputRate", Long.toString(total_input_rate));
+		fs.putSingle("totalOutputBytes", Long.toString(total[0]));
+		fs.putSingle("totalOutputRate", Long.toString(total_output_rate));
+		fs.putSingle("totalPayloadOutputBytes", Long.toString(totalPayloadOutput));
+		fs.putSingle("totalPayloadOutputRate", Long.toString(total_payload_output_rate));
+		fs.putSingle("totalPayloadOutputPercent", Integer.toString(total_payload_output_percent));
+		fs.putSingle("totalInputBytes", Long.toString(total[1]));
+		fs.putSingle("totalInputRate", Long.toString(total_input_rate));
 		long[] rate = getNodeIOStats();
 		long delta = (rate[5] - rate[2]) / 1000;
 		long recent_output_rate = (rate[3] - rate[0]) / delta;
 		long recent_input_rate = (rate[4] - rate[1]) / delta;
-		fs.put("recentOutputRate", Long.toString(recent_output_rate));
-		fs.put("recentInputRate", Long.toString(recent_input_rate));
+		fs.putSingle("recentOutputRate", Long.toString(recent_output_rate));
+		fs.putSingle("recentInputRate", Long.toString(recent_input_rate));
 
 		String [] routingBackoffReasons = getPeerNodeRoutingBackoffReasons();
 		if(routingBackoffReasons.length != 0) {
@@ -1906,12 +1918,12 @@
 		double swaps = (double)getSwaps();
 		double noSwaps = (double)getNoSwaps();
 		double numberOfRemotePeerLocationsSeenInSwaps = (double)getNumberOfRemotePeerLocationsSeenInSwaps();
-		fs.put("numberOfRemotePeerLocationsSeenInSwaps", Double.toString(numberOfRemotePeerLocationsSeenInSwaps));
+		fs.putSingle("numberOfRemotePeerLocationsSeenInSwaps", Double.toString(numberOfRemotePeerLocationsSeenInSwaps));
 		double avgConnectedPeersPerNode = 0.0;
 		if ((numberOfRemotePeerLocationsSeenInSwaps > 0.0) && ((swaps > 0.0) || (noSwaps > 0.0))) {
 			avgConnectedPeersPerNode = numberOfRemotePeerLocationsSeenInSwaps/(swaps+noSwaps);
 		}
-		fs.put("avgConnectedPeersPerNode", Double.toString(avgConnectedPeersPerNode));
+		fs.putSingle("avgConnectedPeersPerNode", Double.toString(avgConnectedPeersPerNode));
 
 		int startedSwaps = getStartedSwaps();
 		int swapsRejectedAlreadyLocked = getSwapsRejectedAlreadyLocked();
@@ -1940,20 +1952,20 @@
 		if ((swaps > 0.0) && (noSwaps > 0.0)) {
 			swapsPerNoSwaps = swaps/noSwaps;
 		}
-		fs.put("locationChangePerSession", Double.toString(locationChangePerSession));
-		fs.put("locationChangePerSwap", Double.toString(locationChangePerSwap));
-		fs.put("locationChangePerMinute", Double.toString(locationChangePerMinute));
-		fs.put("swapsPerMinute", Double.toString(swapsPerMinute));
-		fs.put("noSwapsPerMinute", Double.toString(noSwapsPerMinute));
-		fs.put("swapsPerNoSwaps", Double.toString(swapsPerNoSwaps));
-		fs.put("swaps", Double.toString(swaps));
-		fs.put("noSwaps", Double.toString(noSwaps));
-		fs.put("startedSwaps", Integer.toString(startedSwaps));
-		fs.put("swapsRejectedAlreadyLocked", Integer.toString(swapsRejectedAlreadyLocked));
-		fs.put("swapsRejectedNowhereToGo", Integer.toString(swapsRejectedNowhereToGo));
-		fs.put("swapsRejectedRateLimit", Integer.toString(swapsRejectedRateLimit));
-		fs.put("swapsRejectedLoop", Integer.toString(swapsRejectedLoop));
-		fs.put("swapsRejectedRecognizedID", Integer.toString(swapsRejectedRecognizedID));
+		fs.putSingle("locationChangePerSession", Double.toString(locationChangePerSession));
+		fs.putSingle("locationChangePerSwap", Double.toString(locationChangePerSwap));
+		fs.putSingle("locationChangePerMinute", Double.toString(locationChangePerMinute));
+		fs.putSingle("swapsPerMinute", Double.toString(swapsPerMinute));
+		fs.putSingle("noSwapsPerMinute", Double.toString(noSwapsPerMinute));
+		fs.putSingle("swapsPerNoSwaps", Double.toString(swapsPerNoSwaps));
+		fs.putSingle("swaps", Double.toString(swaps));
+		fs.putSingle("noSwaps", Double.toString(noSwaps));
+		fs.putSingle("startedSwaps", Integer.toString(startedSwaps));
+		fs.putSingle("swapsRejectedAlreadyLocked", Integer.toString(swapsRejectedAlreadyLocked));
+		fs.putSingle("swapsRejectedNowhereToGo", Integer.toString(swapsRejectedNowhereToGo));
+		fs.putSingle("swapsRejectedRateLimit", Integer.toString(swapsRejectedRateLimit));
+		fs.putSingle("swapsRejectedLoop", Integer.toString(swapsRejectedLoop));
+		fs.putSingle("swapsRejectedRecognizedID", Integer.toString(swapsRejectedRecognizedID));
 
 		long fix32kb = 32 * 1024;
 		long cachedKeys = getChkDatacache().keyCount();
@@ -1979,25 +1991,25 @@
 		long overallAccesses = storeAccesses + cacheAccesses;
 		double avgStoreAccessRate = (double)overallAccesses/(double)nodeUptimeSeconds;
 		
-		fs.put("cachedKeys", Long.toString(cachedKeys));
-		fs.put("cachedSize", Long.toString(cachedSize));
-		fs.put("storeKeys", Long.toString(storeKeys));
-		fs.put("storeSize", Long.toString(storeSize));
-		fs.put("overallKeys", Long.toString(overallKeys));
-		fs.put("overallSize", Long.toString(overallSize));
-		fs.put("maxOverallKeys", Long.toString(maxOverallKeys));
-		fs.put("maxOverallSize", Long.toString(maxOverallSize));
-		fs.put("percentOverallKeysOfMax", Double.toString(percentOverallKeysOfMax));
-		fs.put("cachedStoreHits", Long.toString(cachedStoreHits));
-		fs.put("cachedStoreMisses", Long.toString(cachedStoreMisses));
-		fs.put("cacheAccesses", Long.toString(cacheAccesses));
-		fs.put("percentCachedStoreHitsOfAccesses", Double.toString(percentCachedStoreHitsOfAccesses));
-		fs.put("storeHits", Long.toString(storeHits));
-		fs.put("storeMisses", Long.toString(storeMisses));
-		fs.put("storeAccesses", Long.toString(storeAccesses));
-		fs.put("percentStoreHitsOfAccesses", Double.toString(percentStoreHitsOfAccesses));
-		fs.put("overallAccesses", Long.toString(overallAccesses));
-		fs.put("avgStoreAccessRate", Double.toString(avgStoreAccessRate));
+		fs.putSingle("cachedKeys", Long.toString(cachedKeys));
+		fs.putSingle("cachedSize", Long.toString(cachedSize));
+		fs.putSingle("storeKeys", Long.toString(storeKeys));
+		fs.putSingle("storeSize", Long.toString(storeSize));
+		fs.putSingle("overallKeys", Long.toString(overallKeys));
+		fs.putSingle("overallSize", Long.toString(overallSize));
+		fs.putSingle("maxOverallKeys", Long.toString(maxOverallKeys));
+		fs.putSingle("maxOverallSize", Long.toString(maxOverallSize));
+		fs.putSingle("percentOverallKeysOfMax", Double.toString(percentOverallKeysOfMax));
+		fs.putSingle("cachedStoreHits", Long.toString(cachedStoreHits));
+		fs.putSingle("cachedStoreMisses", Long.toString(cachedStoreMisses));
+		fs.putSingle("cacheAccesses", Long.toString(cacheAccesses));
+		fs.putSingle("percentCachedStoreHitsOfAccesses", Double.toString(percentCachedStoreHitsOfAccesses));
+		fs.putSingle("storeHits", Long.toString(storeHits));
+		fs.putSingle("storeMisses", Long.toString(storeMisses));
+		fs.putSingle("storeAccesses", Long.toString(storeAccesses));
+		fs.putSingle("percentStoreHitsOfAccesses", Double.toString(percentStoreHitsOfAccesses));
+		fs.putSingle("overallAccesses", Long.toString(overallAccesses));
+		fs.putSingle("avgStoreAccessRate", Double.toString(avgStoreAccessRate));
 
 		Runtime rt = Runtime.getRuntime();
 		float freeMemory = (float) rt.freeMemory();
@@ -2010,12 +2022,12 @@
 		int threadCount = Thread.activeCount();
 		int availableCpus = rt.availableProcessors();
 
-		fs.put("freeJavaMemory", Long.toString((long)freeMemory));
-		fs.put("usedJavaMemory", Long.toString(usedJavaMem));
-		fs.put("allocatedJavaMemory", Long.toString(allocatedJavaMem));
-		fs.put("maximumJavaMemory", Long.toString(maxJavaMem));
-		fs.put("availableCPUs", Integer.toString(availableCpus));
-		fs.put("runningThreadCount", Integer.toString(threadCount));
+		fs.putSingle("freeJavaMemory", Long.toString((long)freeMemory));
+		fs.putSingle("usedJavaMemory", Long.toString(usedJavaMem));
+		fs.putSingle("allocatedJavaMemory", Long.toString(allocatedJavaMem));
+		fs.putSingle("maximumJavaMemory", Long.toString(maxJavaMem));
+		fs.putSingle("availableCPUs", Integer.toString(availableCpus));
+		fs.putSingle("runningThreadCount", Integer.toString(threadCount));
 		
 		return fs;
 	}
@@ -2957,7 +2969,7 @@
 		Logger.normal(this, "Received N2NM from '"+source.getPeer()+"'");
 		SimpleFieldSet fs = null;
 		try {
-			fs = new SimpleFieldSet(new String(messageData.getData(), "UTF-8"));
+			fs = new SimpleFieldSet(new String(messageData.getData(), "UTF-8"), false);
 		} catch (IOException e) {
 			Logger.error(this, "IOException while parsing node to node message data", e);
 			return;
@@ -2965,15 +2977,15 @@
 		if(fs.get("type") != null) {
 			fs.removeValue("type");
 		}
-		fs.put("type", Integer.toString(type));
+		fs.putOverwrite("type", Integer.toString(type));
 		if(fs.get("receivedTime") != null) {
 			fs.removeValue("receivedTime");
 		}
-		fs.put("receivedTime", Long.toString(System.currentTimeMillis()));
+		fs.putOverwrite("receivedTime", Long.toString(System.currentTimeMillis()));
 		if(fs.get("receivedAs") != null) {
 			fs.removeValue("receivedAs");
 		}
-		fs.put("receivedAs", "nodeToNodeMessage");
+		fs.putOverwrite("receivedAs", "nodeToNodeMessage");
 		int fileNumber = source.writeNewExtraPeerDataFile( fs, EXTRA_PEER_DATA_TYPE_N2NTM);
 		if( fileNumber == -1 ) {
 			Logger.error( this, "Failed to write N2NTM to extra peer data file for peer "+source.getPeer());
@@ -3002,12 +3014,12 @@
 		String text = (String) m.getObject(DMT.NODE_TO_NODE_MESSAGE_TEXT);
 		Logger.normal(this, "Received N2NTM from '"+source_nodename+"' to '"+target_nodename+"': "+text);
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("type", Integer.toString(type));
-		fs.put("source_nodename", Base64.encode(source_nodename.getBytes()));
-		fs.put("target_nodename", Base64.encode(target_nodename.getBytes()));
-		fs.put("text", Base64.encode(text.getBytes()));
-		fs.put("receivedTime", Long.toString(System.currentTimeMillis()));
-		fs.put("receivedAs", "nodeToNodeTextMessage");
+		fs.putSingle("type", Integer.toString(type));
+		fs.putSingle("source_nodename", Base64.encode(source_nodename.getBytes()));
+		fs.putSingle("target_nodename", Base64.encode(target_nodename.getBytes()));
+		fs.putSingle("text", Base64.encode(text.getBytes()));
+		fs.putSingle("receivedTime", Long.toString(System.currentTimeMillis()));
+		fs.putSingle("receivedAs", "nodeToNodeTextMessage");
 		int fileNumber = source.writeNewExtraPeerDataFile( fs, EXTRA_PEER_DATA_TYPE_N2NTM);
 		if( fileNumber == -1 ) {
 			Logger.error( this, "Failed to write N2NTM to extra peer data file for peer "+source.getPeer());

Modified: trunk/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStarter.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/NodeStarter.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -341,13 +341,13 @@
 		configFS.put("fproxy.enabled", false);
 		configFS.put("fcp.enabled", false);
 		configFS.put("console.enabled", false);
-		configFS.put("pluginmanager.loadplugin", "");
+		configFS.putSingle("pluginmanager.loadplugin", "");
 		configFS.put("node.updater.enabled", false);
-		configFS.put("node.tempDir", new File(portDir, "temp").toString());
-		configFS.put("node.storeDir", new File(portDir, "store").toString());
-		configFS.put("node.persistentTempDir", new File(portDir, "persistent").toString());
-		configFS.put("node.throttleFile", new File(portDir, "throttle.dat").toString());
-		configFS.put("node.nodeDir", portDir.toString());
+		configFS.putSingle("node.tempDir", new File(portDir, "temp").toString());
+		configFS.putSingle("node.storeDir", new File(portDir, "store").toString());
+		configFS.putSingle("node.persistentTempDir", new File(portDir, "persistent").toString());
+		configFS.putSingle("node.throttleFile", new File(portDir, "throttle.dat").toString());
+		configFS.putSingle("node.nodeDir", portDir.toString());
 		configFS.put("node.maxHTL", maxHTL);
 		configFS.put("node.testingDropPacketsEvery", dropProb);
 		configFS.put("node.swapRequestSendInterval", swapInterval);

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/PeerManager.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -105,7 +105,7 @@
             while(true) {
                 // Read a single NodePeer
                 SimpleFieldSet fs;
-                fs = new SimpleFieldSet(br);
+                fs = new SimpleFieldSet(br, false);
                 PeerNode pn;
                 try {
                     pn = new PeerNode(fs, node, true);

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/PeerNode.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -424,9 +424,9 @@
     					if(peerCryptoGroup == null) errCause += " (No peer crypto group)";
     					if(peerPubKey == null) errCause += " (No peer public key)";
     					if(failed) errCause += " (VERIFICATION FAILED)";
-    					Logger.error(this, "The integrity of the reference has been compromized!"+errCause);
+    					Logger.error(this, "The integrity of the reference has been compromized!"+errCause+" fs was\n"+fs.toOrderedString());
     					this.isSignatureVerificationSuccessfull = false;
-    					fs.put("sig", signature);
+    					fs.putSingle("sig", signature);
    						throw new ReferenceSignatureVerificationException("The integrity of the reference has been compromized!"+errCause);
     				}else
     					this.isSignatureVerificationSuccessfull = true;
@@ -1660,7 +1660,7 @@
         BufferedReader br = new BufferedReader(isr);
         SimpleFieldSet fs;
         try {
-            fs = new SimpleFieldSet(br);
+            fs = new SimpleFieldSet(br, false);
         } catch (IOException e) {
             Logger.error(this, "Impossible: e", e);
             return;
@@ -1877,31 +1877,31 @@
     public synchronized SimpleFieldSet exportMetadataFieldSet() {
     	SimpleFieldSet fs = new SimpleFieldSet();
     	if(detectedPeer != null)
-    		fs.put("detected.udp", detectedPeer.toString());
+    		fs.putSingle("detected.udp", detectedPeer.toString());
     	if(lastReceivedPacketTime() > 0)
-    		fs.put("timeLastReceivedPacket", Long.toString(timeLastReceivedPacket));
+    		fs.putSingle("timeLastReceivedPacket", Long.toString(timeLastReceivedPacket));
     	if(timeLastConnected() > 0)
-    		fs.put("timeLastConnected", Long.toString(timeLastConnected));
+    		fs.putSingle("timeLastConnected", Long.toString(timeLastConnected));
     	if(timeLastRoutable() > 0)
-    		fs.put("timeLastRoutable", Long.toString(timeLastRoutable));
+    		fs.putSingle("timeLastRoutable", Long.toString(timeLastRoutable));
     	if(getPeerAddedTime() > 0)
-    		fs.put("peerAddedTime", Long.toString(peerAddedTime));
+    		fs.putSingle("peerAddedTime", Long.toString(peerAddedTime));
     	if(neverConnected)
-    		fs.put("neverConnected", "true");
+    		fs.putSingle("neverConnected", "true");
     	if(isDisabled)
-    		fs.put("isDisabled", "true");
+    		fs.putSingle("isDisabled", "true");
     	if(isListenOnly)
-    		fs.put("isListenOnly", "true");
+    		fs.putSingle("isListenOnly", "true");
     	if(isBurstOnly)
-    		fs.put("isBurstOnly", "true");
+    		fs.putSingle("isBurstOnly", "true");
     	if(ignoreSourcePort)
-    		fs.put("ignoreSourcePort", "true");
+    		fs.putSingle("ignoreSourcePort", "true");
     	if(allowLocalAddresses)
-    		fs.put("allowLocalAddresses", "true");
+    		fs.putSingle("allowLocalAddresses", "true");
     	if(hadRoutableConnectionCount > 0)
-    		fs.put("hadRoutableConnectionCount", Long.toString(hadRoutableConnectionCount));
+    		fs.putSingle("hadRoutableConnectionCount", Long.toString(hadRoutableConnectionCount));
     	if(routableConnectionCheckCount > 0)
-    		fs.put("routableConnectionCheckCount", Long.toString(routableConnectionCheckCount));
+    		fs.putSingle("routableConnectionCheckCount", Long.toString(routableConnectionCheckCount));
     	return fs;
 	}
 
@@ -1912,24 +1912,24 @@
 		SimpleFieldSet fs = new SimpleFieldSet();
 		long now = System.currentTimeMillis();
 		synchronized(this) {
-			fs.put("averagePingTime", Double.toString(averagePingTime()));
+			fs.putSingle("averagePingTime", Double.toString(averagePingTime()));
 			long idle = now - lastReceivedPacketTime();
 			if(idle > (60 * 1000)) {  // 1 minute
-				fs.put("idle", Long.toString(idle));
+				fs.putSingle("idle", Long.toString(idle));
 			}
 			if(peerAddedTime > 1) {
-				fs.put("peerAddedTime", Long.toString(peerAddedTime));
+				fs.putSingle("peerAddedTime", Long.toString(peerAddedTime));
 			}
-			fs.put("lastRoutingBackoffReason", lastRoutingBackoffReason);
-			fs.put("routingBackoffPercent", Double.toString(backedOffPercent.currentValue() * 100));
-			fs.put("routingBackoff", Long.toString((Math.max(routingBackedOffUntil - now, 0))));
-			fs.put("routingBackoffLength", Integer.toString(routingBackoffLength));
-			fs.put("overloadProbability", Double.toString(getPRejected() * 100));
-			fs.put("percentTimeRoutableConnection", Double.toString(getPercentTimeRoutableConnection() * 100));
-			fs.put("totalBytesIn", Long.toString(totalBytesIn));
-			fs.put("totalBytesOut", Long.toString(totalBytesOut));
+			fs.putSingle("lastRoutingBackoffReason", lastRoutingBackoffReason);
+			fs.putSingle("routingBackoffPercent", Double.toString(backedOffPercent.currentValue() * 100));
+			fs.putSingle("routingBackoff", Long.toString((Math.max(routingBackedOffUntil - now, 0))));
+			fs.putSingle("routingBackoffLength", Integer.toString(routingBackoffLength));
+			fs.putSingle("overloadProbability", Double.toString(getPRejected() * 100));
+			fs.putSingle("percentTimeRoutableConnection", Double.toString(getPercentTimeRoutableConnection() * 100));
+			fs.putSingle("totalBytesIn", Long.toString(totalBytesIn));
+			fs.putSingle("totalBytesOut", Long.toString(totalBytesOut));
 		}
-		fs.put("status", getPeerNodeStatusString());
+		fs.putSingle("status", getPeerNodeStatusString());
 		return fs;
 	}
 
@@ -1939,23 +1939,23 @@
     public synchronized SimpleFieldSet exportFieldSet() {
         SimpleFieldSet fs = new SimpleFieldSet();
         if(getLastGoodVersion() != null)
-        	fs.put("lastGoodVersion", lastGoodVersion);
+        	fs.putSingle("lastGoodVersion", lastGoodVersion);
 		for(int i=0;i<nominalPeer.size();i++) {
-			fs.put("physical.udp", nominalPeer.get(i).toString());
+			fs.putSingle("physical.udp", nominalPeer.get(i).toString());
 		}
-        fs.put("identity", getIdentityString());
-        fs.put("location", Double.toString(currentLocation.getValue()));
-        fs.put("testnet", Boolean.toString(testnetEnabled));
-        fs.put("version", version);
-        fs.put("myName", getName());
+        fs.putSingle("identity", getIdentityString());
+        fs.putSingle("location", Double.toString(currentLocation.getValue()));
+        fs.putSingle("testnet", Boolean.toString(testnetEnabled));
+        fs.putSingle("version", version);
+        fs.putSingle("myName", getName());
         if(peerCryptoGroup != null)
         	fs.put("dsaGroup", peerCryptoGroup.asFieldSet());
         if(peerPubKey != null)
         	fs.put("dsaPubKey", peerPubKey.asFieldSet());
 		if(myARK != null) {
 			// Decrement it because we keep the number we would like to fetch, not the last one fetched.
-			fs.put("ark.number", Long.toString(myARK.suggestedEdition - 1));
-			fs.put("ark.pubURI", myARK.getBaseSSK().toString(false, false));
+			fs.putSingle("ark.number", Long.toString(myARK.suggestedEdition - 1));
+			fs.putSingle("ark.pubURI", myARK.getBaseSSK().toString(false, false));
 		}
         return fs;
     }
@@ -2628,7 +2628,7 @@
 		SimpleFieldSet fs = null;
 		try {
 			// Read in the single SimpleFieldSet
-			fs = new SimpleFieldSet(br);
+			fs = new SimpleFieldSet(br, false);
 		} catch (EOFException e3) {
 			// End of file, fine
 		} catch (IOException e4) {
@@ -2704,11 +2704,11 @@
 				if(fs.get("senderFileNumber") != null) {
 					fs.removeValue("senderFileNumber");
 				}
-				fs.put("senderFileNumber", String.valueOf(fileNumber));
+				fs.putOverwrite("senderFileNumber", String.valueOf(fileNumber));
 				if(fs.get("sentTime") != null) {
 					fs.removeValue("sentTime");
 				}
-				fs.put("sentTime", Long.toString(System.currentTimeMillis()));
+				fs.putOverwrite("sentTime", Long.toString(System.currentTimeMillis()));
 				
 				try {
 					n2ntm = DMT.createNodeToNodeMessage(Node.N2N_TEXT_MESSAGE_TYPE_USERALERT, fs.toString().getBytes("UTF-8"));
@@ -2731,7 +2731,7 @@
 			}
 			if(!sendSuccess) {
 				synchronized(queuedToSendN2NTMExtraPeerDataFileNumbers) {
-					fs.put("extraPeerDataType", Integer.toString(extraPeerDataType));
+					fs.putOverwrite("extraPeerDataType", Integer.toString(extraPeerDataType));
 					fs.removeValue("sentTime");
 					queuedToSendN2NTMExtraPeerDataFileNumbers.add(Integer.toString(fileNumber));
 				}
@@ -2745,7 +2745,7 @@
 	public int writeNewExtraPeerDataFile(SimpleFieldSet fs, int extraPeerDataType) {
 		String extraPeerDataDirPath = node.getExtraPeerDataDir();
 		if(extraPeerDataType > 0)
-			fs.put("extraPeerDataType", Integer.toString(extraPeerDataType));
+			fs.putOverwrite("extraPeerDataType", Integer.toString(extraPeerDataType));
 		File extraPeerDataPeerDir = new File(extraPeerDataDirPath+File.separator+getIdentityString());
 	 	if(!extraPeerDataPeerDir.exists()) {
 	 		if(!extraPeerDataPeerDir.mkdir()) {
@@ -2853,7 +2853,7 @@
 	public boolean rewriteExtraPeerDataFile(SimpleFieldSet fs, int extraPeerDataType, int fileNumber) {
 		String extraPeerDataDirPath = node.getExtraPeerDataDir();
 		if(extraPeerDataType > 0)
-			fs.put("extraPeerDataType", Integer.toString(extraPeerDataType));
+			fs.putOverwrite("extraPeerDataType", Integer.toString(extraPeerDataType));
 		File extraPeerDataPeerDir = new File(extraPeerDataDirPath+File.separator+getIdentityString());
 	 	if(!extraPeerDataPeerDir.exists()) {
 	   		Logger.error(this, "Extra peer data directory for peer does not exist: "+extraPeerDataPeerDir.getPath());
@@ -2904,8 +2904,8 @@
 			localFileNumber = privateDarknetCommentFileNumber;
 		}
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("peerNoteType", Integer.toString(Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT));
-		fs.put("privateDarknetComment", Base64.encode(comment.getBytes()));
+		fs.putSingle("peerNoteType", Integer.toString(Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT));
+		fs.putSingle("privateDarknetComment", Base64.encode(comment.getBytes()));
 		if(localFileNumber == -1) {
 			localFileNumber = writeNewExtraPeerDataFile(fs, Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE);
 			synchronized(privateDarknetComment) {
@@ -2980,7 +2980,7 @@
 		
 		SimpleFieldSet fs;
 		try {
-			fs = new SimpleFieldSet(ref);
+			fs = new SimpleFieldSet(ref, false);
 			if(logMINOR) Logger.minor(this, "Got ARK for "+this);
 			gotARK(fs, edition);
 		} catch (IOException e) {

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -952,7 +952,7 @@
         SimpleFieldSet fs;
         System.out.println("Connecting to:\r\n"+content);
         try {
-            fs = new SimpleFieldSet(content);
+            fs = new SimpleFieldSet(content, false);
         } catch (IOException e) {
             System.err.println("Did not parse: "+e);
             e.printStackTrace();

Modified: trunk/freenet/src/freenet/node/ThrottleWindowManager.java
===================================================================
--- trunk/freenet/src/freenet/node/ThrottleWindowManager.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/ThrottleWindowManager.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -57,7 +57,7 @@
 
 	public SimpleFieldSet exportFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "ThrottleWindowManager");
+		fs.putSingle("Type", "ThrottleWindowManager");
 		fs.put("TotalPackets", _totalPackets);
 		fs.put("DroppedPackets", _droppedPackets);
 		fs.put("SimulatedWindowSize", _simulatedWindowSize);

Modified: trunk/freenet/src/freenet/node/fcp/AddPeer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/AddPeer.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/AddPeer.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -68,7 +68,7 @@
 				throw new MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing ref from URL <"+urlString+ '>', null, false);
 			}
 			try {
-				fs = new SimpleFieldSet(ref.toString());
+				fs = new SimpleFieldSet(ref.toString(), false);
 			} catch (IOException e) {
 				throw new MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing ref from URL <"+urlString+">: "+e.getMessage(), null, false);
 			}
@@ -99,7 +99,7 @@
 				throw new MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing ref from file <"+fileString+ '>', null, false);
 			}
 			try {
-				fs = new SimpleFieldSet(ref.toString());
+				fs = new SimpleFieldSet(ref.toString(), false);
 			} catch (IOException e) {
 				throw new MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing ref from file <"+fileString+">: "+e.getMessage(), null, false);
 			}

Modified: trunk/freenet/src/freenet/node/fcp/AllDataMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/AllDataMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/AllDataMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -31,9 +31,9 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("DataLength", Long.toString(dataLength));
-		fs.put("Identifier", identifier);
-		if(global) fs.put("Global", "true");
+		fs.putSingle("DataLength", Long.toString(dataLength));
+		fs.putSingle("Identifier", identifier);
+		if(global) fs.putSingle("Global", "true");
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -487,29 +487,29 @@
 	// different (it can store detailed state).
 	public synchronized SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet(); // we will need multi-level later...
-		fs.put("Type", "GET");
-		fs.put("URI", uri.toString(false, false));
-		fs.put("Identifier", identifier);
-		fs.put("Verbosity", Integer.toString(verbosity));
-		fs.put("PriorityClass", Short.toString(priorityClass));
-		fs.put("ReturnType", ClientGetMessage.returnTypeString(returnType));
-		fs.put("Persistence", persistenceTypeString(persistenceType));
-		fs.put("ClientName", client.name);
+		fs.putSingle("Type", "GET");
+		fs.putSingle("URI", uri.toString(false, false));
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("Verbosity", Integer.toString(verbosity));
+		fs.putSingle("PriorityClass", Short.toString(priorityClass));
+		fs.putSingle("ReturnType", ClientGetMessage.returnTypeString(returnType));
+		fs.putSingle("Persistence", persistenceTypeString(persistenceType));
+		fs.putSingle("ClientName", client.name);
 		if(targetFile != null)
-			fs.put("Filename", targetFile.getPath());
+			fs.putSingle("Filename", targetFile.getPath());
 		if(tempFile != null)
-			fs.put("TempFilename", tempFile.getPath());
+			fs.putSingle("TempFilename", tempFile.getPath());
 		if(clientToken != null)
-			fs.put("ClientToken", clientToken);
-		fs.put("IgnoreDS", Boolean.toString(fctx.ignoreStore));
-		fs.put("DSOnly", Boolean.toString(fctx.localRequestOnly));
-		fs.put("MaxRetries", Integer.toString(fctx.maxNonSplitfileRetries));
-		fs.put("Finished", Boolean.toString(finished));
-		fs.put("Succeeded", Boolean.toString(succeeded));
+			fs.putSingle("ClientToken", clientToken);
+		fs.putSingle("IgnoreDS", Boolean.toString(fctx.ignoreStore));
+		fs.putSingle("DSOnly", Boolean.toString(fctx.localRequestOnly));
+		fs.putSingle("MaxRetries", Integer.toString(fctx.maxNonSplitfileRetries));
+		fs.putSingle("Finished", Boolean.toString(finished));
+		fs.putSingle("Succeeded", Boolean.toString(succeeded));
 		if(finished) {
 			if(succeeded) {
-				fs.put("FoundDataLength", Long.toString(foundDataLength));
-				fs.put("FoundDataMimeType", foundDataMimeType);
+				fs.putSingle("FoundDataLength", Long.toString(foundDataLength));
+				fs.putSingle("FoundDataMimeType", foundDataMimeType);
 				if(postFetchProtocolErrorMessage != null) {
 					fs.put("PostFetchProtocolError", postFetchProtocolErrorMessage.getFieldSet());
 				}
@@ -523,7 +523,7 @@
 		if(returnType == ClientGetMessage.RETURN_TYPE_DIRECT && !(succeeded == false && returnBucket == null)) {
 			bucketToFS(fs, "ReturnBucket", false, returnBucket);
 		}
-		fs.put("Global", Boolean.toString(client.isGlobalQueue));
+		fs.putSingle("Global", Boolean.toString(client.isGlobalQueue));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -187,14 +187,14 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("IgnoreDS", Boolean.toString(ignoreDS));
-		fs.put("URI", uri.toString(false, false));
-		fs.put("Identifier", identifier);
-		fs.put("Verbosity", Integer.toString(verbosity));
-		fs.put("ReturnType", getReturnTypeString());
-		fs.put("MaxSize", Long.toString(maxSize));
-		fs.put("MaxTempSize", Long.toString(maxTempSize));
-		fs.put("MaxRetries", Integer.toString(maxRetries));
+		fs.putSingle("IgnoreDS", Boolean.toString(ignoreDS));
+		fs.putSingle("URI", uri.toString(false, false));
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("Verbosity", Integer.toString(verbosity));
+		fs.putSingle("ReturnType", getReturnTypeString());
+		fs.putSingle("MaxSize", Long.toString(maxSize));
+		fs.putSingle("MaxTempSize", Long.toString(maxTempSize));
+		fs.putSingle("MaxRetries", Integer.toString(maxRetries));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientHelloMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -30,8 +30,8 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("Name", clientName);
-		sfs.put("ExpectedVersion", clientExpectedVersion);
+		sfs.putSingle("Name", clientName);
+		sfs.putSingle("ExpectedVersion", clientExpectedVersion);
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -310,25 +310,25 @@
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = super.getFieldSet();
 		// This is all fixed, so no need for synchronization.
-		fs.put("Metadata.ContentType", clientMetadata.getMIMEType());
-		fs.put("UploadFrom", ClientPutMessage.uploadFromString(uploadFrom));
+		fs.putSingle("Metadata.ContentType", clientMetadata.getMIMEType());
+		fs.putSingle("UploadFrom", ClientPutMessage.uploadFromString(uploadFrom));
 		if(uploadFrom == ClientPutMessage.UPLOAD_FROM_DISK) {
-			fs.put("Filename", origFilename.getPath());
+			fs.putSingle("Filename", origFilename.getPath());
 		} else if(uploadFrom == ClientPutMessage.UPLOAD_FROM_DIRECT) {
 			if(!finished) {
 				// the bucket is a persistent encrypted temp bucket
 				bucketToFS(fs, "TempBucket", true, data);
 			}
 		} else if(uploadFrom == ClientPutMessage.UPLOAD_FROM_REDIRECT) {
-			fs.put("TargetURI", targetURI.toString());
+			fs.putSingle("TargetURI", targetURI.toString());
 		}
 		if(putter != null)  {
 			SimpleFieldSet sfs = putter.getProgressFieldset();
 			fs.put("progress", sfs);
 		}
 		if(targetFilename != null)
-			fs.put("TargetFilename", targetFilename);
-		fs.put("EarlyEncode", Boolean.toString(earlyEncode));
+			fs.putSingle("TargetFilename", targetFilename);
+		fs.putSingle("EarlyEncode", Boolean.toString(earlyEncode));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutBase.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutBase.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -260,25 +260,25 @@
 
 	public synchronized SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet(); // we will need multi-level later...
-		fs.put("Type", getTypeName());
-		fs.put("URI", uri.toString(false, false));
-		fs.put("Identifier", identifier);
-		fs.put("Verbosity", Integer.toString(verbosity));
-		fs.put("PriorityClass", Short.toString(priorityClass));
-		fs.put("Persistence", ClientRequest.persistenceTypeString(persistenceType));
-		fs.put("ClientName", client.name);
-		fs.put("ClientToken", clientToken);
-		fs.put("DontCompress", Boolean.toString(ctx.dontCompress));
-		fs.put("MaxRetries", Integer.toString(ctx.maxInsertRetries));
-		fs.put("Finished", Boolean.toString(finished));
-		fs.put("Succeeded", Boolean.toString(succeeded));
-		fs.put("GetCHKOnly", Boolean.toString(getCHKOnly));
+		fs.putSingle("Type", getTypeName());
+		fs.putSingle("URI", uri.toString(false, false));
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("Verbosity", Integer.toString(verbosity));
+		fs.putSingle("PriorityClass", Short.toString(priorityClass));
+		fs.putSingle("Persistence", ClientRequest.persistenceTypeString(persistenceType));
+		fs.putSingle("ClientName", client.name);
+		fs.putSingle("ClientToken", clientToken);
+		fs.putSingle("DontCompress", Boolean.toString(ctx.dontCompress));
+		fs.putSingle("MaxRetries", Integer.toString(ctx.maxInsertRetries));
+		fs.putSingle("Finished", Boolean.toString(finished));
+		fs.putSingle("Succeeded", Boolean.toString(succeeded));
+		fs.putSingle("GetCHKOnly", Boolean.toString(getCHKOnly));
 		if(generatedURI != null)
-			fs.put("GeneratedURI", generatedURI.toString(false, false));
+			fs.putSingle("GeneratedURI", generatedURI.toString(false, false));
 		if(finished && (!succeeded))
 			// Should have a putFailedMessage... unless there is a race condition.
 			fs.put("PutFailed", putFailedMessage.getFieldSet(false));
-		fs.put("Global", Boolean.toString(client.isGlobalQueue));
+		fs.putSingle("Global", Boolean.toString(client.isGlobalQueue));
 		return fs;
 	}
 	

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -203,32 +203,32 @@
 		// Flatten the hierarchy, it can be reconstructed on restarting.
 		// Storing it directly would be a PITA.
 		ManifestElement[] elements = SimpleManifestPutter.flatten(manifestElements);
-		fs.put("DefaultName", defaultName);
+		fs.putSingle("DefaultName", defaultName);
 		for(int i=0;i<elements.length;i++) {
 			String num = Integer.toString(i);
 			ManifestElement e = elements[i];
 			String name = e.getName();
 			String mimeOverride = e.getMimeTypeOverride();
 			SimpleFieldSet subset = new SimpleFieldSet();
-			subset.put("Name", name);
+			subset.putSingle("Name", name);
 			if(mimeOverride != null)
-				subset.put("Metadata.ContentType", mimeOverride);
+				subset.putSingle("Metadata.ContentType", mimeOverride);
 			FreenetURI target = e.getTargetURI();
 			if(target != null) {
-				subset.put("UploadFrom", "redirect");
-				subset.put("TargetURI", target.toString());
+				subset.putSingle("UploadFrom", "redirect");
+				subset.putSingle("TargetURI", target.toString());
 			} else {
 				Bucket data = e.getData();
 				// What to do with the bucket?
 				// It is either a persistent encrypted bucket or a file bucket ...
-				subset.put("DataLength", Long.toString(e.getSize()));
+				subset.putSingle("DataLength", Long.toString(e.getSize()));
 				if(data instanceof FileBucket) {
-					subset.put("UploadFrom", "disk");
-					subset.put("Filename", ((FileBucket)data).getFile().getPath());
+					subset.putSingle("UploadFrom", "disk");
+					subset.putSingle("Filename", ((FileBucket)data).getFile().getPath());
 				} else if(finished) {
-					subset.put("UploadFrom", "direct");
+					subset.putSingle("UploadFrom", "direct");
 				} else if(data instanceof PaddedEphemerallyEncryptedBucket) {
-					subset.put("UploadFrom", "direct");
+					subset.putSingle("UploadFrom", "direct");
 					// the bucket is a persistent encrypted temp bucket
 					bucketToFS(fs, "TempBucket", false, data);
 				} else {

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDirMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -119,17 +119,17 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("URI", uri.toString());
-		sfs.put("Identifier", identifier);
-		sfs.put("Verbosity", Integer.toString(verbosity));
-		sfs.put("MaxRetries", Integer.toString(maxRetries));
-		sfs.put("ClientToken", clientToken);
-		sfs.put("GetCHKOnly", Boolean.toString(getCHKOnly));
-		sfs.put("PriorityClass", Short.toString(priorityClass));
-		sfs.put("PersistenceType", ClientRequest.persistenceTypeString(persistenceType));
-		sfs.put("DontCompress", Boolean.toString(dontCompress));
-		sfs.put("Global", Boolean.toString(global));
-		sfs.put("DefaultName", defaultName);
+		sfs.putSingle("URI", uri.toString());
+		sfs.putSingle("Identifier", identifier);
+		sfs.putSingle("Verbosity", Integer.toString(verbosity));
+		sfs.putSingle("MaxRetries", Integer.toString(maxRetries));
+		sfs.putSingle("ClientToken", clientToken);
+		sfs.putSingle("GetCHKOnly", Boolean.toString(getCHKOnly));
+		sfs.putSingle("PriorityClass", Short.toString(priorityClass));
+		sfs.putSingle("PersistenceType", ClientRequest.persistenceTypeString(persistenceType));
+		sfs.putSingle("DontCompress", Boolean.toString(dontCompress));
+		sfs.putSingle("Global", Boolean.toString(global));
+		sfs.putSingle("DefaultName", defaultName);
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -195,28 +195,28 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("URI", uri.toString());
-		sfs.put("Identifier", identifier);
-		sfs.put("Verbosity", Integer.toString(verbosity));
-		sfs.put("MaxRetries", Integer.toString(maxRetries));
-		sfs.put("Metadata.ContentType", contentType);
-		sfs.put("ClientToken", clientToken);
+		sfs.putSingle("URI", uri.toString());
+		sfs.putSingle("Identifier", identifier);
+		sfs.putSingle("Verbosity", Integer.toString(verbosity));
+		sfs.putSingle("MaxRetries", Integer.toString(maxRetries));
+		sfs.putSingle("Metadata.ContentType", contentType);
+		sfs.putSingle("ClientToken", clientToken);
 		if(uploadFromType == UPLOAD_FROM_DIRECT) {
-			sfs.put("UploadFrom", "direct");
-			sfs.put("DataLength", Long.toString(dataLength));
+			sfs.putSingle("UploadFrom", "direct");
+			sfs.putSingle("DataLength", Long.toString(dataLength));
 		} else if(uploadFromType == UPLOAD_FROM_DISK) {
-			sfs.put("UploadFrom", "disk");
-			sfs.put("Filename", origFilename.getAbsolutePath());
-			sfs.put("DataLength", Long.toString(dataLength));
+			sfs.putSingle("UploadFrom", "disk");
+			sfs.putSingle("Filename", origFilename.getAbsolutePath());
+			sfs.putSingle("DataLength", Long.toString(dataLength));
 		} else if(uploadFromType == UPLOAD_FROM_REDIRECT) {
-			sfs.put("UploadFrom", "redirect");
-			sfs.put("TargetURI", redirectTarget.toString());
+			sfs.putSingle("UploadFrom", "redirect");
+			sfs.putSingle("TargetURI", redirectTarget.toString());
 		}
-		sfs.put("GetCHKOnly", Boolean.toString(getCHKOnly));
-		sfs.put("PriorityClass", Short.toString(priorityClass));
-		sfs.put("PersistenceType", ClientRequest.persistenceTypeString(persistenceType));
-		sfs.put("DontCompress", Boolean.toString(dontCompress));
-		sfs.put("Global", Boolean.toString(global));
+		sfs.putSingle("GetCHKOnly", Boolean.toString(getCHKOnly));
+		sfs.putSingle("PriorityClass", Short.toString(priorityClass));
+		sfs.putSingle("PersistenceType", ClientRequest.persistenceTypeString(persistenceType));
+		sfs.putSingle("DontCompress", Boolean.toString(dontCompress));
+		sfs.putSingle("Global", Boolean.toString(global));
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -136,7 +136,7 @@
 	}
 
 	public static ClientRequest readAndRegister(BufferedReader br, FCPServer server) throws IOException {
-		SimpleFieldSet fs = new SimpleFieldSet(br);
+		SimpleFieldSet fs = new SimpleFieldSet(br, false);
 		String clientName = fs.get("ClientName");
 		boolean isGlobal = Fields.stringToBool(fs.get("Global"), false);
 		if(clientName == null && !isGlobal) {

Modified: trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/DataFoundMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -30,10 +30,10 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		if(global) fs.put("Global", "true");
-		fs.put("Metadata.ContentType", mimeType);
-		fs.put("DataLength", Long.toString(dataLength));
+		fs.putSingle("Identifier", identifier);
+		if(global) fs.putSingle("Global", "true");
+		fs.putSingle("Metadata.ContentType", mimeType);
+		fs.putSingle("DataLength", Long.toString(dataLength));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/EndListPeerNotesMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -17,7 +17,7 @@
 	
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("NodeIdentifier", nodeIdentifier);
+		sfs.putSingle("NodeIdentifier", nodeIdentifier);
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/FCPConnectionInputHandler.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -53,7 +53,7 @@
 				return;
 			}
 			if(messageType.equals("")) continue;
-			fs = new SimpleFieldSet(lis, 4096, 128, true, true);
+			fs = new SimpleFieldSet(lis, 4096, 128, true, true, true);
 			FCPMessage msg;
 			try {
 				msg = FCPMessage.create(messageType, fs, handler.bf, handler.server.core.persistentTempBucketFactory);

Modified: trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/FinishedCompressionMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -25,11 +25,11 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		fs.put("Codec", Integer.toString(codec));
-		fs.put("OriginalSize", Long.toString(origSize));
-		fs.put("CompressedSize", Long.toString(compressedSize));
-		if(global) fs.put("Global", "true");
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("Codec", Integer.toString(codec));
+		fs.putSingle("OriginalSize", Long.toString(origSize));
+		fs.putSingle("CompressedSize", Long.toString(compressedSize));
+		if(global) fs.putSingle("Global", "true");
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/GetFailedMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -101,28 +101,28 @@
 	 */
 	public SimpleFieldSet getFieldSet(boolean verbose) {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("Code", Integer.toString(code));
+		sfs.putSingle("Code", Integer.toString(code));
 		if(verbose)
-			sfs.put("CodeDescription", codeDescription);
+			sfs.putSingle("CodeDescription", codeDescription);
 		if(extraDescription != null)
-			sfs.put("ExtraDescription", extraDescription);
+			sfs.putSingle("ExtraDescription", extraDescription);
 		if(verbose)
-			sfs.put("Fatal", Boolean.toString(isFatal));
+			sfs.putSingle("Fatal", Boolean.toString(isFatal));
 		if(tracker != null) {
-			tracker.copyToFieldSet(sfs, "Errors.", verbose);
+			sfs.put("Errors", tracker.toFieldSet(verbose));
 		}
 		if(verbose)
-			sfs.put("ShortCodeDescription", shortCodeDescription);
-		sfs.put("Identifier", identifier);
+			sfs.putSingle("ShortCodeDescription", shortCodeDescription);
+		sfs.putSingle("Identifier", identifier);
 		if(expectedDataLength > -1) {
-			sfs.put("ExpectedDataLength", Long.toString(expectedDataLength));
+			sfs.putSingle("ExpectedDataLength", Long.toString(expectedDataLength));
 		}
 		if(expectedMimeType != null)
-			sfs.put("ExpectedMetadata.ContentType", expectedMimeType);
+			sfs.putSingle("ExpectedMetadata.ContentType", expectedMimeType);
 		if(finalizedExpected)
-			sfs.put("FinalizedExpected", "true");
+			sfs.putSingle("FinalizedExpected", "true");
 		if(redirectURI != null)
-			sfs.put("RedirectURI", redirectURI.toString(false, false));
+			sfs.putSingle("RedirectURI", redirectURI.toString(false, false));
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/GetRequestStatusMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -22,7 +22,7 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
+		fs.putSingle("Identifier", identifier);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/IdentifierCollisionMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -18,8 +18,8 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("Identifier", identifier);
-		if(global) sfs.put("Global", "true");
+		sfs.putSingle("Identifier", identifier);
+		if(global) sfs.putSingle("Global", "true");
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -52,11 +52,11 @@
 	
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		fs.put("Global", Boolean.toString(global));
-		fs.put("PriorityClass", Short.toString(priorityClass));
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("Global", Boolean.toString(global));
+		fs.putSingle("PriorityClass", Short.toString(priorityClass));
 		if(clientToken != null)
-			fs.put("ClientToken", clientToken);
+			fs.putSingle("ClientToken", clientToken);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -62,15 +62,15 @@
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
 		// FIXME
-		sfs.put("FCPVersion", "2.0");
-		sfs.put("Node", "Fred");
-		sfs.put("Version", Version.getVersionString());
+		sfs.putSingle("FCPVersion", "2.0");
+		sfs.putSingle("Node", "Fred");
+		sfs.putSingle("Version", Version.getVersionString());
 		sfs.put("Build", Version.buildNumber());
-		sfs.put("Revision", Version.cvsRevision);
+		sfs.putSingle("Revision", Version.cvsRevision);
 		sfs.put("ExtBuild", NodeStarter.extBuildNumber);
-		sfs.put("ExtRevision", NodeStarter.extRevisionNumber);
-		sfs.put("Testnet", Boolean.toString(node == null ? false : node.isTestnetEnabled()));
-		sfs.put("CompressionCodecs", Integer.toString(Compressor.countCompressAlgorithms()));
+		sfs.putSingle("ExtRevision", NodeStarter.extRevisionNumber);
+		sfs.putSingle("Testnet", Boolean.toString(node == null ? false : node.isTestnetEnabled()));
+		sfs.putSingle("CompressionCodecs", Integer.toString(Compressor.countCompressAlgorithms()));
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/PeerNote.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PeerNote.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PeerNote.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -22,9 +22,9 @@
 	
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("NodeIdentifier", nodeIdentifier);
-		fs.put("PeerNoteType", Integer.toString(peerNoteType));
-		fs.put("NoteText", Base64.encode(noteText.getBytes(), true));
+		fs.putSingle("NodeIdentifier", nodeIdentifier);
+		fs.putSingle("PeerNoteType", Integer.toString(peerNoteType));
+		fs.putSingle("NoteText", Base64.encode(noteText.getBytes(), true));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/PeerRemoved.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PeerRemoved.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PeerRemoved.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -19,8 +19,8 @@
 	
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identity", identity);
-		fs.put("NodeIdentifier", nodeIdentifier);
+		fs.putSingle("Identity", identity);
+		fs.putSingle("NodeIdentifier", nodeIdentifier);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/PersistentGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentGet.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentGet.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -50,18 +50,18 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		fs.put("URI", uri.toString(false, false));
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("URI", uri.toString(false, false));
 		fs.put("Verbosity", verbosity);
-		fs.put("ReturnType", ClientGetMessage.returnTypeString(returnType));
-		fs.put("PersistenceType", ClientRequest.persistenceTypeString(persistenceType));
+		fs.putSingle("ReturnType", ClientGetMessage.returnTypeString(returnType));
+		fs.putSingle("PersistenceType", ClientRequest.persistenceTypeString(persistenceType));
 		if(returnType == ClientGetMessage.RETURN_TYPE_DISK) {
-			fs.put("Filename", targetFile.getAbsolutePath());
-			fs.put("TempFilename", tempFile.getAbsolutePath());
+			fs.putSingle("Filename", targetFile.getAbsolutePath());
+			fs.putSingle("TempFilename", tempFile.getAbsolutePath());
 		}
 		fs.put("PriorityClass", priorityClass);
 		if(clientToken != null)
-			fs.put("ClientToken", clientToken);
+			fs.putSingle("ClientToken", clientToken);
 		fs.put("Global", global);
 		fs.put("Started", started);
 		fs.put("MaxRetries", maxRetries);

Modified: trunk/freenet/src/freenet/node/fcp/PersistentPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPut.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPut.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -52,27 +52,27 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		fs.put("URI", uri.toString(false, false));
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("URI", uri.toString(false, false));
 		fs.put("Verbosity", verbosity);
 		fs.put("PriorityClass", priorityClass);
-		fs.put("UploadFrom", ClientPutMessage.uploadFromString(uploadFrom));
-		fs.put("Persistence", ClientRequest.persistenceTypeString(persistenceType));
+		fs.putSingle("UploadFrom", ClientPutMessage.uploadFromString(uploadFrom));
+		fs.putSingle("Persistence", ClientRequest.persistenceTypeString(persistenceType));
 		if(origFilename != null)
-			fs.put("Filename", origFilename.getAbsolutePath());
+			fs.putSingle("Filename", origFilename.getAbsolutePath());
 		if(targetURI != null)
-			fs.put("TargetURI", targetURI.toString());
+			fs.putSingle("TargetURI", targetURI.toString());
 		if(mimeType != null)
-			fs.put("Metadata.ContentType", mimeType);
+			fs.putSingle("Metadata.ContentType", mimeType);
 		fs.put("Global", global);
 		if(size != -1)
 			fs.put("DataLength", size);
 		if(token != null)
-			fs.put("ClientToken", token);
+			fs.putSingle("ClientToken", token);
 		fs.put("Started", started);
 		fs.put("MaxRetries", maxRetries);
 		if(targetFilename != null)
-			fs.put("TargetFilename", targetFilename);
+			fs.putSingle("TargetFilename", targetFilename);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -48,39 +48,39 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		fs.put("URI", uri.toString(false, false));
-		fs.put("Verbosity", Integer.toString(verbosity));
-		fs.put("Persistence", ClientRequest.persistenceTypeString(persistenceType));
-		fs.put("PriorityClass", Short.toString(priorityClass));
-		fs.put("Global", Boolean.toString(global));
+		fs.putSingle("Identifier", identifier);
+		fs.putSingle("URI", uri.toString(false, false));
+		fs.put("Verbosity", verbosity);
+		fs.putSingle("Persistence", ClientRequest.persistenceTypeString(persistenceType));
+		fs.put("PriorityClass", priorityClass);
+		fs.putSingle("Global", Boolean.toString(global));
 		SimpleFieldSet files = new SimpleFieldSet();
 		// Flatten the hierarchy, it can be reconstructed on restarting.
 		// Storing it directly would be a PITA.
 		ManifestElement[] elements = SimpleManifestPutter.flatten(manifestElements);
-		fs.put("DefaultName", defaultName);
+		fs.putSingle("DefaultName", defaultName);
 		for(int i=0;i<elements.length;i++) {
 			String num = Integer.toString(i);
 			ManifestElement e = elements[i];
 			String mimeOverride = e.getMimeTypeOverride();
 			SimpleFieldSet subset = new SimpleFieldSet();
 			FreenetURI tempURI = e.getTargetURI();
-			subset.put("Name", e.getName());
+			subset.putSingle("Name", e.getName());
 			if(tempURI != null) {
-				subset.put("UploadFrom", "redirect");
-				subset.put("TargetURI", tempURI.toString());
+				subset.putSingle("UploadFrom", "redirect");
+				subset.putSingle("TargetURI", tempURI.toString());
 			} else {
 				Bucket data = e.getData();
-				subset.put("DataLength", Long.toString(e.getSize()));
+				subset.put("DataLength", e.getSize());
 				if(mimeOverride != null)
-					subset.put("Metadata.ContentType", mimeOverride);
+					subset.putSingle("Metadata.ContentType", mimeOverride);
 				// What to do with the bucket?
 				// It is either a persistent encrypted bucket or a file bucket ...
 				if(data instanceof FileBucket) {
-					subset.put("UploadFrom", "disk");
-					subset.put("Filename", ((FileBucket)data).getFile().getPath());
+					subset.putSingle("UploadFrom", "disk");
+					subset.putSingle("Filename", ((FileBucket)data).getFile().getPath());
 				} else if((data instanceof PaddedEphemerallyEncryptedBucket) || (data == null)) {
-					subset.put("UploadFrom", "direct");
+					subset.putSingle("UploadFrom", "direct");
 				} else {
 					throw new IllegalStateException("Don't know what to do with bucket: "+data);
 				}
@@ -89,8 +89,8 @@
 		}
 		fs.put("Files", files);
 		if(token != null)
-			fs.put("ClientToken", token);
-		fs.put("Started", Boolean.toString(started));
+			fs.putSingle("ClientToken", token);
+		fs.put("Started", started);
 		fs.put("MaxRetries", maxRetries);
 		return fs;
 	}

Modified: trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PersistentRequestRemovedMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,8 +21,8 @@
 
     public SimpleFieldSet getFieldSet() {
         SimpleFieldSet fs = new SimpleFieldSet();
-        fs.put("Identifier", ident);
-        if(global) fs.put("Global", "true");
+        fs.putSingle("Identifier", ident);
+        if(global) fs.putSingle("Global", "true");
         return fs;
     }
 

Modified: trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/ProtocolErrorMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -125,14 +125,14 @@
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
 		if(ident != null)
-			sfs.put("Identifier", ident);
-		sfs.put("Code", Integer.toString(code));
-		sfs.put("CodeDescription", codeDescription());
+			sfs.putSingle("Identifier", ident);
+		sfs.put("Code", code);
+		sfs.putSingle("CodeDescription", codeDescription());
 		if(extra != null)
-			sfs.put("ExtraDescription", extra);
-		sfs.put("Fatal", Boolean.toString(fatal));
+			sfs.putSingle("ExtraDescription", extra);
+		sfs.put("Fatal", fatal);
 		if(global)
-			sfs.put("Global", "true");
+			sfs.putSingle("Global", "true");
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PutFailedMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -80,22 +80,22 @@
 	
 	public SimpleFieldSet getFieldSet(boolean verbose) {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		if(global) fs.put("Global", "true");
-		fs.put("Code", Integer.toString(code));
+		fs.putSingle("Identifier", identifier);
+		if(global) fs.putSingle("Global", "true");
+		fs.put("Code", code);
 		if(verbose)
-			fs.put("CodeDescription", codeDescription);
+			fs.putSingle("CodeDescription", codeDescription);
 		if(extraDescription != null)
-			fs.put("ExtraDescription", extraDescription);
+			fs.putSingle("ExtraDescription", extraDescription);
 		if(tracker != null) {
-			tracker.copyToFieldSet(fs, "Errors.", verbose);
+			fs.put("Errors", tracker.toFieldSet(verbose));
 		}
 		if(verbose)
-			fs.put("Fatal", Boolean.toString(isFatal));
+			fs.put("Fatal", isFatal);
 		if(verbose)
-			fs.put("ShortCodeDescription", shortCodeDescription);
+			fs.putSingle("ShortCodeDescription", shortCodeDescription);
 		if(expectedURI != null)
-			fs.put("ExpectedURI", expectedURI.toString());
+			fs.putSingle("ExpectedURI", expectedURI.toString());
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PutFetchableMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,10 +21,10 @@
 	
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		if(global) fs.put("Global", "true");
+		fs.putSingle("Identifier", identifier);
+		if(global) fs.putSingle("Global", "true");
 		if(uri != null)
-			fs.put("URI", uri.toString(false, false));
+			fs.putSingle("URI", uri.toString(false, false));
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/PutSuccessfulMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,11 +21,11 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		if(global) fs.put("Global", "true");
+		fs.putSingle("Identifier", identifier);
+		if(global) fs.putSingle("Global", "true");
 		// FIXME debug and remove!
 		if(uri != null)
-			fs.put("URI", uri.toString());
+			fs.putSingle("URI", uri.toString());
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -25,7 +25,7 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
+		fs.putSingle("Identifier", identifier);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SSKKeypairMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,10 +21,10 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("InsertURI", insertURI.toString());
-		sfs.put("RequestURI", requestURI.toString());
+		sfs.putSingle("InsertURI", insertURI.toString());
+		sfs.putSingle("RequestURI", requestURI.toString());
 		if(identifier != null) // is optional on these two only
-			sfs.put("Identifier", identifier);
+			sfs.putSingle("Identifier", identifier);
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,14 +21,14 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Total", Integer.toString(event.totalBlocks));
-		fs.put("Required", Integer.toString(event.minSuccessfulBlocks));
-		fs.put("Failed", Integer.toString(event.failedBlocks));
-		fs.put("FatallyFailed", Integer.toString(event.fatallyFailedBlocks));
-		fs.put("Succeeded",Integer.toString(event.fetchedBlocks));
-		fs.put("FinalizedTotal", Boolean.toString(event.finalizedTotal));
-		fs.put("Identifier", ident);
-		if(global) fs.put("Global", "true");
+		fs.put("Total", event.totalBlocks);
+		fs.put("Required", event.minSuccessfulBlocks);
+		fs.put("Failed", event.failedBlocks);
+		fs.put("FatallyFailed", event.fatallyFailedBlocks);
+		fs.put("Succeeded",event.fetchedBlocks);
+		fs.put("FinalizedTotal", event.finalizedTotal);
+		fs.putSingle("Identifier", ident);
+		if(global) fs.putSingle("Global", "true");
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/StartedCompressionMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -21,9 +21,9 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		fs.put("Codec", Integer.toString(codec));
-		if(global) fs.put("Global", "true");
+		fs.putSingle("Identifier", identifier);
+		fs.put("Codec", codec);
+		if(global) fs.putSingle("Global", "true");
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -48,8 +48,8 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("URI", key.getURI().toString());
-		fs.put("DontPoll", Boolean.toString(dontPoll));
+		fs.putSingle("URI", key.getURI().toString());
+		fs.put("DontPoll", dontPoll);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/SubscribedUSKUpdate.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -23,9 +23,9 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Identifier", identifier);
-		fs.put("Edition", Long.toString(edition));
-		fs.put("URI", key.getURI().toString());
+		fs.putSingle("Identifier", identifier);
+		fs.put("Edition", edition);
+		fs.putSingle("URI", key.getURI().toString());
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/URIGeneratedMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -19,8 +19,8 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("URI", uri.toString());
-		fs.put("Identifier", identifier);
+		fs.putSingle("URI", uri.toString());
+		fs.putSingle("Identifier", identifier);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/UnknownNodeIdentifierMessage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -16,7 +16,7 @@
 
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet sfs = new SimpleFieldSet();
-		sfs.put("NodeIdentifier", nodeIdentifier);
+		sfs.putSingle("NodeIdentifier", nodeIdentifier);
 		return sfs;
 	}
 

Modified: trunk/freenet/src/freenet/node/fcp/WatchGlobal.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/WatchGlobal.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/node/fcp/WatchGlobal.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -28,8 +28,8 @@
 	
 	public SimpleFieldSet getFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Enabled", Boolean.toString(enabled));
-		fs.put("VerbosityMask", Integer.toString(verbosityMask));
+		fs.put("Enabled", enabled);
+		fs.put("VerbosityMask", verbosityMask);
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/support/SimpleFieldSet.java
===================================================================
--- trunk/freenet/src/freenet/support/SimpleFieldSet.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/SimpleFieldSet.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -32,10 +32,18 @@
     private String endMarker;
     static public final char MULTI_LEVEL_CHAR = '.';
     
-    public SimpleFieldSet(BufferedReader br) throws IOException {
+    /**
+     * Construct a SimpleFieldSet from reading a BufferedReader.
+     * @param br
+     * @param allowMultiple If true, multiple lines with the same field name will be
+     * combined; if false, the constructor will throw.
+     * @throws IOException If the buffer could not be read, or if there was a formatting
+     * problem.
+     */
+    public SimpleFieldSet(BufferedReader br, boolean allowMultiple) throws IOException {
         values = new HashMap();
        	subsets = null;
-        read(br);
+        read(br, allowMultiple);
     }
     
     public SimpleFieldSet(SimpleFieldSet sfs){
@@ -44,10 +52,10 @@
     	endMarker = sfs.endMarker;
     }
 
-    public SimpleFieldSet(LineReader lis, int maxLineLength, int lineBufferSize, boolean tolerant, boolean utf8OrIso88591) throws IOException {
+    public SimpleFieldSet(LineReader lis, int maxLineLength, int lineBufferSize, boolean tolerant, boolean utf8OrIso88591, boolean allowMultiple) throws IOException {
     	values = new HashMap();
        	subsets = null;
-    	read(lis, maxLineLength, lineBufferSize, tolerant, utf8OrIso88591);
+    	read(lis, maxLineLength, lineBufferSize, tolerant, utf8OrIso88591, allowMultiple);
     }
     
     /**
@@ -62,12 +70,12 @@
      * Construct from a string.
      * @throws IOException if the string is too short or invalid.
      */
-    public SimpleFieldSet(String content) throws IOException {
+    public SimpleFieldSet(String content, boolean allowMultiple) throws IOException {
     	values = new HashMap();
     	subsets = null;
         StringReader sr = new StringReader(content);
         BufferedReader br = new BufferedReader(sr);
-	    read(br);
+	    read(br, allowMultiple);
     }
     
     /**
@@ -76,8 +84,9 @@
      * blah=blah
      * blah=blah
      * End
+     * @param allowMultiple 
      */
-    private void read(BufferedReader br) throws IOException {
+    private void read(BufferedReader br, boolean allowMultiple) throws IOException {
         boolean firstLine = true;
         while(true) {
             String line = br.readLine();
@@ -91,7 +100,7 @@
                 // Mapping
                 String before = line.substring(0, index);
                 String after = line.substring(index+1);
-                put(before, after);
+                put(before, after, allowMultiple, false);
             } else {
             	endMarker = line;
             	return;
@@ -108,7 +117,7 @@
      * End
      * @param utfOrIso88591 If true, read as UTF-8, otherwise read as ISO-8859-1.
      */
-    private void read(LineReader br, int maxLength, int bufferSize, boolean tolerant, boolean utfOrIso88591) throws IOException {
+    private void read(LineReader br, int maxLength, int bufferSize, boolean tolerant, boolean utfOrIso88591, boolean allowMultiple) throws IOException {
         boolean firstLine = true;
         while(true) {
             String line = br.readLine(maxLength, bufferSize, utfOrIso88591);
@@ -127,7 +136,7 @@
                 // Mapping
                 String before = line.substring(0, index);
                 String after = line.substring(index+1);
-                put(before, after);
+                put(before, after, allowMultiple, false);
             } else {
             	endMarker = line;
             	return;
@@ -175,15 +184,54 @@
 //    	return (String[]) v.toArray();
 	}
 
-	public synchronized void put(String key, String value) {
+    /**
+     * Set a key to a value. If the value already exists, throw IllegalStateException.
+     * @param key The key.
+     * @param value The value.
+     */
+    public void putSingle(String key, String value) {
+    	if(!put(key, value, false, false))
+    		throw new IllegalStateException("Value already exists: "+value+" but want to set "+key+" to "+value);
+    }
+    
+    /**
+     * Aggregating put. Set a key to a value, if the value already exists, append to it. 
+     * @param key The key.
+     * @param value The value.
+     */
+    public void putAppend(String key, String value) {
+    	put(key, value, true, false);
+    }
+    
+    /**
+     * Set a key to a value, overwriting any existing value if present.
+     * @param key The key.
+     * @param value The value.
+     */
+    public void putOverwrite(String key, String value) {
+    	put(key, value, false, true);
+    }
+    
+    /**
+     * Set a key to a value.
+     * @param key The key.
+     * @param value The value.
+     * @param allowMultiple If true, if the key already exists then the value will be
+     * appended to the existing value. If false, we return false to indicate that the
+     * old value is unchanged.
+     * @return True unless allowMultiple was false and there was a pre-existing value,
+     * or value was null.
+     */
+	private synchronized final boolean put(String key, String value, boolean allowMultiple, boolean overwrite) {
 		int idx;
-		if(value == null) return;
+		if(value == null) return false;
 		if((idx = key.indexOf(MULTI_LEVEL_CHAR)) == -1) {
 			String x = (String) values.get(key);
 			
-			if(x == null) {
+			if(x == null || overwrite) {
 				values.put(key, value);
 			} else {
+				if(!allowMultiple) return false;
 				values.put(key, ((String)values.get(key))+ ';' +value);
 			}
 		} else {
@@ -197,32 +245,33 @@
 				fs = new SimpleFieldSet();
 				subsets.put(before, fs);
 			}
-			fs.put(after, value);
+			fs.put(after, value, allowMultiple, overwrite);
 		}
+		return true;
     }
 
 	public void put(String key, int value) {
-		put(key, Integer.toString(value));
+		put(key, Integer.toString(value), false, false);
 	}
 	
 	public void put(String key, long value) {
-		put(key, Long.toString(value));
+		put(key, Long.toString(value), false, false);
 	}
 	
 	public void put(String key, short value) {
-		put(key, Short.toString(value));
+		put(key, Short.toString(value), false, false);
 	}
 	
 	public void put(String key, char c) {
-		put(key, ""+c);
+		put(key, ""+c, false, false);
 	}
 	
 	public void put(String key, boolean b) {
-		put(key, Boolean.toString(b));
+		put(key, Boolean.toString(b), false, false);
 	}
 	
 	public void put(String key, double windowSize) {
-		put(key, Double.toString(windowSize));
+		put(key, Double.toString(windowSize), false, false);
 	}
 
     /**
@@ -476,7 +525,7 @@
 		return (String[]) subsets.keySet().toArray(new String[subsets.size()]);
 	}
 
-	public static SimpleFieldSet readFrom(File f) throws IOException {
+	public static SimpleFieldSet readFrom(File f, boolean allowMultiple) throws IOException {
 		FileInputStream fis = null;
 		try {
 			fis = new FileInputStream(f);
@@ -490,7 +539,7 @@
 				return null;
 			}
 			BufferedReader br = new BufferedReader(isr);
-			SimpleFieldSet fs = new SimpleFieldSet(br);
+			SimpleFieldSet fs = new SimpleFieldSet(br, allowMultiple);
 			br.close();
 			fis = null;
 			return fs;

Modified: trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -73,7 +73,7 @@
 			return null;
 		}
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "DelayedFreeBucket");
+		fs.putSingle("Type", "DelayedFreeBucket");
 		if(bucket instanceof SerializableToFieldSetBucket) {
 			fs.put("Underlying", ((SerializableToFieldSetBucket)bucket).toFieldSet());
 		} else {

Modified: trunk/freenet/src/freenet/support/io/FileBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/FileBucket.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/FileBucket.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -349,8 +349,8 @@
 	public synchronized SimpleFieldSet toFieldSet() {
 		if(deleteOnFinalize) return null;
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "FileBucket");
-		fs.put("Filename", file.toString());
+		fs.putSingle("Type", "FileBucket");
+		fs.putSingle("Filename", file.toString());
 		fs.put("Length", length);
 		return fs;
 	}

Modified: trunk/freenet/src/freenet/support/io/NullBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/NullBucket.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/NullBucket.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -67,7 +67,7 @@
 
 	public SimpleFieldSet toFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "NullBucket");
+		fs.putSingle("Type", "NullBucket");
 		return fs;
 	}
 }

Modified: trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -350,12 +350,12 @@
 
 	public SimpleFieldSet toFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "PaddedEphemerallyEncryptedBucket");
+		fs.putSingle("Type", "PaddedEphemerallyEncryptedBucket");
 		synchronized(this) {
 			fs.put("DataLength", dataLength);
 		}
 		if(key != null) {
-			fs.put("DecryptKey", HexUtil.bytesToHex(key));
+			fs.putSingle("DecryptKey", HexUtil.bytesToHex(key));
 		} else {
 			Logger.error(this, "Cannot serialize because no key");
 			return null;
@@ -368,7 +368,7 @@
 		}
 		fs.put("MinPaddedSize", minPaddedSize);
 		if(!brokenEncryption)
-			fs.put("CryptoType", "aes256");
+			fs.putSingle("CryptoType", "aes256");
 		return fs;
 	}
 

Modified: trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/RandomAccessFileBucket.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -462,8 +462,8 @@
 
 	public synchronized SimpleFieldSet toFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "RandomAccessFileBucket");
-		fs.put("Filename", file.toString());
+		fs.putSingle("Type", "RandomAccessFileBucket");
+		fs.putSingle("Filename", file.toString());
 		fs.put("Offset", offset);
 		fs.put("Length", len);
 		return fs;

Modified: trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/ReadOnlyFileSliceBucket.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -145,8 +145,8 @@
 
 	public SimpleFieldSet toFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "ReadOnlyFileSliceBucket");
-		fs.put("Filename", file.toString());
+		fs.putSingle("Type", "ReadOnlyFileSliceBucket");
+		fs.putSingle("Filename", file.toString());
 		fs.put("Offset", startAt);
 		fs.put("Length", length);
 		return fs;

Modified: trunk/freenet/src/freenet/support/io/TempFileBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/TempFileBucket.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/io/TempFileBucket.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -435,7 +435,7 @@
 
 	public SimpleFieldSet toFieldSet() {
 		SimpleFieldSet fs = super.toFieldSet();
-		fs.put("Type", "TempFileBucket");
+		fs.putSingle("Type", "TempFileBucket");
 		return fs;
 	}
 }

Modified: trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java
===================================================================
--- trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/math/BootstrappingDecayingRunningAverage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -156,7 +156,7 @@
 
 	public synchronized SimpleFieldSet exportFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "BootstrappingDecayingRunningAverage");
+		fs.putSingle("Type", "BootstrappingDecayingRunningAverage");
 		fs.put("CurrentValue", currentValue);
 		fs.put("Reports", reports);
 		fs.put("Zeros", zeros);

Modified: trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java
===================================================================
--- trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/support/math/TimeDecayingRunningAverage.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -233,7 +233,7 @@
 
 	public synchronized SimpleFieldSet exportFieldSet() {
 		SimpleFieldSet fs = new SimpleFieldSet();
-		fs.put("Type", "TimeDecayingRunningAverage");
+		fs.putSingle("Type", "TimeDecayingRunningAverage");
 		fs.put("CurrentValue", curValue);
 		fs.put("Started", started);
 		fs.put("TotalReports", totalReports);

Modified: trunk/freenet/src/freenet/tools/AddRef.java
===================================================================
--- trunk/freenet/src/freenet/tools/AddRef.java	2007-02-09 19:47:51 UTC (rev 11717)
+++ trunk/freenet/src/freenet/tools/AddRef.java	2007-02-09 20:54:57 UTC (rev 11718)
@@ -54,8 +54,8 @@
 			OutputStream os = fcpSocket.getOutputStream();
 
 			try{
-				sfs.put("Name", "AddRef");
-				sfs.put("ExpectedVersion", "2.0");
+				sfs.putSingle("Name", "AddRef");
+				sfs.putSingle("ExpectedVersion", "2.0");
 				fcpm = FCPMessage.create("ClientHello", sfs);
 				fcpm.send(os);
 				os.flush();
@@ -74,7 +74,7 @@
 			}
 			
 			try{
-				sfs = SimpleFieldSet.readFrom(reference);
+				sfs = SimpleFieldSet.readFrom(reference, false);
 				fcpm = FCPMessage.create(AddPeer.name, sfs);
 				fcpm.send(os);
 				os.flush();
@@ -114,7 +114,7 @@
 				String line = lis.readLine(128, 128, true);
 				int index = line.indexOf('=');
 				if(index == -1 || line.startsWith("End")) return sfs;
-				sfs.put(line.substring(0, index), line.substring(index+1));
+				sfs.putSingle(line.substring(0, index), line.substring(index+1));
 			}
 		}catch(IOException e){
 			return sfs;




More information about the cvs mailing list