diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp
index e4a5c7b42..1036844d7 100644
--- a/src/libslic3r/Arrange.cpp
+++ b/src/libslic3r/Arrange.cpp
@@ -309,7 +309,7 @@ protected:
 public:
     AutoArranger(const TBin &                  bin,
                  const ArrangeParams           &params,
-                 std::function<void(unsigned)> progressind,
+                 std::function<void(unsigned, unsigned /*bins*/)> progressind,
                  std::function<bool(void)>     stopcond)
         : m_pck(bin, params.min_obj_distance)
         , m_bin(bin)
@@ -348,7 +348,9 @@ public:
         
         m_pconf.object_function = get_objfn();
         
-        if (progressind) m_pck.progressIndicator(progressind);
+        if (progressind) m_pck.progressIndicator([this, &progressind](unsigned rem) {
+            progressind(rem, m_pck.lastResult().size() - 1);
+        });
         if (stopcond) m_pck.stopCondition(stopcond);
         
         m_pck.configure(m_pconf);
@@ -462,7 +464,7 @@ void _arrange(
         std::vector<Item> &           excludes,
         const BinT &                  bin,
         const ArrangeParams           &params,
-        std::function<void(unsigned)> progressfn,
+        std::function<void(unsigned, unsigned)> progressfn,
         std::function<bool()>         stopfn)
 {
     // Integer ceiling the min distance from the bed perimeters
diff --git a/src/libslic3r/Arrange.hpp b/src/libslic3r/Arrange.hpp
index 65c3984d5..69511e7ec 100644
--- a/src/libslic3r/Arrange.hpp
+++ b/src/libslic3r/Arrange.hpp
@@ -74,7 +74,7 @@ struct ArrangeParams {
     
     /// The accuracy of optimization.
     /// Goes from 0.0 to 1.0 and scales performance as well
-    float accuracy = 0.65f;
+    float accuracy = 1.f;
     
     /// Allow parallel execution.
     bool parallel = true;
@@ -83,7 +83,8 @@ struct ArrangeParams {
     
     /// Progress indicator callback called when an object gets packed. 
     /// The unsigned argument is the number of items remaining to pack.
-    std::function<void(unsigned)> progressind;
+    /// Second is the current bed idx being filled.
+    std::function<void(unsigned, unsigned /*bed_idx*/)> progressind;
     
     /// A predicate returning true if abort is needed.
     std::function<bool(void)>     stopcondition;
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index 2ae852dbd..e55c5fa8c 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -3892,7 +3892,7 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x)
         settings_changed = true;
     }
 
-    if (imgui->checkbox(_(L("Enable rotations")), settings.enable_rotation)) {
+    if (imgui->checkbox(_(L("Enable rotations (slow)")), settings.enable_rotation)) {
         m_arrange_settings.enable_rotation = settings.enable_rotation;
         settings_changed = true;
     }
diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp
index 7a8c21365..7af0b4703 100644
--- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp
+++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp
@@ -158,14 +158,14 @@ void ArrangeJob::process()
     params.stopcondition = [this]() { return was_canceled(); };
     
     try {
-        params.progressind = [this, count](unsigned st) {
+        params.progressind = [this, count](unsigned st, unsigned) {
             st += m_unprintable.size();
             if (st > 0) update_status(int(count - st), arrangestr);
         };
         
         arrangement::arrange(m_selected, m_unselected, bedpts, params);
         
-        params.progressind = [this, count](unsigned st) {
+        params.progressind = [this, count](unsigned st, unsigned) {
             if (st > 0) update_status(int(count - st), arrangestr);
         };
         
diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp
index 060528006..9c959ff16 100644
--- a/src/slic3r/GUI/Jobs/FillBedJob.cpp
+++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp
@@ -90,9 +90,13 @@ void FillBedJob::process()
     params.min_obj_distance = scaled(settings.distance);
     params.allow_rotations  = settings.enable_rotation;
 
-    params.stopcondition = [this]() { return was_canceled(); };
+    unsigned curr_bed = 0;
+    params.stopcondition = [this, &curr_bed]() {
+        return was_canceled() || curr_bed > 0;
+    };
 
-    params.progressind = [this](unsigned st) {
+    params.progressind = [this, &curr_bed](unsigned st, unsigned bed) {
+        curr_bed = bed;
         if (st > 0)
             update_status(int(m_status_range - st), _(L("Filling bed")));
     };