+  $self->parts({ map { ($_->id => $_) } @{ $parts } });
+}
+
+sub do_update_sections {
+  my ($self)           = @_;
+
+  my $order            = $self->rs_order->order;
+  my $sections         = $self->requirement_spec->sections_sorted;
+  my %orderitems_by_id = map { ($_->id => $_) } @{ $order->orderitems };
+  my %sections_by_id   = map { ($_->id => $_) } @{ $sections };
+  my $language_id      = $self->requirement_spec->customer->language_id;
+
+  $self->cache_parts(uniq map { $_->order_part_id } @{ $sections });
+
+  my %sections_seen;
+
+  foreach my $attributes (@{ $::form->{orderitems} || [] }) {
+    my $orderitem = $orderitems_by_id{ $attributes->{id}         };
+    my $section   = $sections_by_id{   $attributes->{section_id} };
+    next unless $orderitem && $section;
+
+    $self->create_order_item(section => $section, item => $orderitem, language_id => $language_id)->save;
+    $sections_seen{ $section->id } = 1;
+  }
+
+  my @new_orderitems = map  { $self->create_order_item(section => $_, language_id => $language_id) }
+                       grep { !$sections_seen{ $_->id } }
+                       @{ $sections };
+
+  return @new_orderitems;
+}
+
+sub do_update_additional_parts {
+  my ($self)        = @_;
+
+  my $order         = $self->rs_order->order;
+  my $add_parts     = $self->requirement_spec->parts_sorted;
+  my %orderitems_by = map { (($_->parts_id . '-' . $_->description) => $_) } @{ $order->items };
+  my $language_id   = $self->requirement_spec->customer->language_id;
+
+  $self->cache_parts(uniq map { $_->part_id } @{ $add_parts });
+
+  my %add_part_seen;
+  my @new_orderitems;
+
+  foreach my $add_part (@{ $add_parts }) {
+    my $key       = $add_part->part_id . '-' . $add_part->description;
+    my $orderitem = $orderitems_by{$key};
+
+    if ($orderitem) {
+      $self->create_additional_part_order_item(additional_part => $add_part, item => $orderitem, language_id => $language_id)->save;
+
+    } else {
+      push @new_orderitems, $self->create_additional_part_order_item(additional_part => $add_part, language_id => $language_id);
+    }
+  }
+
+  return @new_orderitems;