diff --git a/application/modules/admin/controllers/CustomFieldsController.php b/application/modules/admin/controllers/CustomFieldsController.php
index 87b6c05d188d312607042ffb3786391e462f8e55..9414769c51b3a6e5f9c6ae62db756acb1aeaeea6 100644
--- a/application/modules/admin/controllers/CustomFieldsController.php
+++ b/application/modules/admin/controllers/CustomFieldsController.php
@@ -84,17 +84,11 @@
 	 public function valuesAction() {
 		 $model = Class_CustomField_Model::getModel($this->_getParam('model'));
 		 $model_values = $model->find($model_id = $this->_getParam('id'));
+		 $form = (new ZendAfi_Form_Admin_CustomFields_ModelValues(['model_values' => $model_values]));
 
-		 if ($this->_request->isPost()) {
-			 $datas = $this->_request->getPost();
-			 foreach ($datas as $key => $value) {
-				 list($prefix, $custom_field_id) = explode('_', $key);
-				 if (!$value_object = $model_values->getValueObject($custom_field_id))
-					 $value_object = Class_CustomField_Value::newInstance([
-						 'custom_field_id' => $custom_field_id,
-						 'model_id' => $model_id]);
-				 $value_object->setValue($value)->save();
-			 }
+		 if ($this->_request->isPost() && $form->isValid($this->_request->getPost())){
+			 $form->updateModelValues();
+			 $model_values->save();
 
 			 $this->_helper->notify($this->_('Valeurs des champs personnalisés sauvegardés'));
 			 $this->_redirect('/admin/custom-fields/values/model/'.$this->_getParam('model').'/id/'.$model_id);
@@ -103,13 +97,12 @@
 		 if (empty($model_values->getFields()))
 			 $this->view->error_message = $this->_('Aucun champ personnalisé n\'a été défini');
 			 
-		 $this->view->titre = $this->view->_(
-			 'Champs personnalisés: %s "%s"', 
-			 strtolower($model->getLabel()),
-			 $model_values->getLabel());
+		 $this->view->titre = $this->view->_('Champs personnalisés: %s "%s"', 
+																				 strtolower($model->getLabel()),
+																				 $model_values->getLabel());
 
-		 $this->view->form = new ZendAfi_Form_Admin_CustomFields_ModelValues(['model_values' => $model_values]);
+		 $this->view->form = $form;
 
 	 }
 }
-?>
\ No newline at end of file
+?>
diff --git a/library/Class/CustomField/ModelValues.php b/library/Class/CustomField/ModelValues.php
index 6f256a2c591ab0cf0f9453a63c1fdffa6b7c6ba0..47271a88677731c4151e9afd104b2ed5484cd66b 100644
--- a/library/Class/CustomField/ModelValues.php
+++ b/library/Class/CustomField/ModelValues.php
@@ -23,7 +23,8 @@
 class Class_CustomField_ModelValues {
 	protected 
 		$_real_instance,
-		$_model;
+		$_model,
+		$_values;
 
 	public function __construct($real_instance, $model) {
 		$this->_real_instance = $real_instance; // ex: instance of Class_Article, Class_UserGroup
@@ -48,15 +49,35 @@ class Class_CustomField_ModelValues {
 	}
 
 
-	public function getValueObject($custom_field_id) {
-		return Class_CustomField_Value::findFirstBy(['custom_field_id' => $custom_field_id,
-																								 'model_id' => $this->_real_instance->getId()]);
+	public function setFieldValue($custom_field_id, $value) {
+		$instance = $this->getFieldValues()[$custom_field_id];
+		$instance->setValue($value);
+		return $this;
 	}
 
 
-	public function getValue($custom_field_id) {
-		$value = $this->getValueObject($custom_field_id);
-		return $value ? $value->getValue() : null;
+	public function getFieldValues() {
+		if (isset($this->_values))
+			return $this->_values;
+
+		$fields = $this->getFields();
+		$model_id = $this->_real_instance->getId();
+
+		$values = [];
+		foreach($fields as $field) {
+			$custom_field_id = $field->getId();
+			$values[$custom_field_id] = Class_CustomField_Value::findOrCreate($model_id, $custom_field_id);
+		}
+
+		return $this->_values = $values;
+	}
+
+
+	public function save() {
+		$values = $this->getFieldValues();
+		foreach($values as $value)
+			$value->save();
+		return $this;
 	}
 }
-?>
\ No newline at end of file
+?>
diff --git a/library/Class/CustomField/Value.php b/library/Class/CustomField/Value.php
index a7491e5d32c300373db38824c9ea715b1ca62ce9..1dbaa916387e70d0f37253e3d9d260fba4b77d10 100644
--- a/library/Class/CustomField/Value.php
+++ b/library/Class/CustomField/Value.php
@@ -19,11 +19,39 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301	 USA 
  */
 
+class Class_CustomField_ValueLoader extends Storm_Model_Loader {
+	public function findOrCreate($model_id, $custom_field_id) {
+		$instance = Class_CustomField_Value::findFirstBy(['model_id' => $model_id,
+																											'custom_field_id' => $custom_field_id]);
+
+		return $instance 
+			? $instance
+			: Class_CustomField_Value::newInstance(['model_id' => $model_id,
+																							'custom_field_id' => $custom_field_id]);
+	}
+}
+
+
+
 
 class Class_CustomField_Value extends Storm_Model_Abstract {
 	protected 
 		$_table_name = 'custom_field_values',
+		$_loader_class = 'Class_CustomField_ValueLoader',
 		$_belongs_to = ['field' => ['model' => 'Class_CustomField',
-																'referenced_in' => 'custom_field_id']];
+																'referenced_in' => 'custom_field_id']],
+		$_default_attribute_values = ['value' => ''];
+
+	public function getFieldType() {
+		return $this->getField()->getFieldType();
+	}
+
+	public function getLabel() {
+		return $this->getField()->getLabel();
+	}
+
+	public function getOptionsListAsArray() {
+		return $this->getField()->getOptionsListAsArray();
+	}
 }
-?>
\ No newline at end of file
+?>
diff --git a/library/ZendAfi/Form.php b/library/ZendAfi/Form.php
index 4b95a5c3d37ddf61b2a97ffa28b34f46b0b13f08..f19ea2d349b5db2f0add0897775ab93cb6b2777e 100644
--- a/library/ZendAfi/Form.php
+++ b/library/ZendAfi/Form.php
@@ -107,4 +107,6 @@ class ZendAfi_Form extends Zend_Form {
 		return $this;
 	}
 
-}
\ No newline at end of file
+}
+
+?>
\ No newline at end of file
diff --git a/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php b/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php
index b521e050176aca39b6a91c192608d11f6f942601..5fc831bd011ba5c97a2209068938c795a78b7f13 100644
--- a/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php
+++ b/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php
@@ -21,6 +21,8 @@
 
 
 class ZendAfi_Form_Admin_CustomFields_ModelValues extends ZendAfi_Form {
+	const FIELD_PREFIX = 'field_';
+
 	protected 
 		$_model_values;
 
@@ -32,23 +34,28 @@ class ZendAfi_Form_Admin_CustomFields_ModelValues extends ZendAfi_Form {
 
 	public function init() {
 		parent::init();
-
-		if (!$fields = $this->_model_values->getFields())
+		if (!$values = $this->_model_values->getFieldValues())
 			return;
 
 		$field_names = [];
-		foreach($fields as $field) {
-			$field_name = 'field_'.$field->getId();
-			$field_names []= $field_name;
-			$field_strategy = 'Field_Strategy_'.$field->getFieldType();
-			(new $field_strategy($this))->addElement($field,
-																							 $field_name,
-																							 $this->_model_values->getValue($field->getId()));
+		foreach($values as $value) {
+			$field_names []= $field_name = self::FIELD_PREFIX.$value->getCustomFieldId();
+			Field_Strategy::strategyForValue($this, $value)->addElement($value,
+																																	$field_name,
+																																	$value->getValue());
 		}
 
-		$this->addDisplayGroup($field_names,
-													 'custom_fields',
-													 []);
+		$this->addDisplayGroup($field_names, 'custom_fields', []);
+	}
+
+
+	public function updateModelValues() {
+		$values = parent::getValues();
+
+		foreach($values as $field_name => $value) {
+			$custom_field_id = str_replace(self::FIELD_PREFIX, '', $field_name);
+			$this->_model_values->setFieldValue($custom_field_id, $value);
+		}
 	}
 }
 
@@ -58,6 +65,11 @@ class Field_Strategy {
 	protected $_form,
 		$_field;
 
+	public static function strategyForValue($form, $value) {
+		$field_strategy = 'Field_Strategy_'.$value->getFieldType();
+		return new $field_strategy($form);
+	}
+
 	public function __construct($form) {
 		$this->_form = $form;
 	}