Index: js/Story.js
===================================================================
--- js/Story.js	(revision 5924)
+++ js/Story.js	(working copy)
@@ -153,43 +153,32 @@
 //#   tiddlerElem - reference to the element that will contain the tiddler
 Story.prototype.loadMissingTiddler = function(title,fields,tiddlerElem)
 {
+	var getTiddlerCallback = function(context)
+	{
+		var tiddler = context.tiddler;
+		if(tiddler && tiddler.text) {
+			if(!tiddler.created)
+				tiddler.created = new Date();
+			if(!tiddler.modified)
+				tiddler.modified = tiddler.created;
+			store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created);
+			autoSaveChanges();
+		}
+		context.adaptor.close();
+		delete context.adpator;
+	};
+
 	var tiddler = new Tiddler(title);
-	tiddler.fields = typeof fields == "string" ? fields.decodeHashMap() : (fields || {});
-	var serverType = tiddler.getServerType();
-	var host = tiddler.fields['server.host'];
-	var workspace = tiddler.fields['server.workspace'];
-	if(!serverType || !host)
-		return null;
-	var sm = new SyncMachine(serverType,{
-			start: function() {
-				return this.openHost(host,"openWorkspace");
-			},
-			openWorkspace: function() {
-				return this.openWorkspace(workspace,"getTiddler");
-			},
-			getTiddler: function() {
-				return this.getTiddler(title,"onGetTiddler");
-			},
-			onGetTiddler: function(context) {
-				var tiddler = context.tiddler;
-				if(tiddler && tiddler.text) {
-					var downloaded = new Date();
-					if(!tiddler.created)
-						tiddler.created = downloaded;
-					if(!tiddler.modified)
-						tiddler.modified = tiddler.created;
-					store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created);
-					autoSaveChanges();
-				}
-				delete this;
-				return true;
-			},
-			error: function(message) {
-				displayMessage("Error loading missing tiddler from %0: %1".format([host,message]));
-			}
-		});
-	sm.go();
-	return config.messages.loadingMissingTiddler.format([title,serverType,host,workspace]);
+	tiddler.fields = typeof fields == "string" ?  fields.decodeHashMap() : (fields ? fields : {});
+	context = {};
+	context.serverType = tiddler.getServerType();
+	if(!context.serverType)
+		return;
+	context.host = tiddler.fields['server.host'];
+	context.workspace = tiddler.fields['server.workspace'];
+	var adaptor = new config.adaptors[context.serverType];
+	adaptor.getTiddler(title,context,null,getTiddlerCallback);
+	return config.messages.loadingMissingTiddler.format([title,context.serverType,context.host,context.workspace]);
 };
 
 //# Overridable for choosing the name of the template to apply for a tiddler
