Index: lib/HTML/FormFu.pm
===================================================================
--- lib/HTML/FormFu.pm	(revision 1341)
+++ lib/HTML/FormFu.pm	(working copy)
@@ -177,17 +177,40 @@
 }
 
 sub default_values {
-    my ( $self, $default_ref ) = @_;
+    my ( $self, $data ) = @_;
+	my $elements = $self->get_elements;
+	foreach my $element ( @{$elements}) {
+		my $name = $element->name;
+		$name =~ s/_\d+$//;
+		if($element->isa('HTML::FormFu::Element::Repeatable')) {
+			my $k = scalar @{$data->{$name}};
+			$element->repeat($k);
+			my $childs = $element->get_elements;
+			for(my $i = 0; $i < $k; $i++) {
+				default_values($childs->[$i], $data->{$name}->[$i]);
+			}
+		} elsif($element->isa('HTML::FormFu::Element::Multi')) {
+			ref $data->{$name} eq "HASH"
+			? default_values($element, $data->{$name})
+			: $element->default( $data->{$name});
+		} elsif($element->isa('HTML::FormFu::Element::Block')) {
+				default_values($element, $name ? $data->{$name} : $data);
+		} else {	
+			next if !defined $data->{$name};
+			$element->default( $data->{$name} );
+		}
+		
+		
+	}
 
-    for my $field ( @{ $self->get_fields } ) {
-        my $name = $field->nested_name;
-        next if !defined $name;
-        next if !exists $default_ref->{$name};
+	return $self;
 
-        $field->default( $default_ref->{$name} );
-    }
+}
 
-    return $self;
+sub _default_values {
+	my ($self, $elements, $data) = @_;
+
+	
 }
 
 sub model {
Index: t/form/default_values.t
===================================================================
--- t/form/default_values.t	(revision 1341)
+++ t/form/default_values.t	(working copy)
@@ -1,24 +1,117 @@
 use strict;
 use warnings;
 
-use Test::More tests => 3;
+use Test::More tests => 16;
 
 use HTML::FormFu;
 
-my $form = HTML::FormFu->new({ tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } });
+my $form = HTML::FormFu->new(
+    { tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } } );
 
 $form->element('Text')->name('foo');
 
 $form->element('Checkbox')->name('bar')->value('y');
 
-$form->default_values( {
-        foo => 'x',
-        bar => 'y',
-    } );
+$form->auto_fieldset(1);
 
+$form->populate(
+    {
+        elements => [
+            {
+                type     => "Repeatable",
+                name     => "many",
+                elements => [
+                    { name => "id" },
+                    {
+                        type     => "Block",
+                        name     => "nested",
+                        elements => [ { type => "Text", name => "foo" } ]
+                    }
+                ]
+            },
+            {
+                type    => "Select",
+                name    => "single-select",
+                options => [ [qw(1 foo)], [qw(2 bar)] ]
+            },
+            {
+                type    => "Select",
+                name    => "multi-select",
+                options => [ [qw(1 foo)], [qw(2 bar)] ]
+            },
+            {
+                type     => "Block",
+                name     => "nested",
+                elements => [ { type => "Text", name => "foo" } ]
+            },
+            {
+                type     => "Multi",
+                name     => "address",
+                elements => [ { name => "street" }, { name => "number" } ]
+            },
+            {
+                type     => "Multi",
+                name     => "address-split",
+                elements => [ { name => "street" }, { name => "number" } ],
+                deflators => [ { type => "CompoundSplit" } ]
+            }, { type => "SimpleTable", rows => [[{name => "table1"}]]}
+        ]
+    }
+);
+
+$form->default_values(
+    {
+        foo  => 'x',
+        bar  => 'y',
+        many => [
+            { id => 1, nested => { foo => "bar" } },
+            { id => 2, nested => { foo => "baz" } }
+        ],
+        'single-select' => 1,
+        'multi-select'  => [ 1, 2 ],
+        nested          => { foo => "bar" },
+        address         => { street => "Lombardstreet", number => 22 },
+        'address-split'   => "Lombardstreet 22",
+		table1 => "test"
+    }
+);
+
 $form->process;
 
 like( $form->get_field('foo'), qr/value="x"/ );
 
 like( $form->get_field('bar'), qr/value="y"/ );
 like( $form->get_field('bar'), qr/checked="checked"/ );
+
+like( $form->get_field('single-select'), qr/value="1" selected="selected"/ );
+like( $form->get_field('single-select'), qr/value="2">/ );
+
+like( $form->get_field('multi-select'), qr/value="1" selected="selected"/ );
+like( $form->get_field('multi-select'), qr/value="2" selected="selected"/ );
+
+like( $form->get_field('address'), qr/name="address.street" type="text" value="Lombardstreet"/ );
+like( $form->get_field('address'), qr/name="address.number" type="text" value="22"/ );
+
+like( $form->get_field('address-split'), qr/name="address-split.street" type="text" value="Lombardstreet"/ );
+like( $form->get_field('address-split'), qr/name="address-split.number" type="text" value="22"/ );
+
+like( $form->get_field('table1'), qr/name="table1" type="text" value="test"/);
+
+
+like(
+    $form->get_all_element( { name => 'many' } ),
+    qr/name="id_1" type="text" value="1"/
+);
+like(
+    $form->get_all_element( { name => 'many' } ),
+    qr/name="id_2" type="text" value="2"/
+);
+like(
+    $form->get_all_element( { name => 'many' } ),
+    qr/name="foo_1" type="text" value="bar"/
+);
+like(
+    $form->get_all_element( { name => 'many' } ),
+    qr/name="foo_2" type="text" value="baz"/
+);
+
