Index: test/unit/validator/sfValidatorAndTest.php
===================================================================
--- test/unit/validator/sfValidatorAndTest.php	(revision 10367)
+++ test/unit/validator/sfValidatorAndTest.php	(working copy)
@@ -10,7 +10,7 @@
 
 require_once(dirname(__FILE__).'/../../bootstrap/unit.php');
 
-$t = new lime_test(16, new lime_output_color());
+$t = new lime_test(18, new lime_output_color());
 
 $v1 = new sfValidatorString(array('max_length' => 3));
 $v2 = new sfValidatorString(array('min_length' => 3));
@@ -48,6 +48,18 @@
 
 try
 {
+  $v->clean(null);
+  $t->fail('->clean() throws an sfValidatorError exception if any child validators are required');
+  $t->skip('', 1);
+}
+catch (sfValidatorErrorSchema $e)
+{
+  $t->pass('->clean() throws an sfValidatorError exception if any child validators are required');
+  $t->is($e->getCode(), 'required required', '->clean() throws a sfValidatorErrorErrorSchema');
+}
+
+try
+{
   $v->setOption('required', true);
   $v->clean(null);
   $t->fail('->clean() throws an sfValidatorError exception if the input value is required');
Index: lib/validator/sfValidatorAnd.class.php
===================================================================
--- lib/validator/sfValidatorAnd.class.php	(revision 10367)
+++ lib/validator/sfValidatorAnd.class.php	(working copy)
@@ -93,6 +93,27 @@
   /**
    * @see sfValidatorBase
    */
+  public function clean($value)
+  {
+    $clean = $value;
+
+    if ($this->options['trim'] && is_string($value))
+    {
+      $value = trim($value);
+    }
+    
+    // empty value?
+    if ($this->isEmpty($clean) && $this->options['required'])
+    {
+      throw new sfValidatorError($this, 'required');
+    }
+
+    return $this->doClean($value);
+  }
+
+  /**
+   * @see sfValidatorBase
+   */
   protected function doClean($value)
   {
     $clean = $value;