Index: js/Sync.js
===================================================================
--- js/Sync.js	(revision 5926)
+++ js/Sync.js	(working copy)
@@ -52,6 +52,7 @@
 		syncItem.serverType = tiddler.getServerType();
 		syncItem.serverHost = tiddler.fields['server.host'];
 		if(syncItem.serverType && syncItem.serverHost) {
+			syncItem.adaptor = new config.adaptors[syncItem.serverType];
 			syncItem.serverWorkspace = tiddler.fields['server.workspace'];
 			syncItem.tiddler = tiddler;
 			syncItem.title = tiddler.title;
@@ -70,7 +71,7 @@
 {
 	for(var i=0; i<syncList.length; i++) {
 		var si = syncList[i];
-		si.serverUrl = si.syncTask.syncMachine.generateTiddlerInfo(si.tiddler).uri;
+		si.serverUrl = si.adaptor.generateTiddlerInfo(si.tiddler).uri;
 	}
 };
 
@@ -112,61 +113,39 @@
 	st.serverHost = syncItem.serverHost;
 	st.serverWorkspace = syncItem.serverWorkspace;
 	st.syncItems = [syncItem];
-	st.syncMachine = new SyncMachine(st.serverType,{
-		start: function() {
-			return this.openHost(st.serverHost,"openWorkspace");
-		},
-		openWorkspace: function() {
-			return this.openWorkspace(st.serverWorkspace,"getTiddlerList");
-		},
-		getTiddlerList: function() {
-			return this.getTiddlerList("onGetTiddlerList");
-		},
-		onGetTiddlerList: function(context) {
-			var tiddlers = context.tiddlers;
-			for(var i=0; i<st.syncItems.length; i++) {
-				var si = st.syncItems[i];
-				var f = tiddlers.findByField("title",si.title);
-				if(f !== null) {
-					if(tiddlers[f].fields['server.page.revision'] > si.tiddler.fields['server.page.revision']) {
-						si.syncStatus = config.macros.sync.syncStatusList[si.isTouched ? 'changedBoth' : 'changedServer'];
-					}
-				} else {
-					si.syncStatus = config.macros.sync.syncStatusList.notFound;
+
+	var openWorkspaceCallback = function(context,syncItems) {
+		if(context.status) {
+			context.adaptor.getTiddlerList(context,syncItems,getTiddlerListCallback);
+			return true;
+		}
+		displayMessage(context.statusText);
+		return false;
+	};
+
+	var getTiddlerListCallback = function(context,sycnItems) {
+		if(!context.status) {
+			displayMessage(context.statusText);
+			return false;
+		}
+		syncItems = context.userParams;
+		var tiddlers = context.tiddlers;
+		for(var i=0; i<syncItems.length; i++) {
+			var si = syncItems[i];
+			var f = tiddlers.findByField("title",si.title);
+			if(f !== null) {
+				if(tiddlers[f].fields['server.page.revision'] > si.tiddler.fields['server.page.revision']) {
+					si.syncStatus = config.macros.sync.syncStatusList[si.isTouched ? 'changedBoth' : 'changedServer'];
 				}
-				config.macros.sync.updateSyncStatus(si);
+			} else {
+				si.syncStatus = config.macros.sync.syncStatusList.notFound;
 			}
-		},
-		getTiddler: function(title) {
-			return this.getTiddler(title,"onGetTiddler");
-		},
-		onGetTiddler: function(context) {
-			var tiddler = context.tiddler;
-			var syncItem = st.syncItems.findByField("title",tiddler.title);
-			if(syncItem !== null) {
-				syncItem = st.syncItems[syncItem];
-				store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, true, tiddler.created);
-				syncItem.syncStatus = config.macros.sync.syncStatusList.gotFromServer;
-				config.macros.sync.updateSyncStatus(syncItem);
-			}
-		},
-		putTiddler: function(tiddler) {
-			return this.putTiddler(tiddler,"onPutTiddler");
-		},
-		onPutTiddler: function(context) {
-			var title = context.title;
-			var syncItem = st.syncItems.findByField("title",title);
-			if(syncItem !== null) {
-				syncItem = st.syncItems[syncItem];
-				store.resetTiddler(title);
-				if(context.status) {
-					syncItem.syncStatus = config.macros.sync.syncStatusList.putToServer;
-					config.macros.sync.updateSyncStatus(syncItem);
-				}
-			}
+			config.macros.sync.updateSyncStatus(si);
 		}
-	});
-	st.syncMachine.go();
+	};
+	var context = {host:st.serverHost,workspace:st.serverWorkspace};
+	syncItem.adaptor.openHost(st.serverHost);
+	syncItem.adaptor.openWorkspace(st.serverWorkspace,context,st.syncItems,openWorkspaceCallback);
 	return st;
 };
 
@@ -181,6 +160,22 @@
 
 config.macros.sync.doSync = function(e)
 {
+	var getTiddlerCallback = function(context,syncItem) {
+		if(syncItem) {
+			var tiddler = context.tiddler;
+			store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created);
+			syncItem.syncStatus = config.macros.sync.syncStatusList.gotFromServer;
+			config.macros.sync.updateSyncStatus(syncItem);
+		}
+	};
+	var putTiddlerCallback = function(context,syncItem) {
+		if(syncItem) {
+			store.resetTiddler(context.title);
+			syncItem.syncStatus = config.macros.sync.syncStatusList.putToServer;
+			config.macros.sync.updateSyncStatus(syncItem);
+		}
+	};
+
 	var rowNames = ListView.getSelectedRows(currSync.listView);
 	var sl = config.macros.sync.syncStatusList;
 	for(var i=0; i<currSync.syncList.length; i++) {
@@ -189,12 +184,12 @@
 			var r = true;
 			switch(si.syncStatus) {
 			case sl.changedServer:
-				r = si.syncTask.syncMachine.go("getTiddler",si.title);
+				r = si.adaptor.getTiddler(syncItem.title,null,si,getTiddlerCallback);
 				break;
 			case sl.notFound:
 			case sl.changedLocally:
 			case sl.changedBoth:
-				r = si.syncTask.syncMachine.go("putTiddler",si.tiddler);
+				r = si.adaptor.putTiddler(si.tiddler,null,si,putTiddlerCallback);
 				break;
 			default:
 				break;
@@ -205,74 +200,3 @@
 	}
 	return false;
 };
-
-function SyncMachine(serverType,steps)
-{
-	this.serverType = serverType;
-	this.adaptor = new config.adaptors[serverType]();
-	this.steps = steps;
-}
-
-SyncMachine.prototype.go = function(step,context)
-{
-	var r = context ? context.status : null;
-	if(typeof r == "string") {
-		this.invokeError(r);
-		return r;
-	}
-	var h = this.steps[step ? step : "start"];
-	if(!h)
-		return null;
-	r = h.call(this,context);
-	if(typeof r == "string")
-		this.invokeError(r);
-	return r;
-};
-
-SyncMachine.prototype.invokeError = function(message)
-{
-	if(this.steps.error)
-		this.steps.error(message);
-};
-
-SyncMachine.prototype.openHost = function(host,nextStep)
-{
-	var me = this;
-	return me.adaptor.openHost(host,null,null,function(context) {me.go(nextStep,context);});
-};
-
-SyncMachine.prototype.getWorkspaceList = function(nextStep)
-{
-	var me = this;
-	return me.adaptor.getWorkspaceList(null,null,function(context) {me.go(nextStep,context);});
-};
-
-SyncMachine.prototype.openWorkspace = function(workspace,nextStep)
-{
-	var me = this;
-	return me.adaptor.openWorkspace(workspace,null,null,function(context) {me.go(nextStep,context);});
-};
-
-SyncMachine.prototype.getTiddlerList = function(nextStep)
-{
-	var me = this;
-	return me.adaptor.getTiddlerList(null,null,function(context) {me.go(nextStep,context);});
-};
-
-SyncMachine.prototype.generateTiddlerInfo = function(tiddler)
-{
-	return this.adaptor.generateTiddlerInfo(tiddler);
-};
-
-SyncMachine.prototype.getTiddler = function(title,nextStep)
-{
-	var me = this;
-	return me.adaptor.getTiddler(title,null,null,function(context) {me.go(nextStep,context);});
-};
-
-SyncMachine.prototype.putTiddler = function(tiddler,nextStep)
-{
-	var me = this;
-	return me.adaptor.putTiddler(tiddler,null,null,function(context) {me.go(nextStep,context);});
-};
-

