Index: admin/_charte.php
===================================================================
--- admin/_charte.php	(revision 2501)
+++ admin/_charte.php	(revision 2504)
@@ -31,4 +31,5 @@
 	<script type="text/javascript" src="js/jquery/jquery.js"></script>
 	<script type="text/javascript" src="js/jquery/jquery-ui.custom.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.ui.touch-punch.js"></script>
 	<script type="text/javascript" src="js/jquery/jquery.pageTabs.js"></script>
 	<script type="text/javascript" src="js/jquery/jquery.biscuit.js"></script>
Index: admin/categories.php
===================================================================
--- admin/categories.php	(revision 2464)
+++ admin/categories.php	(revision 2496)
@@ -109,4 +109,5 @@
 	&& $rs->count()>1) {
 		$starting_script .= dcPage::jsLoad('js/jquery/jquery-ui.custom.js');
+		$starting_script .= dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js');
 		$starting_script .= dcPage::jsLoad('js/jquery/jquery.mjs.nestedSortable.js');
 }
Index: admin/js/jquery/jquery.ui.touch-punch.js
===================================================================
--- admin/js/jquery/jquery.ui.touch-punch.js	(revision 2495)
+++ admin/js/jquery/jquery.ui.touch-punch.js	(revision 2495)
@@ -0,0 +1,160 @@
+/*!
+ * jQuery UI Touch Punch 0.2.2
+ *
+ * Copyright 2011, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ *  jquery.ui.widget.js
+ *  jquery.ui.mouse.js
+ */
+(function ($) {
+
+  // Detect touch support
+  $.support.touch = 'ontouchend' in document;
+
+  // Ignore browsers without touch support
+  if (!$.support.touch) {
+    return;
+  }
+
+  var mouseProto = $.ui.mouse.prototype,
+      _mouseInit = mouseProto._mouseInit,
+      touchHandled;
+
+  /**
+   * Simulate a mouse event based on a corresponding touch event
+   * @param {Object} event A touch event
+   * @param {String} simulatedType The corresponding mouse event
+   */
+  function simulateMouseEvent (event, simulatedType) {
+
+    // Ignore multi-touch events
+    if (event.originalEvent.touches.length > 1) {
+      return;
+    }
+
+    event.preventDefault();
+
+    var touch = event.originalEvent.changedTouches[0],
+        simulatedEvent = document.createEvent('MouseEvents');
+    
+    // Initialize the simulated mouse event using the touch event's coordinates
+    simulatedEvent.initMouseEvent(
+      simulatedType,    // type
+      true,             // bubbles                    
+      true,             // cancelable                 
+      window,           // view                       
+      1,                // detail                     
+      touch.screenX,    // screenX                    
+      touch.screenY,    // screenY                    
+      touch.clientX,    // clientX                    
+      touch.clientY,    // clientY                    
+      false,            // ctrlKey                    
+      false,            // altKey                     
+      false,            // shiftKey                   
+      false,            // metaKey                    
+      0,                // button                     
+      null              // relatedTarget              
+    );
+
+    // Dispatch the simulated event to the target element
+    event.target.dispatchEvent(simulatedEvent);
+  }
+
+  /**
+   * Handle the jQuery UI widget's touchstart events
+   * @param {Object} event The widget element's touchstart event
+   */
+  mouseProto._touchStart = function (event) {
+
+    var self = this;
+
+    // Ignore the event if another widget is already being handled
+    if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {
+      return;
+    }
+
+    // Set the flag to prevent other widgets from inheriting the touch event
+    touchHandled = true;
+
+    // Track movement to determine if interaction was a click
+    self._touchMoved = false;
+
+    // Simulate the mouseover event
+    simulateMouseEvent(event, 'mouseover');
+
+    // Simulate the mousemove event
+    simulateMouseEvent(event, 'mousemove');
+
+    // Simulate the mousedown event
+    simulateMouseEvent(event, 'mousedown');
+  };
+
+  /**
+   * Handle the jQuery UI widget's touchmove events
+   * @param {Object} event The document's touchmove event
+   */
+  mouseProto._touchMove = function (event) {
+
+    // Ignore event if not handled
+    if (!touchHandled) {
+      return;
+    }
+
+    // Interaction was not a click
+    this._touchMoved = true;
+
+    // Simulate the mousemove event
+    simulateMouseEvent(event, 'mousemove');
+  };
+
+  /**
+   * Handle the jQuery UI widget's touchend events
+   * @param {Object} event The document's touchend event
+   */
+  mouseProto._touchEnd = function (event) {
+
+    // Ignore event if not handled
+    if (!touchHandled) {
+      return;
+    }
+
+    // Simulate the mouseup event
+    simulateMouseEvent(event, 'mouseup');
+
+    // Simulate the mouseout event
+    simulateMouseEvent(event, 'mouseout');
+
+    // If the touch interaction did not move, it should trigger a click
+    if (!this._touchMoved) {
+
+      // Simulate the click event
+      simulateMouseEvent(event, 'click');
+    }
+
+    // Unset the flag to allow other widgets to inherit the touch event
+    touchHandled = false;
+  };
+
+  /**
+   * A duck punch of the $.ui.mouse _mouseInit method to support touch events.
+   * This method extends the widget with bound touch event handlers that
+   * translate touch events to mouse events and pass them to the widget's
+   * original mouse event handling methods.
+   */
+  mouseProto._mouseInit = function () {
+    
+    var self = this;
+
+    // Delegate the touch handlers to the widget's element
+    self.element
+      .bind('touchstart', $.proxy(self, '_touchStart'))
+      .bind('touchmove', $.proxy(self, '_touchMove'))
+      .bind('touchend', $.proxy(self, '_touchEnd'));
+
+    // Call the original $.ui.mouse init method
+    _mouseInit.call(self);
+  };
+
+})(jQuery);
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 2449)
+++ admin/preferences.php	(revision 2496)
@@ -47,6 +47,6 @@
 $default_tab = !empty($_GET['tab']) ? html::escapeHTML($_GET['tab']) : 'user-profile';
 
