diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVars.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVars.java
index 3363653..d7ea842 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVars.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVars.java
@@ -58,7 +58,7 @@
         // Does not work yet for new walker.
         OpWalker.walk(new OpWalkerVisitorVisible(visitor, acc), op) ;
     }
-    
+
     /** The set of variables that will be in every solution of this Op */
     public static Set<Var> fixedVars(Op op) {
         Set<Var> acc = collector() ;
@@ -70,7 +70,7 @@
         OpVarsPattern visitor = new OpVarsPattern(acc, true) ;
         OpWalker.walk(new OpWalkerVisitorFixed(visitor, acc), op) ;
     }
-    
+
     public static Tuple<Set<Var>> mentionedVarsByPosition(Op op) {
         Set<Var> graphAcc = collector() ;
         Set<Var> subjAcc = collector() ;
@@ -81,7 +81,7 @@
         OpWalker.walk(op, visitor);
         return TupleFactory.tuple(graphAcc, subjAcc, predAcc, objAcc, unknownAcc);
     }
-    
+
     public static Tuple<Set<Var>> mentionedVarsByPosition(Op... ops) {
         Set<Var> graphAcc = collector() ;
         Set<Var> subjAcc = collector() ;
@@ -108,7 +108,7 @@
     }
 
     /** Do project and don't walk into it. MINUS vars aren't visible either */
-    private static class OpWalkerVisitorVisible extends OpWalkerVisitor 
+    private static class OpWalkerVisitorVisible extends OpWalkerVisitor
     {
         private final Collection<Var> acc ;
 
@@ -149,7 +149,7 @@
             super(visitor);
             this.acc = acc ;
         }
-        
+
         @Override
         public void visit(OpLeftJoin x) {
             x.getLeft().visit(this);
@@ -167,7 +167,7 @@
             Set<Var> r = SetUtils.intersection(left,  right) ;
             acc.addAll(r) ;
         }
-        
+
         @Override
         public void visit(OpProject op) {
             before(op) ;
@@ -192,7 +192,7 @@
     }
 
     /** Collect variables.
-     * What to collect from is controlled by the walker e.g. 
+     * What to collect from is controlled by the walker e.g.
      * OpWalkerVisitorFixed, OpWalkerVisitorVisible
      * and for OpVarsMentioned, the full geenral walker.
      */
@@ -223,7 +223,7 @@
             addVar(acc, quadPattern.getGraphNode()) ;
             VarUtils.addVars(acc, quadPattern.getBasicPattern()) ;
         }
-        
+
         @Override
         public void visit(OpQuadBlock quadBlock) {
             VarUtils.addVars(acc, quadBlock.getPattern()) ;
@@ -245,6 +245,12 @@
         }
 
         @Override
+        public void visit(OpFind opFind) {
+            VarUtils.addVarsFromTriple(acc, opFind.getTriple());
+            addVar(acc, opFind.getVar());
+        }
+
+        @Override
         public void visit(OpDatasetNames dsNames) {
             addVar(acc, dsNames.getGraphNode()) ;
         }
@@ -262,7 +268,7 @@
             // The walker (WalkerVisitorVisible) handles this
             // for visible variables, not mentioned variable collecting.
             // The visibleOnly/clear is simply to be as general as possible.
-            // visible: OpWalkerVisitorFixed, OpWalkerVisitorVisible,   
+            // visible: OpWalkerVisitorFixed, OpWalkerVisitorVisible,
             // all (visibleOnly==false) for OpVarsMentioned
             if (visibleOnly)
                 acc.clear() ;
@@ -289,13 +295,13 @@
         public void visit(OpProcedure opProc) {
             ExprVars.varsMentioned(acc, opProc.getArgs()) ;
         }
-        
+
         @Override
         public void visit(OpExt opExt) {
             // OpWalkerVisitor is taking care of calling opExt.effectiveOp().visit(this)
         }
     }
-    
+
     private static class OpVarsPatternWithPositions extends OpVisitorBase
     {
         // The possibly-set-vars
@@ -359,7 +365,7 @@
                 clear(subjAcc, vs);
                 clear(predAcc, vs);
                 clear(objAcc, vs);
-                
+
             }
             for (Var v : vs) {
                 if (!graphAcc.contains(v) && !subjAcc.contains(v) && !predAcc.contains(v) && !objAcc.contains(v)) {
@@ -399,7 +405,7 @@
         public void visit(OpProcedure opProc) {
             unknownAcc.addAll(OpVars.mentionedVars(opProc));
         }
-        
+
         private void vars(BasicPattern bp) {
             for (Triple t : bp.getList())
             {
@@ -408,7 +414,7 @@
                 addVar(objAcc, t.getObject());
             }
         }
-        
+
         private void clear(Set<Var> acc, List<Var> visible) {
             List<Var> toRemove = new ArrayList<>();
             for (Var found : acc)
