diff --git a/interface/lib/classes/tpl.inc.php b/interface/lib/classes/tpl.inc.php
index 4b411e2c3caaed3975bef8a94a3daf0de565c50a..a8533bb8ed45227829041c59266607682d8ce499 100644
--- a/interface/lib/classes/tpl.inc.php
+++ b/interface/lib/classes/tpl.inc.php
@@ -864,7 +864,7 @@ if (!defined('vlibTemplateClassLoaded')) {
 
 				$regex = '/(<|<\/|{|{\/|<!--|<!--\/){1}\s*';
 				$regex.= 'tmpl_([\w]+)\s*';
-				$regex.= '(?:';
+				$regex.= '((?:(?:';
 				$regex.=    '(?:';
 				$regex.=        '(name|format|escape|op|value|file)';
 				$regex.=        '\s*=\s*';
@@ -873,30 +873,10 @@ if (!defined('vlibTemplateClassLoaded')) {
 				$regex.=    '((?<=[\"\'])';
 				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
 				$regex.=    '[\"\']?';
-				$regex.= ')?\s*';
-				$regex.= '(?:';
-				$regex.=    '(?:';
-				$regex.=        '(name|format|escape|op|value)';
-				$regex.=        '\s*=\s*';
-				$regex.=    ')';
-				$regex.=    '(?:[\"\'])?';
-				$regex.=    '((?<=[\"\'])';
-				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
-				$regex.=    '[\"\']?';
-				$regex.= ')?\s*';
-				$regex.= '(?:';
-				$regex.=    '(?:';
-				$regex.=        '(name|format|escape|op|value)';
-				$regex.=        '\s*=\s*';
-				$regex.=    ')';
-				$regex.=    '(?:[\"\'])?';
-				$regex.=    '((?<=[\"\'])';
-				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
-				$regex.=    '[\"\']?';
-				$regex.= ')?\s*';
+				$regex.= ')?\s*)*?)';
 				$regex.= '(?:>|\/>|}|-->){1}';
-				$regex.= '([\r\n|\n|\r])?/i';
-				$data = preg_replace_callback($regex, array($this, _parseTag), $data);
+				$regex.= '/i';
+				$data = preg_replace_callback($regex, array($this, '_parseTag'), $data);
 
 				if ($this->_cache) { // add cache if need be
 					$this->_createCache($data);
@@ -1026,8 +1006,7 @@ if (!defined('vlibTemplateClassLoaded')) {
 		 * @access private
 		 * @return string used for eval'ing
 		 */
-		private function _parseIf($varname, $value = null, $op = null, $namespace = null)
-		{
+		function _parseIf ($varname, $value=null, $op=null, $namespace=null, $format=null) {
 			if (isset($namespace)) $namespace = substr($namespace, 0, -1);
 			$comp_str = ''; // used for extended if statements
 
@@ -1065,9 +1044,19 @@ if (!defined('vlibTemplateClassLoaded')) {
 				}
 			}
 			if ($this->OPTIONS['GLOBAL_VARS'] && empty($namespace)) {
-				return '(('.$retstr.'[\''.$varname.'\'] !== null) ? '.$retstr.'[\''.$varname.'\'] : $this->_vars[\''.$varname.'\'])'.$comp_str;
-			} else {
-				return $retstr."['".$varname."']".$comp_str;
+				$retstr = '(('.$retstr.'[\''.$varname.'\'] !== null) ? '.$retstr.'[\''.$varname.'\'] : $this->_vars[\''.$varname.'\'])';
+				if(isset($format) && isset($value) && $format == 'version') {
+					return 'version_compare(' . $retstr . ', \'' . $value . '\', ' . (!empty($op) ? $op : '==') . ')';
+				} else {
+					return $retstr.$comp_str;
+				}
+			}
+			else {
+				if(isset($format) && isset($value) && $format == 'version') {
+					return 'version_compare(' . $retstr."['".$varname."']" . ', \'' . $value . '\', ' . (!empty($op) ? $op : '==') . ')';
+				} else {
+					return $retstr."['".$varname."']".$comp_str;
+				}
 			}
 		}
 
@@ -1186,28 +1175,38 @@ if (!defined('vlibTemplateClassLoaded')) {
 			$wholetag = $args[0];
 			$openclose = $args[1];
 			$tag = strtolower($args[2]);
-			$newline = $args[9];
-
-			if ($tag == 'else') return '<?php } else { ?>'.$newline;
+			
+			if ($tag == 'else') return '<?php } else { ?>';
 			if ($tag == 'tmpl_include') return $wholetag; // ignore tmpl_include tags
 
 			if (preg_match("/^<\/|{\/|<!--\/$/s", $openclose) || preg_match("/^end[if|loop|unless|comment]$/", $tag)) {
 				if ($tag == 'loop' || $tag == 'endloop') array_pop($this->_namespace);
 				if ($tag == 'comment' || $tag == 'endcomment') {
-					return '<?php */ ?>'.$newline;
-				} else {
-					return '<?php } ?>'.$newline;
+					return '<?php */ ?>';
+				}
+				else {
+					return '<?php } ?>';
 				}
 			}
 
-			//* arrange attributes
-			for ($i=3; $i < 8; $i=($i+2)) {
-				if (empty($args[$i]) && empty($args[($i+1)])) break;
-				$key = (empty($args[$i])) ? 'name' : strtolower($args[$i]);
-				if ($key == 'name' && preg_match('/^(php)?include$/', $tag)) $key = 'file';
-				$$key = $args[($i+1)];
+			// arrange attributes
+			$tmp_atts = $args[3];
+			$atts = preg_split('/\s+/', $tmp_atts);
+			foreach($atts as $att) {
+				$regex =    '/(?:';
+				$regex.=        '(name|format|escape|op|value|file)';
+				$regex.=        '\s*=\s*';
+				$regex.=    ')?';
+				$regex.=    '(?:[\"\'])?';
+				$regex.=    '((?<=[\"\'])';
+				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
+				$regex.=    '[\"\']?/';
+				if(preg_match($regex, $att, $match)) {
+					$key = (empty($match[1])) ? 'name' : strtolower($match[1]);
+					if ($key == 'name' && preg_match('/^(php)?include$/', $tag)) $key = 'file';
+					$$key = $match[2];
+				}
 			}
-
 			$var = ($this->OPTIONS['CASELESS']) ? strtolower($name) : $name;
 
 			if ($this->_debug && !empty($var)) {
@@ -1229,37 +1228,47 @@ if (!defined('vlibTemplateClassLoaded')) {
 				if (empty($escape) && (!empty($this->OPTIONS['DEFAULT_ESCAPE']) && strtolower($this->OPTIONS['DEFAULT_ESCAPE']) != 'none')) {
 					$escape = strtolower($this->OPTIONS['DEFAULT_ESCAPE']);
 				}
-				return '<?php '.$this->_parseVar ($wholetag, $tag, $var, @$escape, @$format, @$namespace)." ?>$newline";
+				return '<?php '.$this->_parseVar ($wholetag, $tag, $var, @$escape, @$format, @$namespace).' ?>'."\n";
+				break;
 
 			case 'if':
-				return '<?php if ('. $this->_parseIf($var, @$value, @$op, @$namespace) .') { ?>'.$newline;
+				return '<?php if ('. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>';
+				break;
 
 			case 'unless':
-				return '<?php if (!'. $this->_parseIf($var, @$value, @$op, @$namespace) .') { ?>'.$newline;
+				return '<?php if (!'. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>';
+				break;
 
 			case 'elseif':
-				return '<?php } elseif ('. $this->_parseIf($var, @$value, @$op, @$namespace) .') { ?>'.$newline;
+				return '<?php } elseif ('. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>';
+				break;
 
 			case 'loop':
-				return '<?php '. $this->_parseLoop($var) .'?>'.$newline;
+				return '<?php '. $this->_parseLoop($var) .'?>';
+				break;
 
 			case 'comment':
 				if (empty($var)) { // full open/close style comment
-					return '<?php /* ?>'.$newline;
-				} else { // just ignore tag if it was a one line comment
+					return '<?php /* ?>';
+				}
+				else { // just ignore tag if it was a one line comment
 					return;
 				}
+				break;
 
 			case 'phpinclude':
 				if ($this->OPTIONS['ENABLE_PHPINCLUDE']) {
-					return '<?php include(\''.$file.'\'); ?>'.$newline;
+					return '<?php include(\''.$file.'\'); ?>';
 				}
+				break;
 
 			case 'include':
 				return '<?php $this->_getData($this->_fileSearch(\''.$file.'\'), 1); ?>';
+				break;
 
 			case 'dyninclude':
 				return '<?php $this->_getData($this->_fileSearch($this->_dyninclude[\''.$name.'\']), 1); ?>';
+				break;
 
 			default:
 				if ($this->OPTIONS['STRICT']) vlibTemplateError::raiseError('VT_ERROR_INVALID_TAG', KILL, htmlspecialchars($wholetag, ENT_QUOTES));
diff --git a/server/lib/classes/tpl.inc.php b/server/lib/classes/tpl.inc.php
index 6dc49132a370a0fb514556f08caa48ddffbb2567..2a91b0654b957e2765e818615a24f7dcc1c16117 100644
--- a/server/lib/classes/tpl.inc.php
+++ b/server/lib/classes/tpl.inc.php
@@ -932,7 +932,7 @@ if (!defined('vlibTemplateClassLoaded')) {
 
 				$regex = '/(<|<\/|{|{\/|<!--|<!--\/){1}\s*';
 				$regex.= 'tmpl_([\w]+)\s*';
-				$regex.= '(?:';
+				$regex.= '((?:(?:';
 				$regex.=    '(?:';
 				$regex.=        '(name|format|escape|op|value|file)';
 				$regex.=        '\s*=\s*';
@@ -941,40 +941,9 @@ if (!defined('vlibTemplateClassLoaded')) {
 				$regex.=    '((?<=[\"\'])';
 				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
 				$regex.=    '[\"\']?';
-				$regex.= ')?\s*';
-				$regex.= '(?:';
-				$regex.=    '(?:';
-				$regex.=        '(name|format|escape|op|value)';
-				$regex.=        '\s*=\s*';
-				$regex.=    ')';
-				$regex.=    '(?:[\"\'])?';
-				$regex.=    '((?<=[\"\'])';
-				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
-				$regex.=    '[\"\']?';
-				$regex.= ')?\s*';
-				$regex.= '(?:';
-				$regex.=    '(?:';
-				$regex.=        '(name|format|escape|op|value)';
-				$regex.=        '\s*=\s*';
-				$regex.=    ')';
-				$regex.=    '(?:[\"\'])?';
-				$regex.=    '((?<=[\"\'])';
-				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
-				$regex.=    '[\"\']?';
-				$regex.= ')?\s*';
-				$regex.= '(?:';
-				$regex.=    '(?:';
-				$regex.=        '(name|format|escape|op|value)';
-				$regex.=        '\s*=\s*';
-				$regex.=    ')';
-				$regex.=    '(?:[\"\'])?';
-				$regex.=    '((?<=[\"\'])';
-				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
-				$regex.=    '[\"\']?';
-				$regex.= ')?\s*';
+				$regex.= ')?\s*)*?)';
 				$regex.= '(?:>|\/>|}|-->){1}';
 				$regex.= '/i';
-				//$regex.= '([\r\n|\n|\r])?/ie';
 				$data = preg_replace_callback($regex, array($this, '_parseTag'), $data);
 
 				if ($this->_cache) { // add cache if need be
@@ -1300,28 +1269,37 @@ if (!defined('vlibTemplateClassLoaded')) {
 			$wholetag = $args[0];
 			$openclose = $args[1];
 			$tag = strtolower($args[2]);
-			$newline = $args[11];
-			//echo "1#$newline#2";
-
-			if ($tag == 'else') return '<?php } else { ?>'.$newline;
+			
+			if ($tag == 'else') return '<?php } else { ?>';
 			if ($tag == 'tmpl_include') return $wholetag; // ignore tmpl_include tags
 
 			if (preg_match("/^<\/|{\/|<!--\/$/s", $openclose) || preg_match("/^end[if|loop|unless|comment]$/", $tag)) {
 				if ($tag == 'loop' || $tag == 'endloop') array_pop($this->_namespace);
 				if ($tag == 'comment' || $tag == 'endcomment') {
-					return '<?php */ ?>'.$newline;
+					return '<?php */ ?>';
 				}
 				else {
-					return '<?php } ?>'.$newline;
+					return '<?php } ?>';
 				}
 			}
 
 			// arrange attributes
-			for ($i=3; $i < 10; $i=($i+2)) {
-				if (empty($args[$i]) && empty($args[($i+1)])) break;
-				$key = (empty($args[$i])) ? 'name' : strtolower($args[$i]);
-				if ($key == 'name' && preg_match('/^(php)?include$/', $tag)) $key = 'file';
-				$$key = $args[($i+1)];
+			$tmp_atts = $args[3];
+			$atts = preg_split('/\s+/', $tmp_atts);
+			foreach($atts as $att) {
+				$regex =    '/(?:';
+				$regex.=        '(name|format|escape|op|value|file)';
+				$regex.=        '\s*=\s*';
+				$regex.=    ')?';
+				$regex.=    '(?:[\"\'])?';
+				$regex.=    '((?<=[\"\'])';
+				$regex.=    '[^\"\']*|[a-z0-9_\.]*)';
+				$regex.=    '[\"\']?/';
+				if(preg_match($regex, $att, $match)) {
+					$key = (empty($match[1])) ? 'name' : strtolower($match[1]);
+					if ($key == 'name' && preg_match('/^(php)?include$/', $tag)) $key = 'file';
+					$$key = $match[2];
+				}
 			}
 
 			$var = ($this->OPTIONS['CASELESS']) ? strtolower($name) : $name;
@@ -1345,28 +1323,28 @@ if (!defined('vlibTemplateClassLoaded')) {
 				if (empty($escape) && (!empty($this->OPTIONS['DEFAULT_ESCAPE']) && strtolower($this->OPTIONS['DEFAULT_ESCAPE']) != 'none')) {
 					$escape = strtolower($this->OPTIONS['DEFAULT_ESCAPE']);
 				}
-				return '<?php '.$this->_parseVar ($wholetag, $tag, $var, @$escape, @$format, @$namespace).' ?>'.$newline."\n";
+				return '<?php '.$this->_parseVar ($wholetag, $tag, $var, @$escape, @$format, @$namespace).' ?>'."\n";
 				break;
 
 			case 'if':
-				return '<?php if ('. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>'.$newline;
+				return '<?php if ('. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>';
 				break;
 
 			case 'unless':
-				return '<?php if (!'. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>'.$newline;
+				return '<?php if (!'. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>';
 				break;
 
 			case 'elseif':
-				return '<?php } elseif ('. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>'.$newline;
+				return '<?php } elseif ('. $this->_parseIf($var, @$value, @$op, @$namespace, @$format) .') { ?>';
 				break;
 
 			case 'loop':
-				return '<?php '. $this->_parseLoop($var) .'?>'.$newline;
+				return '<?php '. $this->_parseLoop($var) .'?>';
 				break;
 
 			case 'comment':
 				if (empty($var)) { // full open/close style comment
-					return '<?php /* ?>'.$newline;
+					return '<?php /* ?>';
 				}
 				else { // just ignore tag if it was a one line comment
 					return;
@@ -1375,7 +1353,7 @@ if (!defined('vlibTemplateClassLoaded')) {
 
 			case 'phpinclude':
 				if ($this->OPTIONS['ENABLE_PHPINCLUDE']) {
-					return '<?php include(\''.$file.'\'); ?>'.$newline;
+					return '<?php include(\''.$file.'\'); ?>';
 				}
 				break;