-if (!empty($_GET['append']) || !empty($_GET['removed']) || !empty($_GET['neworder']) || 
-	!empty($_GET['replaced']) || !empty($_POST['appendaction']) || !empty($_POST['removeaction']) || 
+if (!empty($_GET['append']) || !empty($_GET['removed']) || !empty($_GET['neworder']) ||
+	!empty($_GET['replaced']) || !empty($_POST['appendaction']) || !empty($_POST['removeaction']) ||
 	!empty($_GET['db-updated'])) {
 	$default_tab = 'user-favorites';
@@ -84,11 +84,11 @@
 	{
 		$pwd_check = !empty($_POST['cur_pwd']) && $core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['cur_pwd']));
-		
+
 		if ($core->auth->allowPassChange() && !$pwd_check && $user_email != $_POST['user_email']) {
 			throw new Exception(__('If you want to change your email or password you must provide your current password.'));
 		}
-		
+
 		$cur = $core->con->openCursor($core->prefix.'user');
-		
+
 		$cur->user_name = $user_name = $_POST['user_name'];
 		$cur->user_firstname = $user_firstname = $_POST['user_firstname'];
@@ -100,5 +100,5 @@
 
 		$cur->user_options = new ArrayObject($user_options);
-		
+
 		if ($core->auth->allowPassChange() && !empty($_POST['new_pwd']))
 		{
@@ -106,21 +106,21 @@
 				throw new Exception(__('If you want to change your email or password you must provide your current password.'));
 			}
-			
+
 			if ($_POST['new_pwd'] != $_POST['new_pwd_c']) {
 				throw new Exception(__("Passwords don't match"));
 			}
-			
+
 			$cur->user_pwd = $_POST['new_pwd'];
 		}
-		
+
 		# --BEHAVIOR-- adminBeforeUserUpdate
 		$core->callBehavior('adminBeforeUserProfileUpdate',$cur,$core->auth->userID());
-		
+
 		# Udate user
 		$core->updUser($core->auth->userID(),$cur);
-		
+
 		# --BEHAVIOR-- adminAfterUserUpdate
 		$core->callBehavior('adminAfterUserProfileUpdate',$cur,$core->auth->userID());
-		
+
 		dcPage::addSuccessNotice(__('Personal information has been successfully updated.'));
 
@@ -134,10 +134,10 @@
 
 # Update user options
