diff --git a/application/modules/admin/controllers/ProfilController.php b/application/modules/admin/controllers/ProfilController.php
index dbe2e1efad95feb3010d85656bd3f828e1810044..f2180abaabece5a16c063b2281c81c72895fdd3d 100644
--- a/application/modules/admin/controllers/ProfilController.php
+++ b/application/modules/admin/controllers/ProfilController.php
@@ -39,7 +39,7 @@ class Admin_ProfilController extends Zend_Controller_Action {
 		if (!$this->_profil = Class_Profil::getLoader()->find($id_profil_param)) {
 			if (!in_array(
 							$this->_request->getActionName(),
-							array('index', 'redirect-to-index', 'add', 'genres'))
+							array('index', 'redirect-to-index', 'add', 'genres', 'module-sort'))
 			) {
 				$this->_forward('redirect-to-index');
 				return;
@@ -468,6 +468,19 @@ class Admin_ProfilController extends Zend_Controller_Action {
 	}
 
 
+	public function moduleSortAction() {
+		$this->getHelper('ViewRenderer')->setNoRender();
+		if (!$profil = Class_Profil::getLoader()->find($this->_getParam('profil')))
+			return;
+
+		$profil->moveModuleOldDivPosNewDivPos($this->_getParam('fromDivision'), 
+																					$this->_getParam('fromPosition'), 
+																					$this->_getParam('toDivision'), 
+																					$this->_getParam('toPosition'));
+		$profil->save();
+	}
+
+
 	public function deleteAction()	{
 		$profil = Class_Profil::getLoader()->find($this->id_profil);
 		$profil->delete();
diff --git a/application/modules/opac/views/scripts/head.phtml b/application/modules/opac/views/scripts/head.phtml
index 31cd53b33ee403272ed9404d2b1f044422599348..22d6082ab34a516a728cb5128247a86d118739d2 100644
--- a/application/modules/opac/views/scripts/head.phtml
+++ b/application/modules/opac/views/scripts/head.phtml
@@ -30,6 +30,39 @@ $head_scripts = Class_ScriptLoader::newInstance()
 	->addJQueryReady('setupAnchorsTarget()')
 	->showNotifications();
 
+
+if (($user = Class_Users::getLoader()->getIdentity())
+		&& $user->isAdmin())
+	$head_scripts->addJQueryReady('
+    var currentPositions = [0, 0, 0];
+    $("div.layout-division>div>div").each(function(k, item) {
+      var division = $(item).parents("div.layout-division").attr("id").split("-").pop();
+      $(item).attr("data-position", currentPositions[division-1]);
+      currentPositions[division-1]++;
+      $(item).attr("data-division", division);
+    });
+
+    $("div.layout-division>div").sortable({
+      cursor:"move",
+      connectWith:"div.layout-division>div",
+      stop: function(event, ui){
+        var newDivision = $(ui.item).parents("div.layout-division").attr("id").split("-").pop();
+        var newPosition = $(ui.item).prevAll().length;
+        if (newDivision == $(ui.item).attr("data-division")
+            && newPosition == $(ui.item).attr("data-position")) 
+          return;
+
+        $.ajax("' . $this->url(array('module' => 'admin',
+																					'controller' => 'profil',
+																					'action' => 'module-sort'), null, true) . '",
+               {data: {fromDivision: $(ui.item).attr("data-division"),
+                      toDivision: newDivision,
+                      fromPosition: $(ui.item).attr("data-position"),
+                      toPosition: newPosition,
+                      profil:' . $current_profil->getId() . '}});
+      }});
+  ');
+
 if (file_exists(PATH_SKIN.'/css/bib.css'))
 	$head_scripts->addSkinStyleSheet('bib');
 
diff --git a/application/modules/opac/views/scripts/portail.phtml b/application/modules/opac/views/scripts/portail.phtml
index 678986e142ca3bb9689579a60529b163f2da255d..ab316447f23eaba88d65fd0008db472ce3f8f0f9 100644
--- a/application/modules/opac/views/scripts/portail.phtml
+++ b/application/modules/opac/views/scripts/portail.phtml
@@ -2,38 +2,34 @@
 ob_start();
 echo '<body '.$this->bodyParam.'>';
 ?>
-
-
 <div id="site_web_wrapper" style="width:<?php echo $this->profil->getLargeurSite(); ?>px; margin-left:auto; margin-right:auto">
-	<div class="siteWeb portail_background_img">
-		<div id="site_web_content">
-
-			<?php	echo $this->partial("banniere.phtml", array("profil" => $this->profil));	?>	
-
-			<div id="col_wrapper">
-				<?php
-					switch ($this->profil->getNbDivisions()) {
-					case 1:
-					echo $this->division($this->profil, 1, 'colContenu');
-					break;
-
-					case 2:
-					echo $this->division($this->profil, 1, 'colGauche');
-					echo $this->division($this->profil, 2, 'colContenu');
-					break;
-
-					case 3:
-					echo '<div id="right_col_color">';
-					echo $this->division($this->profil, 1, 'colGauche');
-					echo $this->division($this->profil, 2, 'colMilieu');
-					echo $this->division($this->profil, 3, 'colDroite');
-					echo '</div>';
-					break;
-					}
-				?>
-				<div class="clear"></div>
-			</div> <!-- col_wrapper -->
-		</div> <!-- site_web_content -->
+<div class="siteWeb portail_background_img">
+	<div id="site_web_content">
+		<?php	echo $this->partial("banniere.phtml", array("profil" => $this->profil));	?>	
+		<div id="col_wrapper">
+			<?php
+	switch ($this->profil->getNbDivisions()) {
+	case 1:
+		echo $this->division($this->profil, 1, 'colContenu');
+		break;
+
+	case 2:
+		echo $this->division($this->profil, 1, 'colGauche');
+		echo $this->division($this->profil, 2, 'colContenu');
+		break;
+
+	case 3:
+		echo '<div id="right_col_color">';
+		echo $this->division($this->profil, 1, 'colGauche');
+		echo $this->division($this->profil, 2, 'colMilieu');
+		echo $this->division($this->profil, 3, 'colDroite');
+		echo '</div>';
+		break;
+	}
+			?>
+			<div class="clear"></div>
+		</div> <!-- col_wrapper -->
+	</div> <!-- site_web_content -->
 </div> <!-- siteWeb -->
 
 
diff --git a/library/Class/Profil.php b/library/Class/Profil.php
index 1758ea9f4e016aab8502e6c89def811ba2e38928..abbb36c202742c13f4beb104c4bc7bbed9b70458 100644
--- a/library/Class/Profil.php
+++ b/library/Class/Profil.php
@@ -1214,7 +1214,7 @@ class Class_Profil extends Storm_Model_Abstract {
 		$i = 0;
 		foreach($cfg_accueil['modules'] as $module_id => $module) {
 			if ($i == $new_pos)
-				$new_modules[$id] = $module;
+				$new_modules[$id] = $moved_module;
 			$new_modules[$module_id] = $module;
 			$i++;
 		}
diff --git a/library/ZendAfi/View/Helper/Division.php b/library/ZendAfi/View/Helper/Division.php
index f2d6e1519c43d477e994d3c4fa04968186ef9901..9c48821f1b2578833360eff7e31de0d56e49505b 100644
--- a/library/ZendAfi/View/Helper/Division.php
+++ b/library/ZendAfi/View/Helper/Division.php
@@ -24,7 +24,7 @@
 
 class ZendAfi_View_Helper_Division extends ZendAfi_View_Helper_BaseHelper {
 	public function division($profil, $division, $html_id, $content=null) {
-		$width = $profil->_get('largeur_division'.$division);
+		$width = $profil->_get('largeur_division' . $division);
 		if ($html_id == "colContenu"  and  $profil->getNbDivisions() == 3)
 			$width += $profil->getLargeurDivision3();
 
@@ -32,8 +32,6 @@ class ZendAfi_View_Helper_Division extends ZendAfi_View_Helper_BaseHelper {
 		$style = "float:left;overflow:hidden;width:".$width."px;max-width:".$width."px";
 		$style_inner = "padding-left:".$marge."px;padding-right:".$marge."px";
 
-		$template_div = '<div class="%1$s" style="%2$s"><div id="%1$sInner" style="%3$s">%4$s %5$s</div></div>';
-
 		$barre_nav = '';
 		if (in_array($html_id, array('colContenu', 'colMilieu'))	and ($profil->getBarreNavOn()))
 			$barre_nav = $this->view->barreNav();
@@ -43,7 +41,10 @@ class ZendAfi_View_Helper_Division extends ZendAfi_View_Helper_BaseHelper {
 			$content = $boites[$division];
 		}
 
-		return sprintf($template_div, $html_id, $style, $style_inner, $barre_nav, $content);
+		return sprintf('<div class="%1$s layout-division" id="layout-division-%6$s" style="%2$s">
+                      <div id="%1$sInner" style="%3$s">%4$s %5$s</div>
+                   </div>', 
+									 $html_id, $style, $style_inner, $barre_nav, $content, $division);
 	}
 }