diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index 377922192f2dcb675c75a86b09a9d76053f3be54..8bdb428d26bd5a960b21eda9ed3e94b7113d5e82 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -2930,10 +2930,11 @@ class Form
      *    @param    string	$htmlname			HTML field name
      *    @param    int		$maxlength      	Maximum length for labels
      *    @param    int		$excludeafterid 	Exclude all categories after this leaf in category tree.
+     *    @param	int		$outputmode			0=HTML select string, 1=Array
      *    @return	string
      *    @see select_categories
      */
-    function select_all_categories($type, $selected='', $htmlname="parent", $maxlength=64, $excludeafterid=0)
+    function select_all_categories($type, $selected='', $htmlname="parent", $maxlength=64, $excludeafterid=0, $outputmode=0)
     {
         global $langs;
         $langs->load("categories");
@@ -2942,6 +2943,7 @@ class Form
         $cate_arbo = $cat->get_full_arbo($type,$excludeafterid);
 
         $output = '<select class="flat" name="'.$htmlname.'">';
+		$outarray=array();
         if (is_array($cate_arbo))
         {
             if (! count($cate_arbo)) $output.= '<option value="-1" disabled="disabled">'.$langs->trans("NoCategoriesDefined").'</option>';
@@ -2959,12 +2961,16 @@ class Form
                         $add = '';
                     }
                     $output.= '<option '.$add.'value="'.$cate_arbo[$key]['id'].'">'.dol_trunc($cate_arbo[$key]['fulllabel'],$maxlength,'middle').'</option>';
+					
+					$outarray[$cate_arbo[$key]['id']] = $cate_arbo[$key]['fulllabel'];
                 }
             }
         }
         $output.= '</select>';
         $output.= "\n";
-        return $output;
+
+		if ($outputmode) return $outarray;
+		return $output;
     }
 
     /**
diff --git a/htdocs/product/card.php b/htdocs/product/card.php
index 102b86299eb554bb8408c7e0cadc1981a85e13ad..239e351cedb4545218d3e60458da427af53c1f37 100644
--- a/htdocs/product/card.php
+++ b/htdocs/product/card.php
@@ -40,6 +40,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
 require_once DOL_DOCUMENT_ROOT.'/core/class/genericobject.class.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
 if (! empty($conf->propal->enabled))   require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
 if (! empty($conf->facture->enabled))  require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
 if (! empty($conf->commande->enabled)) require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
@@ -271,6 +272,16 @@ if (empty($reshook))
 
             if ($id > 0)
             {
+				// Category association
+				$categories = GETPOST('categories');
+				if(!empty($categories)) {
+					$cat = new Categorie($db);
+					foreach($categories as $id_category) {
+						$cat->fetch($id_category);
+						$cat->add_type($object, 'product');
+					}
+				}
+				
                 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
                 exit;
             }
@@ -349,6 +360,23 @@ if (empty($reshook))
                 {
                     if ($object->update($object->id, $user) > 0)
                     {
+						// Category association
+						// First we delete all categories association
+						$sql  = "DELETE FROM ".MAIN_DB_PREFIX."categorie_product";
+						$sql .= " WHERE fk_product = ".$object->id;
+						$db->query($sql);
+						
+						// Then we add the associated categories
+						$categories = GETPOST('categories');
+						if(!empty($categories)) {
+							$cat = new Categorie($db);
+							
+							foreach($categories as $id_category) {
+								$cat->fetch($id_category);
+								$cat->add_type($object, 'product');
+							}
+						}
+						
                         $action = 'view';
                     }
                     else
@@ -1003,6 +1031,13 @@ else
         $doleditor->Create();
 
         print "</td></tr>";
+
+		// Categories
+		print '<tr><td valign="top">'.$langs->trans("Categories").'</td><td colspan="3">';
+		$cate_arbo = $form->select_all_categories(0, '', 'parent', 64, 0, 1);
+		print $form->multiselectarray('categories', $cate_arbo, $arrayselected, '', 0, '', 0, 250);
+		print "</td></tr>";
+
         print '</table>';
 
         print '<br>';
@@ -1272,6 +1307,18 @@ else
             $doleditor->Create();
 
             print "</td></tr>";
+
+			// Categories
+			print '<tr><td valign="top">'.$langs->trans("Categories").'</td><td colspan="3">';
+			$cate_arbo = $form->select_all_categories(0, '', 'parent', 64, 0, 1);
+			$c = new Categorie($db);
+			$cats = $c->containing($object->id,0);
+			foreach($cats as $cat) {
+				$arrayselected[] = $cat->id;
+			}
+			print $form->multiselectarray('categories', $cate_arbo, $arrayselected, '', 0, '', 0, 250);
+			print "</td></tr>";
+
             print '</table>';
 
             print '<br>';
@@ -1561,6 +1608,19 @@ else
             print '<tr><td valign="top">'.$langs->trans("Note").'</td><td colspan="'.(2+(($showphoto||$showbarcode)?1:0)).'">'.(dol_textishtml($object->note)?$object->note:dol_nl2br($object->note,1,true)).'</td></tr>'."\n";
             print '<!-- End show Note --> '."\n";
 
+			// Categories
+			print '<tr><td valign="top">'.$langs->trans("Categories").'</td><td colspan="3">';
+			$cat = new Categorie($db);
+			$categories = $cat->containing($object->id,0);
+			$catarray = $form->select_all_categories(0, '', 'parent', 64, 0, 1);
+			
+			$toprint = array();
+			foreach($categories as $c) {
+				$toprint[] = $catarray[$c->id];
+			}
+			print implode('<br>', $toprint);
+			print "</td></tr>";
+
             print "</table>\n";
 
             dol_fiche_end();