-if (isset($_POST['user_post_format'])) 
+if (isset($_POST['user_post_format']))
 {
 	try
 	{
 		$cur = $core->con->openCursor($core->prefix.'user');
-		
+
 		$cur->user_name = $user_name;
 		$cur->user_firstname = $user_firstname;
@@ -149,5 +149,5 @@
 
 		$cur->user_post_status = $user_post_status = $_POST['user_post_status'];
-		
+
 		$user_options['edit_size'] = (integer) $_POST['user_edit_size'];
 		if ($user_options['edit_size'] < 1) {
@@ -156,10 +156,10 @@
 		$user_options['post_format'] = $_POST['user_post_format'];
 		$user_options['enable_wysiwyg'] = !empty($_POST['user_wysiwyg']);
-		
+
 		$cur->user_options = new ArrayObject($user_options);
-		
+
 		# --BEHAVIOR-- adminBeforeUserOptionsUpdate
 		$core->callBehavior('adminBeforeUserOptionsUpdate',$cur,$core->auth->userID());
-		
+
 		# Update user prefs
 		$core->auth->user_prefs->accessibility->put('nodragdrop',!empty($_POST['user_acc_nodragdrop']),'boolean');
@@ -170,11 +170,11 @@
 		}
 		$core->auth->user_prefs->interface->put('media_by_page',(integer)$_POST['user_ui_media_by_page'],'integer');
-		
+
 		# Udate user
 		$core->updUser($core->auth->userID(),$cur);
-		
+
 		# --BEHAVIOR-- adminAfterUserOptionsUpdate
 		$core->callBehavior('adminAfterUserOptionsUpdate',$cur,$core->auth->userID());
-		
+
 		dcPage::addSuccessNotice(__('Personal options has been successfully updated.'));
 		http::redirect('preferences.php#user-options');
@@ -192,5 +192,5 @@
 		# --BEHAVIOR-- adminBeforeUserOptionsUpdate
 		$core->callBehavior('adminBeforeDashboardOptionsUpdate',$core->auth->userID());
-		
+
 		# Update user prefs
 		$core->auth->user_prefs->dashboard->put('doclinks',!empty($_POST['user_dm_doclinks']),'boolean');
@@ -199,8 +199,8 @@
 		$core->auth->user_prefs->interface->put('iconset',(!empty($_POST['user_ui_iconset']) ? $_POST['user_ui_iconset'] : ''));
 		$core->auth->user_prefs->interface->put('nofavmenu',empty($_POST['user_ui_nofavmenu']),'boolean');
-		
+
 		# --BEHAVIOR-- adminAfterUserOptionsUpdate
 		$core->callBehavior('adminAfterDashboardOptionsUpdate',$core->auth->userID());
-		
+
 		dcPage::addSuccessNotice(__('Dashboard options has been successfully updated.'));
 		http::redirect('preferences.php#user-favorites');
@@ -213,5 +213,5 @@
 
 # Add selected favorites
-if (!empty($_POST['appendaction'])) 
+if (!empty($_POST['appendaction']))
 {
 	try {
@@ -280,5 +280,5 @@
 			unset($order[$k]);
 		}
-	}	
+	}
 	$core->favs->setFavoriteIDs($order,false);
 	if (!$core->error->flag()) {
@@ -305,4 +305,5 @@
 	($user_acc_nodragdrop ? '' : dcPage::jsLoad('js/_preferences-dragdrop.js')).
 	dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+	dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
 	dcPage::jsLoad('js/jquery/jquery.pwstrength.js').
 		'<script type="text/javascript">'."\n".
@@ -320,5 +321,5 @@
 	dcPage::jsPageTabs($default_tab).
 	dcPage::jsConfirmClose('user-form').
-	
+
 	# --BEHAVIOR-- adminPreferencesHeaders
 	$core->callBehavior('adminPreferencesHeaders'),
@@ -386,5 +387,5 @@
 	echo
 	'<h4 class="vertical-separator pretty-title">'.__('Change my password').'</h4>'.
-	
+
 	'<div class="pw-table">'.
 	'<p class="pw-cell"><label for="new_pwd">'.__('New password:').'</label>'.
@@ -395,8 +396,8 @@
 	'</div>'.
 	'</div>'.
-	
+
 	'<p><label for="new_pwd_c">'.__('Confirm new password:').'</label>'.
 	form::password('new_pwd_c',20,255).'</p>'.
-	
+
 	'<p><label for="cur_pwd">'.__('Your current password:').'</label>'.
 	form::password('cur_pwd',20,255).'</p>'.
@@ -589,5 +590,5 @@
 
 if (count($iconsets_combo) > 1) {
-	echo 
+	echo
 		'<div class="fieldset">'.
 		'<h4>'.__('Dashboard icons').'</h4>'.
Index: inc/core/class.dc.namespace.php
===================================================================
--- inc/core/class.dc.namespace.php	(revision 1179)
+++ inc/core/class.dc.namespace.php	(revision 2505)
@@ -22,14 +22,14 @@
 	protected $table;		///< <b>string</b> Settings table name
 	protected $blog_id;		///< <b>string</b> Blog ID
-	
+
 	protected $global_settings = array();	///< <b>array</b> Global settings array
 	protected $local_settings = array();	///< <b>array</b> Local settings array
 	protected $settings = array();		///< <b>array</b> Associative settings array
 	protected $ns;			///< <b>string</b> Current namespace
-	
+
 	/**
 	Object constructor. Retrieves blog settings and puts them in $settings
 	array. Local (blog) settings have a highest priority than global settings.
-	
+
 	@param	name		<b>string</b>		ID for this namespace
 	*/
@@ -41,14 +41,14 @@
 			throw new Exception(sprintf(__('Invalid setting dcNamespace: %s'),$name));
 		}
-		
+
 		$this->con =& $core->con;
 		$this->table = $core->prefix.'setting';
 		$this->blog_id =& $blog_id;
-		
+
 		$this->getSettings($rs);
 	}
-	
+
 	private function getSettings($rs=null)
-	{	
+	{
 		if ($rs == null) {
 			$strReq = 'SELECT blog_id, setting_id, setting_value, '.
@@ -59,5 +59,5 @@
 					"AND setting_ns = '".$this->con->escape($this->ns)."' ".
 					'ORDER BY setting_id DESC ';
-		
+
 			try {
 				$rs = $this->con->select($strReq);
@@ -74,5 +74,5 @@
 			$value = $rs->f('setting_value');
 			$type = $rs->f('setting_type');
-			
+
 			if ($type == 'float' || $type == 'double') {
 				$type = 'float';
@@ -80,9 +80,9 @@
 				$type = 'string';
 			}
-			
+
 			settype($value,$type);
-			
+
 			$array = $rs->blog_id ? 'local' : 'global';
-			
+
 			$this->{$array.'_settings'}[$id] = array(
 				'ns' => $this->ns,
@@ -93,14 +93,14 @@
 			);
 		}
-		
+
 		$this->settings = $this->global_settings;
-		
+
 		foreach ($this->local_settings as $id => $v) {
 			$this->settings[$id] = $v;
 		}
-		
+
 		return true;
 	}
-	
+
 	private function settingExists($id,$global=false)
 	{
@@ -108,8 +108,8 @@
 		return isset($this->{$array.'_settings'}[$id]);
 	}
-	
+
 	/**
 	Returns setting value if exists.
-	
+
 	@param	n		<b>string</b>		Setting name
 	@return	<b>mixed</b>
@@ -120,8 +120,38 @@
 			return $this->settings[$n]['value'];
 		}
-		
+
 		return null;
 	}
-	
+
+	/**
+	Returns global setting value if exists.
+
+	@param	n		<b>string</b>		setting name
+	@return	<b>mixed</b>
+	*/
+	public function getGlobal($n)
+	{
+		if (isset($this->global_settings[$n]['value'])) {
+			return $this->global_settings[$n]['value'];
+		}
+
+		return null;
+	}
+
+	/**
+	Returns local setting value if exists.
+
+	@param	n		<b>string</b>		setting name
+	@return	<b>mixed</b>
+	*/
+	public function getLocal($n)
+	{
+		if (isset($this->local_settings[$n]['value'])) {
+			return $this->local_settings[$n]['value'];
+		}
+
+		return null;
+	}
+
 	/**
 	Magic __get method.
@@ -132,9 +162,9 @@
 		return $this->get($n);
 	}
-	
+
 	/**
 	Sets a setting in $settings property. This sets the setting for script
 	execution time only and if setting exists.
-	
+
 	@param	n		<b>string</b>		Setting name
 	@param	v		<b>mixed</b>		Setting value
@@ -146,5 +176,5 @@
 		}
 	}
-	
+
 	/**
 	Magic __set method.
@@ -155,14 +185,14 @@
 		$this->set($n,$v);
 	}
-	
+
 	/**
 	Creates or updates a setting.
-	
+
 	$type could be 'string', 'integer', 'float', 'boolean' or null. If $type is
 	null and setting exists, it will keep current setting type.
-	
+
 	$value_change allow you to not change setting. Useful if you need to change
 	a setting label or type and don't want to change its value.
-	
+
 	@param	id			<b>string</b>		Setting ID
 	@param	value		<b>mixed</b>		Setting value
@@ -177,5 +207,5 @@
 			throw new Exception(sprintf(__('%s is not a valid setting id'),$id));
 		}
-		
+
 		# We don't want to change setting value
 		if (!$value_change)
@@ -187,5 +217,5 @@
 			}
 		}
-		
+
 		# Setting type
 		if ($type == 'double')
@@ -207,5 +237,5 @@
 			$type = 'string';
 		}
-		
+
 		# We don't change label
 		if ($label == null)
@@ -217,12 +247,12 @@
 			}
 		}
-		
+
 		settype($value,$type);
-		
+
 		$cur = $this->con->openCursor($this->table);
 		$cur->setting_value = ($type == 'boolean') ? (string) (integer) $value : (string) $value;
 		$cur->setting_type = $type;
 		$cur->setting_label = $label;
-		
+
 		#If we are local, compare to global value
 		if (!$global && $this->settingExists($id,true))
@@ -231,5 +261,5 @@
 			$same_setting = $g['ns'] == $this->ns && $g['value'] == $value
 			&& $g['type'] == $type && $g['label'] == $label;
-			
+
 			# Drop setting if same value as global
 			if ($same_setting && $this->settingExists($id,false)) {
@@ -239,5 +269,5 @@
 			}
 		}
-		
+
 		if ($this->settingExists($id,$global) && $this->ns == $this->settings[$id]['ns'])
 		{
@@ -247,5 +277,5 @@
 				$where = "WHERE blog_id = '".$this->con->escape($this->blog_id)."' ";
 			}
-			
+
 			$cur->update($where."AND setting_id = '".$this->con->escape($id)."' AND setting_ns = '".$this->con->escape($this->ns)."' ");
 		}
@@ -255,5 +285,5 @@
 			$cur->blog_id = $global ? null : $this->blog_id;
 			$cur->setting_ns = $this->ns;
-			
+
 			$cur->insert();
 		}
@@ -272,5 +302,5 @@
 			throw new Exception(__('No namespace specified'));
 		}
-		
+
 		if (!array_key_exists($oldId,$this->settings) || array_key_exists($newId,$this->settings)) {
 			return false;
@@ -291,6 +321,6 @@
 
 	/**
-	Removes an existing setting in a Namespace 
-	
+	Removes an existing setting in a Namespace
+
 	@param	id		<b>string</b>		Setting ID
 	*/
@@ -300,7 +330,7 @@
 			throw new Exception(__('No namespace specified'));
 		}
-		
+
 		$strReq =	'DELETE FROM '.$this->table.' ';
-		
+
 		if ($this->blog_id === null) {
 			$strReq .= 'WHERE blog_id IS NULL ';
@@ -308,14 +338,14 @@
 			$strReq .= "WHERE blog_id = '".$this->con->escape($this->blog_id)."' ";
 		}
-		
+
 		$strReq .= "AND setting_id = '".$this->con->escape($id)."' ";
 		$strReq .= "AND setting_ns = '".$this->con->escape($this->ns)."' ";
-		
+
 		$this->con->execute($strReq);
 	}
-	
-	/**
-	Removes all existing settings in a Namespace 
-	
+
+	/**
+	Removes all existing settings in a Namespace
+
 	@param	force_global	<b>boolean</b>	Force global pref drop
 	*/
@@ -325,7 +355,7 @@
 			throw new Exception(__('No namespace specified'));
 		}
