diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index d6ca16fd275d820592f6a08cfe58c91ba93824fa..4ad9658bf26900ce309c2880002aef3035713e81 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -4358,8 +4358,8 @@ class stock_pack_operation(osv.osv):
         'product_id': fields.many2one('product.product', 'Product', ondelete="CASCADE"),  # 1
         'product_uom_id': fields.many2one('product.uom', 'Unit of Measure'),
         'product_qty': fields.float('To Do', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
-        'qty_done': fields.float('Processed', digits_compute=dp.get_precision('Product Unit of Measure')),
-        'processed_boolean': fields.function(_get_bool, fnct_inv=_set_processed_qty, type='boolean', string='Processed'),
+        'qty_done': fields.float('Done', digits_compute=dp.get_precision('Product Unit of Measure')),
+        'processed_boolean': fields.function(_get_bool, fnct_inv=_set_processed_qty, type='boolean', string='Done'),
         'package_id': fields.many2one('stock.quant.package', 'Source Package'),  # 2
         'pack_lot_ids': fields.one2many('stock.pack.operation.lot', 'operation_id', 'Lots Used'),
         'result_package_id': fields.many2one('stock.quant.package', 'Destination Package', help="If set, the operations are packed into this package", required=False, ondelete='cascade'),
@@ -4486,23 +4486,28 @@ class stock_pack_operation_lot(osv.osv):
     _name = "stock.pack.operation.lot"
     _description = "Specifies lot/serial number for pack operations that need it"
 
-    def _get_processed(self, cr, uid, ids, field_name, arg, context=None):
+    def _get_plus(self, cr, uid, ids, field_name, arg, context=None):
         res = {}
         for packlot in self.browse(cr, uid, ids, context=context):
-            res[packlot.id] = (packlot.qty > 0.0)
+            if packlot.operation_id.product_id.tracking == 'serial':
+                res[packlot.id] = (packlot.qty == 0.0)
+            else:
+                res[packlot.id] = (packlot.qty_todo == 0.0) or (packlot.qty < packlot.qty_todo)
         return res
 
     _columns = {
         'operation_id': fields.many2one('stock.pack.operation'),
-        'qty': fields.float('Quantity'),
+        'qty': fields.float('Done'),
         'lot_id': fields.many2one('stock.production.lot', 'Lot/Serial Number'),
         'lot_name': fields.char('Lot Name'),
-        'qty_todo': fields.float('Quantity'),
-        'processed': fields.function(_get_processed,  type='boolean', store={'stock.pack.operation.lot': (lambda self, cr, uid, ids ,c={}:ids, ['qty'], 10)}),
+        'qty_todo': fields.float('To Do'),
+        'plus_visible': fields.function(_get_plus, type='boolean'),
     }
 
     _defaults = {
         'qty': lambda cr, uid, ids, c: 1.0,
+        'qty_todo': lambda cr, uid, ids, c: 0.0,
+        'plus_visible': True,
     }
 
     def _check_lot(self, cr, uid, ids, context=None):
@@ -4525,12 +4530,14 @@ class stock_pack_operation_lot(osv.osv):
     def do_plus(self, cr, uid, ids, context=None):
         for packlot in self.browse(cr, uid, ids, context=context):
             self.write(cr, uid, [packlot.id], {'qty': packlot.qty + 1}, context=context)
+            self.pool['stock.pack.operation'].write(cr, uid, [packlot.operation_id.id], {'qty_done': packlot.operation_id.qty_done + 1}, context=context)
         pack = self.browse(cr, uid, ids[0], context=context).operation_id.id
         return self.pool['stock.pack.operation'].split_lot(cr, uid, [pack], context=context)
 
     def do_minus(self, cr, uid, ids, context=None):
         for packlot in self.browse(cr, uid, ids, context=context):
             self.write(cr, uid, [packlot.id], {'qty': packlot.qty - 1}, context=context)
+            self.pool['stock.pack.operation'].write(cr, uid, [packlot.operation_id.id], {'qty_done': packlot.operation_id.qty_done - 1}, context=context)
         pack = self.browse(cr, uid, ids[0], context=context).operation_id.id
         return self.pool['stock.pack.operation'].split_lot(cr, uid, [pack], context=context)
 
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index 64c2393f7c50052deda9cbe9c606beb5688ed4cc..ddb813d6db5fc21926fbabb0279689ed403b52f0 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -757,16 +757,16 @@
                     </group>
                     <group>
                         <field name="pack_lot_ids" nolabel="1" attrs="{'readonly': [('state', '=', 'done')]}">
-                            <tree editable="bottom" decoration-success="qty_todo==qty">
+                            <tree editable="bottom" decoration-success="qty_todo==qty" decoration-danger="(qty_todo &gt; 0) and (qty&gt;qty_todo)">
                                 <field name="lot_name" invisible="not context.get('only_create', False)"/>
                                 <field name="lot_id" invisible="context.get('only_create', False)"
                                        domain="[('product_id','=', parent.product_id)]"
                                        context="{'product_id': parent.product_id}"/>
-                                <field name="qty" invisible="context.get('serial') and context.get('only_create')"/>
+                                <field name="qty_todo" invisible="not context.get('show_reserved') or context.get('serial')" readonly="1"/>
+                                <field name="qty" invisible="context.get('serial')"/>
                                 <button name="do_minus" type="object" icon="fa-minus-square" attrs="{'invisible': [('qty', '&lt;=', 0.99)]}" invisible="not context.get('show_reserved')"/>
-                                <button name="do_plus" type="object" icon="fa-plus-square" invisible="not context.get('show_reserved')"/>
-                                <field name="qty_todo" invisible="not context.get('show_reserved') or context.get('serial')" readonly="1" string="To Do"/>
-                                <field name="processed" invisible="1"/>
+                                <button name="do_plus" type="object" icon="fa-plus-square" attrs="{'invisible': [('plus_visible', '=', False)]}" invisible="not context.get('show_reserved')"/>
+                                <field name="plus_visible" invisible="1"/>
                             </tree>
                         </field>
                     </group>
@@ -843,10 +843,10 @@
                                     <field name="to_loc" groups="stock.group_locations,stock.group_tracking_lot"/>
                                     <field name="result_package_id" groups="stock.group_tracking_lot" context="{'location_id': location_dest_id}" invisible="1"/>
                                     <field name="state" invisible="1"/>
+                                    <field name="product_qty" readonly="1" attrs="{'required': [('product_id', '!=', False)]}"/>
                                     <field name="qty_done" attrs="{'readonly': [('lots_visible', '=', True)]}"/>
                                     <button name="split_lot" string="Lot Split" type="object" icon="fa-list" groups="stock.group_production_lot"
                                             attrs="{'invisible': ['|', ('lots_visible', '=', False), ('state', 'not in', ['confirmed', 'assigned', 'waiting', 'partially_available','done'])]}"/>
-                                    <field name="product_qty" readonly="1" attrs="{'required': [('product_id', '!=', False)]}"/>
                                     <button name="show_details" string="Modify" type="object" icon="fa-pencil" groups="stock.group_locations"
                                             states="confirmed,assigned,waiting,partially_available"/>
                                 </tree>