-    // now add a picker div after the original input
-    var popup_button = $('<span>').addClass('ppp_popup_button');
-    $dummy.after(popup_button);
-    popup_button.click(open_dialog);
-
-    var pp = {
-      real:              function() { return $real },
-      dummy:             function() { return $dummy },
-      part_type:         function() { return $part_type },
-      classification_id: function() { return $classification_id },
-      unit:              function() { return $unit },
-      convertible_unit:  function() { return $convertible_unit },
-      update_results: update_results,
-      result_timer:   result_timer,
-      set_item:       set_item,
-      reset:          make_defined_state,
-      is_defined_state: function() { return state == STATES.PICKED },
-      init_results:    function () {
-        $('div.part_picker_part').each(function(){
-          $(this).click(function(){
-            set_item({
-              id:   $(this).children('input.part_picker_id').val(),
-              name: $(this).children('input.part_picker_description').val(),
-              classification_id: $(this).children('input.part_picker_classification_id').val(),
-              unit: $(this).children('input.part_picker_unit').val(),
-              partnumber:  $(this).children('input.part_picker_partnumber').val(),
-              description: $(this).children('input.part_picker_description').val(),
-            });
-            close_popup();
-            $dummy.focus();
-            return true;
+  ns.PickerPopup.prototype = {
+    open_dialog: function() {
+      var self = this;
+      kivi.popup_dialog({
+        url: 'controller.pl?action=Part/part_picker_search',
+        data: self.pp.ajax_data(this.pp.$dummy.val()),
+        id: 'part_selection',
+        dialog: {
+          title: kivi.t8('Part picker'),
+          width: 800,
+          height: 800,
+        },
+        load: function() { self.init_search(); }
+      });
+      window.clearTimeout(this.timer);
+      return true;
+    },
+    init_search: function() {
+      var self = this;
+      $('#part_picker_filter').keypress(function(e) { self.result_timer(e) }).focus();
+      $('#no_paginate').change(function() { self.update_results() });
+      this.update_results();
+    },
+    update_results: function() {
+      var self = this;
+      $.ajax({
+        url: 'controller.pl?action=Part/part_picker_result',
+        data: $.extend({
+          no_paginate: $('#no_paginate').prop('checked') ? 1 : 0,
+        }, self.pp.ajax_data(function(){
+          var val = $('#part_picker_filter').val();
+          return val === undefined ? '' : val
+        })),
+        success: function(data){
+          $('#part_picker_result').html(data);
+          self.init_results();
+        }
+      });
+    },
+    init_results: function() {
+      var self = this;
+      $('div.part_picker_part').each(function(){
+        $(this).click(function(){
+          self.pp.set_item({
+            id:   $(this).children('input.part_picker_id').val(),
+            name: $(this).children('input.part_picker_description').val(),
+            classification_id: $(this).children('input.part_picker_classification_id').val(),
+            ean:  $(this).children('input.part_picker_ean').val(),
+            unit: $(this).children('input.part_picker_unit').val(),
+            partnumber:  $(this).children('input.part_picker_partnumber').val(),
+            description: $(this).children('input.part_picker_description').val(),