-		
+
 		$strReq =	'DELETE FROM '.$this->table.' ';
-		
+
 		if (($force_global) || ($this->blog_id === null)) {
 			$strReq .= 'WHERE blog_id IS NULL ';
@@ -335,20 +365,20 @@
 			$global = false;
 		}
-		
+
 		$strReq .= "AND setting_ns = '".$this->con->escape($this->ns)."' ";
-		
+
 		$this->con->execute($strReq);
-		
+
 		$array = $global ? 'global' : 'local';
 		unset($this->{$array.'_settings'});
 		$this->{$array.'_settings'} = array();
-		
+
 		$array = $global ? 'local' : 'global';
 		$this->settings = $this->{$array.'_settings'};
 	}
-	
+
 	/**
 	Returns $settings property content.
-	
+
 	@return	<b>array</b>
 	*/
@@ -357,8 +387,8 @@
 		return $this->settings;
 	}
-	
+
 	/**
 	Returns $global_settings property content.
-	
+
 	@return	<b>array</b>
 	*/
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 2492)
+++ inc/prepend.php	(revision 2496)
@@ -135,5 +135,5 @@
 # Constants
 define('DC_ROOT',path::real(dirname(__FILE__).'/..'));
-define('DC_VERSION','2.6-RC');
+define('DC_VERSION','2.7-dev');
 define('DC_DIGESTS',dirname(__FILE__).'/digests');
 define('DC_L10N_ROOT',dirname(__FILE__).'/../locales');
