Index: drools-decisiontables/src/test/java/org/drools/decisiontable/parser/LhsBuilderTest.java
===================================================================
--- drools-decisiontables/src/test/java/org/drools/decisiontable/parser/LhsBuilderTest.java	(revision 33335)
+++ drools-decisiontables/src/test/java/org/drools/decisiontable/parser/LhsBuilderTest.java	(working copy)
@@ -47,14 +47,50 @@
         
         assertEquals("Foo(bar == 42)\neval(true)", builder.getResult());
     }
+
+	public void testForAllOrSingle() {
+		LhsBuilder builder = new LhsBuilder("Person");
+		builder.addTemplate(1, "age < $forall(||)");
+		builder.addCellValue(1, "42");
+		assertEquals("Person(age < 42)", builder.getResult());
+	}
+
+	public void testForAllOrMultiple() {
+		LhsBuilder builder = new LhsBuilder("Person");
+		builder.addTemplate(1, "age < $forall(||)");
+		builder.addCellValue(1, "42, 43, 44");
+		assertEquals("Person(age < 42 || age < 43 || age < 44)", builder
+				.getResult());
+	}
+
+	public void testForAllAndSingle() {
+		LhsBuilder builder = new LhsBuilder("Person");
+		builder.addTemplate(1, "age < $forall(&&)");
+		builder.addCellValue(1, "42");
+		assertEquals("Person(age < 42)", builder.getResult());
+	}
+
+	public void testForAllAndMultiple() {
+		LhsBuilder builder = new LhsBuilder("Person");
+		builder.addTemplate(1, "age < $forall(&&)");
+		builder.addCellValue(1, "42, 43, 44");
+		assertEquals("Person(age < 42 && age < 43 && age < 44)", builder
+				.getResult());
+	}
     
     public void testIdentifyFieldTypes() {
         LhsBuilder builder = new LhsBuilder("");
         assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("age"));
         assertEquals(FieldType.OPERATOR_FIELD, builder.calcFieldType("age <"));
         assertEquals(FieldType.NORMAL_FIELD, builder.calcFieldType("age < $param"));
+        assertEquals(FieldType.NORMAL_FIELD, builder.calcFieldType("age < $forall(||)"));
+        assertEquals(FieldType.NORMAL_FIELD, builder.calcFieldType("age < $forall(&&)"));
+        assertEquals(FieldType.NORMAL_FIELD, builder.calcFieldType("age < $forall(,)"));
+        assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("age < $para"));
+        assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("age < $forall()"));
+        assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("age < $forall(&&"));
+        assertEquals(FieldType.SINGLE_FIELD, builder.calcFieldType("age < $forall("));
         
-        
     }
     
     public void testIdentifyColumnCorrectly() {
Index: drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LhsBuilder.java
===================================================================
--- drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LhsBuilder.java	(revision 33335)
+++ drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LhsBuilder.java	(working copy)
@@ -61,9 +61,9 @@
             constraints.put( key,
                              content );            
         } else if (fieldType == FieldType.SINGLE_FIELD) {
-            constraints.put( key, content + " == \"$param\"" );
+            constraints.put( key, content + " == \"" + SnippetBuilder.PARAM_STRING + "\"" );
         } else if (fieldType == FieldType.OPERATOR_FIELD) {
-            constraints.put( key, content + " \"$param\"" );
+            constraints.put( key, content + " \"" + SnippetBuilder.PARAM_STRING + "\"" );
         }
         
     }
@@ -133,11 +133,15 @@
      * age 
      * age <
      * age == $param
+     * age == $forall(&&)
      * 
      * etc. as we treat them all differently.
      */
     public FieldType calcFieldType(String content) {
-        if (content.indexOf( "$param" ) != -1 || content.indexOf( "$1" ) != -1 ) {
+		if (content.indexOf(SnippetBuilder.PARAM_STRING) != -1
+				|| content.indexOf(SnippetBuilder.PARAM_PREFIX + "1") != -1
+				|| SnippetBuilder.PARAM_FORALL_REGEXP.matcher(content)
+						.matches()) {
             return FieldType.NORMAL_FIELD;
         }
         for ( String op : operators ) {
Index: drools-templates/src/test/java/org/drools/template/model/SnippetBuilderTest.java
===================================================================
--- drools-templates/src/test/java/org/drools/template/model/SnippetBuilderTest.java	(revision 33335)
+++ drools-templates/src/test/java/org/drools/template/model/SnippetBuilderTest.java	(working copy)
@@ -92,5 +92,66 @@
                       result );
 
     }
+    
 
+	public void testForAllAndOne() {
+		final String snippet = "something == $forall(&&)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("x");
+		assertEquals("something == x", result);
+	}
+
+	public void testForAllAndTwo() {
+		final String snippet = "something == $forall(&&)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("x, y");
+		assertEquals("something == x && something == y", result);
+	}
+
+	public void testForAllAndNone() {
+		final String snippet = "something == $forall(&&)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("");
+		assertEquals("something == $forall(&&)", result);
+	}
+
+	public void testForAllAndDouble() {
+		final String snippet = "something == $forall(&&) || something == $forall(&&)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("x, y");
+		assertEquals(
+				"something == x || something == x && something == y || something == y",
+				result);
+	}
+
+	public void testForAllOrOne() {
+		final String snippet = "something == $forall(||)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("x");
+		assertEquals("something == x", result);
+	}
+
+	public void testForAllOrTwo() {
+		final String snippet = "something == $forall(||)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("x, y");
+		assertEquals("something == x || something == y", result);
+	}
+
+	public void testForAllOrNone() {
+		final String snippet = "something == $forall(||)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("");
+		assertEquals("something == $forall(||)", result);
+	}
+
+	public void testForAllOrDouble() {
+		final String snippet = "something == $forall(||) || something == $forall(||)";
+		final SnippetBuilder snip = new SnippetBuilder(snippet);
+		final String result = snip.build("x, y");
+		assertEquals(
+				"something == x || something == x || something == y || something == y",
+				result);
+	}
+
 }
