diff --git a/addons/sale/sale_analytic.py b/addons/sale/sale_analytic.py
index 4741e1a572843deae1a1c77f1f901e731eb8b433..b28de1ad0a998997a35b5ea79764e7340b04614d 100644
--- a/addons/sale/sale_analytic.py
+++ b/addons/sale/sale_analytic.py
@@ -12,7 +12,7 @@ class SaleOrderLine(models.Model):
     def _compute_analytic(self, domain=None):
         lines = {}
         if not domain:
-            domain = [('so_line', 'in', self.ids), ('amount', '<=', 0.0)]
+            domain = [('so_line', 'in', self.ids), ('unit_amount', '<=', 0.0)]
         data = self.env['account.analytic.line'].read_group(
             domain,
             ['so_line', 'unit_amount', 'product_uom_id'], ['product_uom_id', 'so_line'], lazy=False
diff --git a/addons/sale_timesheet/models/sale_timesheet.py b/addons/sale_timesheet/models/sale_timesheet.py
index bcbb2b88f4866f19953869f252fe0caa1074029f..0d9c8a21f3915d15b5706cae9d5f25f74702ea73 100644
--- a/addons/sale_timesheet/models/sale_timesheet.py
+++ b/addons/sale_timesheet/models/sale_timesheet.py
@@ -56,10 +56,7 @@ class AccountAnalyticLine(models.Model):
                     ('product_id.type', '=', 'service')],
                     limit=1)
             if sol:
-                result.update({
-                    'so_line': sol.id,
-                    'product_id': sol.product_id.id,
-                })
+                result['so_line'] = sol.id
                 result = self._get_timesheet_cost(result)
 
         result = super(AccountAnalyticLine, self)._get_sale_order_line(vals=result)
@@ -70,33 +67,17 @@ class AccountAnalyticLine(models.Model):
         if result.get('is_timesheet') or self.is_timesheet:
             if result.get('amount'):
                 return result
-
             unit_amount = result.get('unit_amount', 0.0) or self.unit_amount
-            user_id = result.get('user_id', False) or self.user_id.id
+            user_id = result.get('user_id') or self.user_id.id
+            user = self.env['res.users'].browse([user_id])
             emp = self.env['hr.employee'].search([('user_id', '=', user_id)], limit=1)
-
-            if emp and emp.timesheet_cost:
-                # Most common case: cost obtained on employee
-                result.update({
-                    'amount': -unit_amount * emp.timesheet_cost,
-                    'product_uom_id': emp.user_id.company_id.project_time_mode_id.id,
-                })
-            elif result.get('product_id'):
-                # Only useful for _get_sale_order_line since it can add a product_id.
-                product = self.env['product.product'].browse([result.get('product_id')])
-                result.update({
-                    'amount': -unit_amount * product.standard_price,
-                    'product_uom_id': product.uom_id.id,
-                })
-            elif self.product_id:
-                # Only use case where this should be useful:
-                #    - no cost on employee
-                #    - modification of the unit amount of an existing entry
-                result.update({
-                    'amount': -unit_amount * self.product_id.standard_price,
-                    'product_uom_id': self.product_id.uom_id.id,
-                })
-
+            cost = emp and emp.timesheet_cost or 0.0
+            uom = (emp or user).company_id.project_time_mode_id
+            # Nominal employee cost = 1 * company project UoM (project_time_mode_id)
+            result.update(
+                amount=(-unit_amount * emp.timesheet_cost),
+                product_uom_id=uom.id
+            )
         return result
 
     @api.multi
@@ -174,7 +155,7 @@ class SaleOrderLine(models.Model):
     @api.multi
     def _compute_analytic(self, domain=None):
         if not domain:
-            domain = [('so_line', 'in', self.ids), '|', ('amount', '<=', 0.0), ('is_timesheet', '=', True)]
+            domain = [('so_line', 'in', self.ids), '|', ('unit_amount', '<=', 0.0), ('is_timesheet', '=', True)]
         return super(SaleOrderLine, self)._compute_analytic(domain=domain)
 
     @api.model