Index: plugins/antispam/index.php
===================================================================
--- plugins/antispam/index.php	(revision 2322)
+++ plugins/antispam/index.php	(revision 2495)
@@ -117,4 +117,5 @@
 	echo
 		dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+		dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
 		dcPage::jsLoad('index.php?pf=antispam/antispam.js');
   }
Index: plugins/blogroll/index.php
===================================================================
--- plugins/blogroll/index.php	(revision 2256)
+++ plugins/blogroll/index.php	(revision 2495)
@@ -27,5 +27,5 @@
 {
 	$default_tab = 'import-links';
-	
+
 	try
 	{
@@ -35,5 +35,5 @@
 			throw new Exception(__('Unable to move uploaded file.'));
 		}
-		
+
 		require_once dirname(__FILE__).'/class.dc.importblogroll.php';
 		try {
@@ -44,6 +44,6 @@
 			throw $e;
 		}
-		
-		
+
+
 		if (empty($imported)) {
 			unset($imported);
@@ -69,12 +69,12 @@
 		}
 	}
-	
+
 	dcPage::addSuccessNotice(__('links have been successfully imported.'));
-	http::redirect($p_url);	
+	http::redirect($p_url);
 }
 
 if (!empty($_POST['cancel_import'])) {
 	$core->error->add(__('Import operation cancelled.'));
-	$default_tab = 'import-links';	
+	$default_tab = 'import-links';
 }
 