\ No newline at end of file
Index: drools-templates/src/main/java/org/drools/template/model/SnippetBuilder.java
===================================================================
--- drools-templates/src/main/java/org/drools/template/model/SnippetBuilder.java	(revision 33335)
+++ drools-templates/src/main/java/org/drools/template/model/SnippetBuilder.java	(working copy)
@@ -5,6 +5,8 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.drools.template.model.SnippetBuilder.SnippetType.Type;
+
 /*
  * Copyright 2005 JBoss Inc
  * 
@@ -36,13 +38,33 @@
  */
 public class SnippetBuilder {
 
-    private static final String PARAM_PREFIX = "$";
+	protected static class SnippetType {
 
-    private static final String PARAM        = SnippetBuilder.PARAM_PREFIX + "param";
+		protected enum Type {
+			SINGLE, INDEXED, FORALL
+		};
 
+		protected final Type type;
+		protected final String reservedToken;
+
+		protected SnippetType(Type type, String token) {
+			this.type = type;
+			this.reservedToken = token;
+		}
+	}
+
+	public static final String PARAM_PREFIX = "$";
+	public static final String PARAM_SUFFIX = "param";
+	public static final String PARAM_SUFFIX_FORALL = "forall";
+	public static final String PARAM_STRING = PARAM_PREFIX + PARAM_SUFFIX;
+	public static final String PARAM_FORALL_STRING = PARAM_PREFIX
+			+ PARAM_SUFFIX_FORALL;
+	public static final Pattern PARAM_FORALL_REGEXP = Pattern.compile(".*(\\"
+			+ PARAM_FORALL_STRING + "\\((.+)\\))");
+
     private final String        _template;
     
-    private final boolean       single;
+    private final SnippetType   type;
     
     private final Pattern       delimiter;
 
@@ -56,30 +78,58 @@
             throw new RuntimeException( "Script template is null - check for missing script definition." );
         }
         this._template = snippetTemplate;
-        this.single = this._template.indexOf( SnippetBuilder.PARAM_PREFIX + "1" ) < 0;
+        this.type = getType(_template);
         this.delimiter = Pattern.compile( "(.*?[^\\\\])(,|\\z)" );
     }
 
+	private static SnippetType getType(String template) {
+		Matcher forallMatcher = PARAM_FORALL_REGEXP.matcher(template);
+		if (forallMatcher.find())
+			return new SnippetType(SnippetType.Type.FORALL, forallMatcher
+					.group(1));
+		else if (template.indexOf(SnippetBuilder.PARAM_PREFIX + "1") != -1)
+			return new SnippetType(Type.INDEXED, SnippetBuilder.PARAM_PREFIX);
+		return new SnippetType(Type.SINGLE, SnippetBuilder.PARAM_STRING);
+	}
+    
     /**
      * @param cellValue
      *            The value from the cell to populate the snippet with. If no
      *            place holder exists, will just return the snippet.
      * @return The final snippet.
      */
-    public String build(final String cellValue) {
-        if ( single ) {
-            return buildSingle( cellValue );
-        } else {
-            return buildMulti( cellValue );
-        }
-    }
+	public String build(final String cellValue) {
+		switch (type.type) {
+		case FORALL:
+			return buildForAll(cellValue);
+		case INDEXED:
+			return buildMulti(cellValue);
+		default:
+			return buildSingle(cellValue);
+		}
+	}
 
+	private String buildForAll(final String cellValue) {
+		final String[] cellVals = split(cellValue);
+		String result = "";
+		Matcher operatoinTokenMatcher = PARAM_FORALL_REGEXP
+				.matcher(type.reservedToken);
+		operatoinTokenMatcher.find();
+		String operationToken = operatoinTokenMatcher.group(2);
+		for (int paramNumber = 0; paramNumber < cellVals.length; paramNumber++) {
+			result += (paramNumber == 0 ? "" : " " + operationToken + " ")
+					+ replace(_template, type.reservedToken,
+							cellVals[paramNumber].trim(), 256);
+		}
+		return result.equals("") ? _template : result;
+	}
+	
     private String buildMulti(final String cellValue) {
         final String[] cellVals = split( cellValue );
         String result = this._template;
 
         for ( int paramNumber = 0; paramNumber < cellVals.length; paramNumber++ ) {
-            final String replace = SnippetBuilder.PARAM_PREFIX + (paramNumber + 1);
+            final String replace = type.reservedToken + (paramNumber + 1);
             result = replace( result,
                               replace,
                               cellVals[paramNumber].trim(),
@@ -106,7 +156,7 @@
     private String buildSingle(final String cellValue) {
 
         return replace( this._template,
-                        SnippetBuilder.PARAM,
+        				type.reservedToken,
                         cellValue,
                         256 );
 
