Index: trunk/ippTools/share/Makefile.am
===================================================================
--- trunk/ippTools/share/Makefile.am	(revision 38158)
+++ trunk/ippTools/share/Makefile.am	(revision 38168)
@@ -528,4 +528,5 @@
 	remotetool_definebyquery_staticsky.sql \
 	remotetool_definebyquery_diff.sql \
+	remotetool_definebyquery_ff.sql \
 	remotetool_dropcomponent.sql \
 	remotetool_listcomponent.sql \
Index: trunk/ippTools/share/remotetool_definebyquery_ff.sql
===================================================================
--- trunk/ippTools/share/remotetool_definebyquery_ff.sql	(revision 38168)
+++ trunk/ippTools/share/remotetool_definebyquery_ff.sql	(revision 38168)
@@ -0,0 +1,21 @@
+SELECT stage_id FROM
+
+( SELECT ff_id AS stage_id
+    FROM fullForceRun
+WHERE
+fullForceRun.state = 'new'
+-- where hook %s
+GROUP BY ff_id
+) AS W
+
+LEFT JOIN
+
+(SELECT remote_id,remoteRun.stage,remoteRun.label,remoteComponent.stage_id,remoteRun.state
+   FROM remoteRun
+   JOIN remoteComponent USING(remote_id)
+WHERE
+remoteRun.stage = 'ff' AND remoteComponent.state != 'retry'
+-- where hook %s
+) AS R
+USING(stage_id)
+WHERE R.remote_id IS NULL
Index: trunk/ippTools/src/remotetool.c
===================================================================
--- trunk/ippTools/src/remotetool.c	(revision 38158)
+++ trunk/ippTools/src/remotetool.c	(revision 38168)
@@ -166,4 +166,15 @@
   else if (!strcmp(stage,"diff")) {
     query = pxDataGet("remotetool_definebyquery_diff.sql");
+    if (!query) {
+      psError(PXTOOLS_ERR_SYS,false, "failed to retreive SQL statement");
+      return(false);
+    }
+
+    if (label) {
+      psStringAppend(&whereOption, "\n AND (label = '%s')", label);
+    }
+  }
+  else if (!strcmp(stage,"ff")) {
+    query = pxDataGet("remotetool_definebyquery_ff.sql");
     if (!query) {
       psError(PXTOOLS_ERR_SYS,false, "failed to retreive SQL statement");