@@ -86,5 +86,5 @@
 	$link_desc = $_POST['link_desc'];
 	$link_lang = $_POST['link_lang'];
-	
+
 	try {
 		$blogroll->addLink($link_title,$link_href,$link_desc,$link_lang);
@@ -102,5 +102,5 @@
 {
 	$cat_title = $_POST['cat_title'];
-	
+
 	try {
 		$blogroll->addCategory($cat_title);
@@ -124,5 +124,5 @@
 		}
 	}
-	
+
 	if (!$core->error->flag()) {
 		dcPage::addSuccessNotice(__('Items have been successfully removed.'));
@@ -145,5 +145,5 @@
 	foreach ($order as $pos => $l) {
 		$pos = ((integer) $pos)+1;
-		
+
 		try {
 			$blogroll->updateOrder($l,$pos);
@@ -152,5 +152,5 @@
 		}
 	}
-	
+
 	if (!$core->error->flag()) {
 		dcPage::addSuccessNotice(__('Items order has been successfully updated'));
@@ -172,9 +172,10 @@
   <title><?php echo __('Blogroll'); ?></title>
   <?php echo dcPage::jsConfirmClose('links-form','add-link-form','add-category-form'); ?>
-  <?php 
+  <?php
 	$core->auth->user_prefs->addWorkspace('accessibility');
 	if (!$core->auth->user_prefs->accessibility->nodragdrop) {
 	echo
 		dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+		dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
 		dcPage::jsLoad('index.php?pf=blogroll/blogroll.js');
 	}
@@ -213,11 +214,11 @@
 {
 	$position = (string) $rs->index()+1;
-	
+
 	echo
 	'<tr class="line" id="l_'.$rs->link_id.'">'.
 	'<td class="handle minimal">'.form::field(array('order['.$rs->link_id.']'),2,5,$position,'position','',false,'title="'.__('position').'"').'</td>'.
 	'<td class="minimal">'.form::checkbox(array('remove[]'),$rs->link_id,'','','',false,'title="'.__('select this link').'"').'</td>';
-	
-	
+
+
 	if ($rs->is_cat)
 	{
@@ -235,5 +236,5 @@
 		'<td>'.html::escapeHTML($rs->link_lang).'</td>';
 	}
-	
+
 	echo '</tr>';
 }
@@ -245,5 +246,5 @@
 <p class="col">
 <?php
-	echo 
+	echo
 	form::hidden('links_order','').
 	form::hidden(array('p'),'blogroll').
@@ -252,5 +253,5 @@
 <input type="submit" name="saveorder" value="<?php echo __('Save order'); ?>" /></p>
 <p class="col right"><input type="submit" class="delete" name="removeaction"
-	 value="<?php echo __('Delete selected links'); ?>" 
+	 value="<?php echo __('Delete selected links'); ?>"
 	 onclick="return window.confirm('
 	 <?php echo html::escapeJS(__('Are you sure you want to delete selected links?')); ?>');" /></p>
@@ -330,5 +331,5 @@
 		'<th>'.__('Description').'</th>'.
 		'</tr>';
-		
+
 		$i = 0;
 		foreach ($imported as $entry) {
@@ -336,6 +337,6 @@
 			$title = html::escapeHTML($entry->title);
 			$desc  = html::escapeHTML($entry->desc);
-			
-			echo 
+
+			echo
 			'<tr><td>'.form::checkbox(array('entries[]'),$i,'','','').'</td>'.
 			'<td nowrap><a href="'.$url.'">'.$title.'</a>'.
@@ -345,5 +346,5 @@
 			'<td>'.$desc.
 			'<input type="hidden" name="desc['.$i.']" value="'.$desc.'" />'.
-			'</td></tr>'."\n";			
+			'</td></tr>'."\n";
 			$i++;
 		}
@@ -352,5 +353,5 @@
 		'<div class="two-cols">'.
 		'<p class="col checkboxes-helpers"></p>'.
-		
+
 		'<p class="col right">'.
 		form::hidden(array('p'),'blogroll').
Index: plugins/pages/list.php
===================================================================
--- plugins/pages/list.php	(revision 2442)
+++ plugins/pages/list.php	(revision 2496)
@@ -55,5 +55,7 @@
   <title><?php echo __('Pages'); ?></title>
   <?php
-  	echo dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+  	echo
+  		dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+		dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
 		dcPage::jsLoad('index.php?pf=pages/list.js').
 		'<script type="text/javascript">'.
@@ -89,10 +91,10 @@
 	$post_list->display($page,$nb_per_page,
 	'<form action="plugin.php" method="post" id="form-entries">'.
-	
+
 	'%s'.
-	
+
 	'<div class="two-cols">'.
 	'<p class="col checkboxes-helpers"></p>'.
-	
+
 	'<p class="col right"><label for="action" class="classic">'.__('Selected pages action:').'</label> '.
 	form::combo('action',$pages_actions_page->getCombo()).
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 2455)
+++ plugins/simpleMenu/index.php	(revision 2496)
@@ -347,4 +347,5 @@
 			echo
 				dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+				dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
 				dcPage::jsLoad('index.php?pf=simpleMenu/simplemenu.js');
 		}
Index: plugins/widgets/index.php
===================================================================
--- plugins/widgets/index.php	(revision 2509)
+++ plugins/widgets/index.php	(revision 2520)
@@ -218,4 +218,5 @@
 		echo
 			dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+			dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
 			dcPage::jsLoad('index.php?pf=widgets/widgets.js');
   ?>
@@ -366,5 +367,5 @@
 		$altUp = $i == 0 ? ' alt=""' : ' alt="'.__('Up the widget').'"';
 		$altDown = $i == count($widgets->elements())-1 ? ' alt=""' : ' alt="'.__('Down the widget').'"';
-
+		
 		$iname = 'w['.$pr.']['.$i.']';
 
Index: themes/ductile/_prepend.php
===================================================================
--- themes/ductile/_prepend.php	(revision 1133)
+++ themes/ductile/_prepend.php	(revision 2495)
@@ -26,5 +26,6 @@
 		if (!$core->auth->user_prefs->accessibility->nodragdrop) {
 			echo
-				dcPage::jsLoad('js/jquery/jquery-ui.custom.js');
+				dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+				dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js');
 				echo <<<EOT
 <script type="text/javascript">
