Index: src/org/mediawiki/importer/ExactListFilter.java
===================================================================
--- src/org/mediawiki/importer/ExactListFilter.java	(revision 81588)
+++ src/org/mediawiki/importer/ExactListFilter.java	(working copy)
@@ -28,11 +28,11 @@
 import java.io.IOException;
 
 public class ExactListFilter extends ListFilter {
-	public ExactListFilter(DumpWriter sink, String sourceFileName) throws IOException {
-		super(sink, sourceFileName);
+	public ExactListFilter(DumpWriter sink, String sourceFileName, boolean negate) throws IOException {
+		super(sink, sourceFileName, negate);
 	}
 	
 	protected boolean pass(Page page) {
-		return list.containsKey(page.Title.toString());
+		return list.containsKey(page.Title.toString()) ^ negate;
 	}
 }
Index: src/org/mediawiki/importer/ListFilter.java
===================================================================
--- src/org/mediawiki/importer/ListFilter.java	(revision 81588)
+++ src/org/mediawiki/importer/ListFilter.java	(working copy)
@@ -33,9 +33,11 @@
 
 public class ListFilter extends PageFilter {
 	protected HashMap list;
+	protected boolean negate;
 	
-	public ListFilter(DumpWriter sink, String sourceFileName) throws IOException {
+	public ListFilter(DumpWriter sink, String sourceFileName, boolean negate) throws IOException {
 		super(sink);
+		this.negate = negate;
 		list = new HashMap();
 		BufferedReader input = new BufferedReader(new InputStreamReader(
 			new FileInputStream(sourceFileName), "utf-8"));
@@ -57,6 +59,6 @@
 	
 	protected boolean pass(Page page) {
 		return list.containsKey(page.Title.subjectPage().toString())
-			|| list.containsKey(page.Title.talkPage().toString());
+			|| list.containsKey(page.Title.talkPage().toString()) ^ negate;
 	}
 }
Index: src/org/mediawiki/dumper/Dumper.java
===================================================================
--- src/org/mediawiki/dumper/Dumper.java	(revision 81588)
+++ src/org/mediawiki/dumper/Dumper.java	(working copy)
@@ -276,13 +276,17 @@
 		else if (filter.equals("titlematch"))
 			return new TitleMatchFilter(sink, param);
 		else if (filter.equals("list"))
-			return new ListFilter(sink, param);
+			return new ListFilter(sink, param, false);
+		else if (filter.equals("except"))
+			return new ListFilter(sink, param, true);
 		else if (filter.equals("exactlist"))
-			return new ExactListFilter(sink, param);
+			return new ExactListFilter(sink, param, false);
 		else if (filter.equals("revlist"))
 			return new RevisionListFilter(sink, param);
 		else if (filter.equals("before"))
 			return new BeforeTimeStampFilter(sink, param);
+		else if (filter.equals("exactexcept"))
+			return new ExactListFilter(sink, param, false);
 		else if (filter.equals("after"))
 			return new AfterTimeStampFilter(sink, param);
 		else
Index: README
===================================================================
--- README	(revision 81588)
+++ README	(working copy)
@@ -123,6 +123,15 @@
       Excludes all talk pages from output (including custom namespaces)
   --filter=titlematch:<regex>
       Excludes all pages whose titles do not match the regex.
+  --filter=except:<list-filename>
+      As list filter, but excludes all pages whose titles do *not* appear
+      in the given file.
+   --filter=exactlist:<list-filename>
+      As list filter, but does not try to match associated talk/subject
+      pages.
+  --filter=exactexcept:<list-filname>
+      As exactlist filter, but excludes all pages whose titles do *not*
+      appear in the given file.
 
 Misc options:
   --progress=<n>
