Index: js/TiddlyWiki.js
===================================================================
--- js/TiddlyWiki.js	(revision 2542)
+++ js/TiddlyWiki.js	(working copy)
@@ -530,3 +530,40 @@
 	return this.saver;
 };
 
+// Filter a list of tiddlers
+//#   filter - filter expression (eg "tidlertitle [[multi word tiddler title]] [tag[systemConfig]]")
+//# Returns an array of Tiddler() objects that match the filter expression
+TiddlyWiki.prototype.filterTiddlers = function(filter)
+{
+	var results = [];
+	if(filter) {
+		var re = /(\w+)|(?:\[([ \w]+)\[([ \w]+)\]\])|(?:\[\[([ \w]+)\]\])/mg;
+		var match = re.exec(filter);
+		while(match) {
+			if(match[1]) {
+				//# matches (eg) text
+				var tiddler = this.fetchTiddler(match[1])
+				if(tiddler)
+					results.push(tiddler);
+			} else if(match[2]) {
+				//# matches (eg) [text[more text]]
+				if(match[2]=="tag") {
+					this.forEachTiddler(function(title,tiddler) {
+						if(tiddler.isTagged(match[3]))
+							results.push(tiddler);
+					});
+				}
+			} else if(match[4]) {
+				//# matches (eg) [[tiddler title]]
+				var tiddler = this.fetchTiddler(match[4])
+				if(tiddler)
+					results.push(tiddler);
+			}			
+			match = re.exec(filter);
+		}
+	} else {
+		this.forEachTiddler(function(title,tiddler) {results.push(tiddler);});
+	}
+	return results;
+};
+
Index: js/main.js
===================================================================
--- js/main.js	(revision 2542)
+++ js/main.js	(working copy)
@@ -82,8 +82,10 @@
 {
 	invokeParamifier(params,"onstart");
 	if(story.isEmpty()) {
-		var defaultParams = store.getTiddlerText("DefaultTiddlers").parseParams("open",null,false);
-		invokeParamifier(defaultParams,"onstart");
+		var tiddlers = store.filterTiddlers(store.getTiddlerText("DefaultTiddlers"));
+		for(var t=0; t<tiddlers.length; t++) {
+			story.displayTiddler("bottom",tiddlers[t].title);
+		}
 	}
 	window.scrollTo(0,0);
 }
Index: js/FileAdaptor.js
===================================================================
--- js/FileAdaptor.js	(revision 2542)
+++ js/FileAdaptor.js	(working copy)
@@ -89,8 +89,10 @@
 };
 
 // Gets the list of tiddlers within a given workspace
-//#   callback - function to be called on completion
 //#   context - passed on to callback function
+//#   userParams - user parameters passed through to the callback function
+//#   callback - function to be called on completion
+//#   filter - filter expression
 //# Return value is true if the request was successfully issued,
 //#   or an error description string if there was a problem
 //# The callback parameters are callback(status,adaptor,context,tiddlerList)
@@ -98,23 +100,16 @@
 //#   adaptor - reference to this adaptor object
 //#   context - parameters as originally passed into the getTiddlerList function
 //#   tiddlerList - array of objects describing each tiddler
-FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback)
+FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback,filter)
 {
 	if(!this.store)
 		return FileAdaptor.NotLoadedError;
 	if(!context)
 		context = {};
-	context.tiddlers = [];
-	this.store.forEachTiddler(function(title,tiddler)
-		{
-		var t = new Tiddler(title);
-		t.text = tiddler.text;
-		t.modified = tiddler.modified;
-		t.modifier = tiddler.modifier;
-		t.fields['server.page.revision'] = tiddler.modified.convertToYYYYMMDDHHMM();
-		t.tags = tiddler.tags;
-		context.tiddlers.push(t);
-		});
+	context.tiddlers = this.store.filterTiddlers(filter);
+	for(var t=0; t<context.tiddlers.length; t++) {
+		context.tiddlers[t].fields['server.page.revision'] = context.tiddlers[t].modified.convertToYYYYMMDDHHMM();
+	}
 	context.status = true;
 	window.setTimeout(function() {callback(context,userParams);},10);
 	return true;
Index: js/Config.js
===================================================================
--- js/Config.js	(revision 2542)
+++ js/Config.js	(working copy)
@@ -105,7 +105,8 @@
 		missing: {},
 		orphans: {},
 		shadowed: {},
-		touched: {}
+		touched: {},
+		filter: {}
 	},
 	closeAll: {},
 	permaview: {},
Index: js/Macros.js
===================================================================
--- js/Macros.js	(revision 2542)
+++ js/Macros.js	(working copy)
@@ -60,6 +60,18 @@
 	return store.getTouched();
 };
 
+config.macros.list.filter.handler = function(params)
+{
+	var filter = params[1];
+	var results = [];
+	if(filter) {
+		var tiddlers = store.filterTiddlers(filter);
+		for(var t=0; t<tiddlers.length; t++)
+			results.push(tiddlers[t].title);
+	}
+	return results;
+};
+
 config.macros.allTags.handler = function(place,macroName,params)
 {
 	var tags = store.getTags(params[0]);
