diff --git a/client/cs_trickle.C b/client/cs_trickle.C
new file mode 100644
index 0000000000..f379891da1
--- /dev/null
+++ b/client/cs_trickle.C
@@ -0,0 +1,123 @@
+// The contents of this file are subject to the BOINC Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License. You may obtain a copy of the License at
+// http://boinc.berkeley.edu/license_1.0.txt
+//
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+// License for the specific language governing rights and limitations
+// under the License.
+//
+// The Original Code is the Berkeley Open Infrastructure for Network Computing.
+//
+// The Initial Developer of the Original Code is the SETI@home project.
+// Portions created by the SETI@home project are Copyright (C) 2002
+// University of California at Berkeley. All Rights Reserved.
+//
+// Contributor(s):
+//
+
+#include "error_numbers.h"
+#include "file_names.h"
+#include "filesys.h"
+#include "parse.h"
+#include "client_state.h"
+
+// Scan project dir for file names of the form trickle_up_X_Y
+// where X is a result name and Y is a timestamp.
+// Convert them to XML (for sched request message)
+//
+int CLIENT_STATE::read_trickle_files(PROJECT* project, FILE* f) {
+ char project_dir[256], *p, *q, result_name[256], fname[256];
+ char* file_contents, path[256];
+ string fn;
+ time_t t;
+ int retval;
+
+ get_project_dir(project, project_dir);
+ DirScanner ds(project_dir);
+
+ while (ds.scan(fn)) {
+ strcpy(fname, fn.c_str());
+ if (strstr(fname, "trickle_up") != fname) continue;
+ q = fname + strlen("trickle_up");
+ p = strrchr(fname, '_');
+ if (p <= q) continue;
+ *p = 0;
+ strcpy(result_name, q);
+ t = atoi(p+1);
+
+ sprintf(path, "%s%s%s", project_dir, PATH_SEPARATOR, fname);
+ retval = read_file_malloc(path, file_contents);
+ if (retval) continue;
+ fprintf(f,
+ "