Index: includes/classes/xmlrpc_handler.inc.php
===================================================================
--- includes/classes/xmlrpc_handler.inc.php	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ includes/classes/xmlrpc_handler.inc.php	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -2,40 +2,46 @@
 
 class xmlrpc_handler {
-	var $conntype;
-	var $host;
-	var $port;
-	var $timeout;
-	var $request;
-	var $response;
-	var $calls;
-	var $mcalls;
-	var $times;
-	var $mtimes;
-	var $user;
-	var $password;
+	var $conntype = "";
+	var $host =	"";
+	var $port =	0;
+	var $timeout =	10;
+	var $request =	null;
+	var $response =	null;
+	var $calls =	0;
+	var $mcalls =	0;
+	var $times =	0;
+	var $mtimes =	0;
+	var $user = 	null;
+	var $password =	null;
+	var $errors =	array();
 
 	function __construct( $address, $timeout ) {
+		$this->conntype = "";
+		$this->host = "";
+		$this->port = 0;
 		if ( preg_match( "|^unix://(.+)$|", $address, $match ) ) {
-			$this->conntype = "socket";
-			$this->host = $match[1];
-			$this->port = 0;
-			if ( ( $perms = @fileperms( $this->host ) ) === false ) {
-				$this->conntype = "";
-				$this->host = "";
-			} else {
-				if ( ( fileperms( $this->host ) & 0xC000 ) !== 0xC000 ) {
-					$this->conntype = "";
-					$this->host = "";
-				} elseif ( !is_writable( $this->host ) ) {
-					$this->conntype = "";
-					$this->host = "";
-				} else {
-					$this->host = $match[0];
-				}
+			if ( empty( $match[1] ) ) {
+				$this->errors[] = "xmlrpc_socket_empty";
+			} elseif ( !file_exists( $match[1] ) ) {
+				$this->errors[] = "xmlrpc_socket_noexist";
+			} elseif ( ( $perms = @fileperms( $match[1] ) ) === false ) {
+				$this->errors[] = "xmlrpc_socket_noperms";
+			} elseif ( ( $perms & 0xC000 ) !== 0xC000 ) {
+				$this->errors[] = "xmlrpc_socket_nosocket";
+			} elseif ( !is_writable( $match[1] ) ) {
+				$this->errors[] = "xmlrpc_socket_nowrite";
+			} elseif ( !is_readable( $match[1] ) ) {
+				$this->errors[] = "xmlrpc_socket_noread";
+			} else {
+				$this->conntype = "socket";
+				$this->host = $match[0];
 			}
 		} elseif ( preg_match( "<^(http|https)://(.*)$>", $address, $match ) ) {
-			$this->conntype = "http";
-			$this->host = $match[0];
-			$this->port = 0;
+			if ( empty( $match[2] ) ) {
+				$this->errors[] = "xmlrpc_url_empty";
+			} else {
+				$this->conntype = "http";
+				$this->host = $match[0];
+			}
 		} elseif ( preg_match( "|^:(\d{1,5})$|", $address, $match ) ) {
 			$this->conntype = "localport";
@@ -43,7 +49,5 @@
 			settype( $this->port, "int" );
 			if ( $this->port < 1 || $this->port > 65535 ) {
-				$this->conntype = "";
-				$this->host = "";
-				$this->port = 0;
+				$this->errors[] = "xmlrpc_localport_outofrange";
 			} else {
 				$this->host = "127.0.0.1";
@@ -55,28 +59,16 @@
 			settype( $this->port, "int" );
 			if ( ip2long( $this->host ) === false ) {
-				$this->conntype = "";
-				$this->host = "";
-				$this->port = 0;
+				$this->errors[] = "xmlrpc_port_invalidip";
 			} elseif ( $this->host != long2ip( ip2long( $this->host ) ) ) {
-				$this->conntype = "";
-				$this->host = "";
-				$this->port = 0;
+				$this->errors[] = "xmlrpc_port_invalidipplus";
 			}
 			if ( $this->port < 1 || $this->port > 65535 ) {
-				$this->conntype = "";
-				$this->host = "";
-				$this->port = 0;
-			}
-		} else {
-			$this->conntype = "";
-			$this->host = "";
-			$this->port = 0;
+				$this->errors[] = "xmlrpc_port_outofrange";
+			}
+		} else {
+			$this->errors[] = "xmlrpc_nodestination";
 		}
 
 		$this->timeout	= $timeout;
-		$this->request	= null;
-		$this->response	= null;
-		$this->calls	= 0;
-		$this->mcalls	= 0;
 	}
 
@@ -114,26 +106,45 @@
 				$mnode = $inode->firstChild;
 				while ( $mnode != NULL ) {
+					if ( ( $mnode->firstChild->nodeValue == "faultCode" ) && ( $mnode->nextSibling->firstChild->nodeValue == "faultString" ) ) {
+						$this->errors[] = "{$mnode->nextSibling->lastChild->nodeValue} ({$mnode->lastChild->nodeValue})";
+						$this->errors[] = "xmlrpc_fault";
+						return false;
+					}
 					$nname = $mnode->firstChild->nodeValue;
-					$response[$nname] = $this->decode_rec( $mnode->lastChild->firstChild );
+					$dec = $this->decode_rec( $mnode->lastChild->firstChild );
+					if ( $dec === false ) {
+						return false;
+					}
+					$response[$nname] = $dec;
 					$mnode = $mnode->nextSibling;
 				}
+				break;
 			}
 			case "array" : {
 				$vnode = $inode->firstChild->firstChild;
 				while ( $vnode != NULL ) {
-					$response[] = $this->decode_rec( $vnode->firstChild );
+					$dec = $this->decode_rec( $vnode->firstChild );
+					$response[] = $dec;
+					if ( $dec === false ) {
+						return false;
+					}
 					$vnode = $vnode->nextSibling;
 				}
-			}
-		}
-		return $response;
+				break;
+			}
+		}
+
+		return ( isset( $response ) ? $response : "" );
 	}
 
 	private function decode( $str ) {
-		$str = preg_replace( "%<(/{0,1})(i8|ex.i8)>%", "<\\1string>", $str );
+		$str = preg_replace( "%<(/{0,1})(i8|ex\.i8)>%", "<\\1string>", $str );
 		$str = preg_replace( "/>\s*?</s", "><", $str );
 		$xml = new DOMDocument( "1.0", "utf-8" );
 		$xml->formatOutput = true;
-		$xml->loadXML( $str );
+		if ( !@$xml->loadXML( $str ) ) {
+			$this->errors[] = "xmlrpc_xml_noload";
+			return false;
+		}
 
 		$root = $xml->firstChild;
@@ -143,4 +154,7 @@
 			$response[faultCode] = (int)$root->firstChild->firstChild->firstChild->firstChild->lastChild->firstChild->nodeValue;
 			$response[faultString] = $root->firstChild->firstChild->firstChild->lastChild->lastChild->firstChild->nodeValue;
+			$this->errors[] = "{$response[faultString]} ({$response[faultCode]})";
+			$this->errors[] = "xmlrpc_fault";
+			return false;
 		} else {
 			$vnode = $root->firstChild->firstChild->firstChild;
@@ -162,5 +176,9 @@
 					while ( $mnode != NULL ) {
 						$nname = $mnode->firstChild->nodeValue;
-						$response[$nname] = $this->decode_rec( $mnode->lastChild->firstChild );
+						$dec = $this->decode_rec( $mnode->lastChild->firstChild );
+						if ( $dec === false ) {
+							return false;
+						}
+						$response[$nname] = $dec;
 						$mnode = $mnode->nextSibling;
 					}
@@ -169,5 +187,9 @@
 					$vnode = $inode->firstChild->firstChild;
 					while ( $vnode != NULL ) {
-						$response[] = $this->decode_rec( $vnode->firstChild );
+						$dec = $this->decode_rec( $vnode->firstChild );
+						if ( $dec === false ) {
+							return false;
+						}
+						$response[] = $dec;
 						$vnode = $vnode->nextSibling;
 					}
@@ -176,5 +198,5 @@
 		}
 
-		return $response;
+		return ( isset( $response ) ? $response : array() );
 	}
 
@@ -206,5 +228,7 @@
 						$mnode = $anode->appendChild( $xml->createElement( "member" ) );
 						$nnode = $mnode->appendChild( $xml->createElement( "name", $key ) );
-						$this->encode_request_rec( $method, $val, $xml, $mnode );
+						if ( $this->encode_request_rec( $method, $val, $xml, $mnode ) === false ) {
+							return false;
+						}
 					}
 				} else {
@@ -212,5 +236,7 @@
 					$dnode = $anode->appendChild( $xml->createElement( "data" ) );
 					foreach ( $param as $key => $val ) {
-						$this->encode_request_rec( $method, $val, $xml, $dnode );
+						if ( $this->encode_request_rec( $method, $val, $xml, $dnode ) === false ) {
+							return false;
+						}
 					}
 				}
@@ -231,6 +257,7 @@
 			}
 			default : {
-				print "Error: ".gettype( $param );
-				exit;
+				$this->errors[] = gettype( $param );
+				$this->errors[] = "xmlrpc_request_invalidtype";
+				return false;
 				break;
 			}
@@ -240,5 +267,5 @@
 	private function encode_request( $method, $params ) {
 		$xml = new DOMDocument( "1.0", "utf-8" );
-		$xml->formatOutput = false;
+		$xml->formatOutput = true;
 
 		$root = $xml->appendChild( $xml->createElement( "methodCall" ) );
@@ -260,15 +287,21 @@
 					$mnode = $anode->appendChild( $xml->createElement( "member" ) );
 					$nnode = $mnode->appendChild( $xml->createElement( "name", $key ) );
-					$this->encode_request_rec( $method, $val, $xml, $mnode );
+					if ( $this->encode_request_rec( $method, $val, $xml, $mnode ) === false ) {
+						return false;
+					}
 				}
 			} else {
 				foreach ( $params as $key => $val ) {
 					$pnode = $psnode->appendChild( $xml->createElement( "param" ) );
-					$this->encode_request_rec( $method, $val, $xml, $pnode );
+					if ( $this->encode_request_rec( $method, $val, $xml, $pnode ) === false ) {
+						return false;
+					}
 				}
 			}
 		} else {
 			$pnode = $psnode->appendChild( $xml->createElement( "param" ) );
-			$this->encode_request_rec( $method, $params, $xml, $pnode );
+			if ( $this->encode_request_rec( $method, $params, $xml, $pnode ) === false ) {
+				return false;
+			}
 		}
 
@@ -291,4 +324,9 @@
 		}
 		$this->request = $this->encode_request( "system.multicall", array( $this->request ) );
+		if ( $this->request === false ) {
+			return false;
+		} else {
+			return true;
+		}
 	}
 
@@ -300,8 +338,18 @@
 		}
 		$this->request = $this->encode_request( "system.multicall", array( $this->request ) );
+		if ( $this->request === false ) {
+			return false;
+		} else {
+			return true;
+		}
 	}
 
 	function setrequest( $method, $attributes ) {
 		$this->request = $this->encode_request( $method, $attributes );
+		if ( $this->request === false ) {
+			return false;
+		} else {
+			return true;
+		}
 	}
 
@@ -315,6 +363,14 @@
 		$out = "{$len}:{$headers},{$this->request}";
 
-		$fp = fsockopen( $this->host, $this->port, $errno, $errstr, $this->timeout );
-		if ( $fp ) {
+		$fp = @fsockopen( $this->host, $this->port, $errno, $errstr, $this->timeout );
+		if ( $fp === false ) {
+			$this->errors[] = "{$error} ({$errno})";
+			$this->errors[] = "xmlrpc_scgi_connectfailed";
+			$tt = getmicrotime();
+			$this->calls++;
+			$this->times = $this->times + $tt - $st;
+
+			return false;
+		} else {
 			fwrite( $fp, $out );
 			do {
@@ -322,11 +378,14 @@
 			} while ( trim( $line ) != "" );
 
-			if ( ( $this->response = stream_get_contents( $fp ) ) !== false ) {
+			$this->response = stream_get_contents( $fp );
+			if ( $this->response === false ) {
+				$this->errors[] = "xmlrpc_scgi_readfailed";
 				$tt = getmicrotime();
 				$this->calls++;
 				$this->times = $this->times + $tt - $st;
 
-				return true;
-			} else {
+				return false;
+			} elseif ( $this->response === "" ) {
+				$this->errors[] = "xmlrpc_scgi_emptystring";
 				$tt = getmicrotime();
 				$this->calls++;
@@ -334,11 +393,11 @@
 
 				return false;
-			}
-		} else {
-			$tt = getmicrotime();
-			$this->calls++;
-			$this->times = $this->times + $tt - $st;
-
-			return false;
+			} else {
+				$tt = getmicrotime();
+				$this->calls++;
+				$this->times = $this->times + $tt - $st;
+
+				return true;
+			}
 		}
 	}
@@ -359,5 +418,19 @@
 		curl_setopt( $ch, CURLOPT_POSTFIELDS, $this->request );
 		curl_setopt( $ch, CURLOPT_USERPWD, "{$this->user}:{$this->password}" );
+		curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
 		$this->response = curl_exec( $ch ); 
+		if ( $this->response === false ) {
+			$error = curl_error( $ch );
+			$errno = curl_errno( $ch );
+			$this->errors[] = "{$error} ({$errno})";
+			$this->errors[] = "xmlrpc_gw_connectfailed";
+			return false;
+		} elseif ( $this->response === "" ) {
+			$error = curl_error( $ch );
+			$errno = curl_errno( $ch );
+			$this->errors[] = "{$error} ({$errno})";
+			$this->errors[] = "xmlrpc_gw_empttstring";
+			return false;
+		}
 		$tt = getmicrotime();
 		$this->calls++;
@@ -374,5 +447,6 @@
 				break;
 			}
-			case "http" : {
+			case "http" :
+			case "https" : {
 				return $this->gw_call();
 
@@ -395,5 +469,6 @@
 
 	function parse() {
-		if ( ( $this->response = $this->decode( $this->response ) ) !== false ) {
+		$this->response = $this->decode( $this->response );
+		if ( $this->response !== false ) {
 			return true;
 		} else {
@@ -421,14 +496,10 @@
 			$r++;
 
-			if ( isset( $this->response[$r]["faultCode"] ) && isset( $this->response[$r]["faultString"] ) ) {
-				print "(Error: {$response[$r]["faultCode"]} {$this->response[$r]["faultString"]})<br />\r\n";
-			} else {
-				if ( $methodval == "dht_statistics" ) {
-					foreach ( $this->response[$r][0] as $dkey => $dval ) {
-						$responses["{$methodval}_{$dkey}"] = $dval;
-					}
-				} else {
-					$responses[$methodval] = $this->response[$r][0];
-				}
+			if ( $methodval == "dht_statistics" ) {
+				foreach ( $this->response[$r][0] as $dkey => $dval ) {
+					$responses["{$methodval}_{$dkey}"] = $dval;
+				}
+			} else {
+				$responses[$methodval] = $this->response[$r][0];
 			}
 		}
@@ -441,4 +512,20 @@
 	}
 
+	function clearerrors() {
+		$this->errors = array();
+	}
+
+	function geterrorsnum() {
+		return count( $this->errors );
+	}
+
+	function geterrors() {
+		return $this->errors;
+	}
+
+	function getlasterror() {
+		return array_pop( $this->errors );
+	}
+
 }
 
Index: includes/messages.cht.inc.php
===================================================================
--- includes/messages.cht.inc.php	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ includes/messages.cht.inc.php	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -133,4 +133,25 @@
 	"proxy_address_0000"			=> "Not set",
 
+	"xmlrpc_socket_empty"			=> "Malformed unix socket path",
+	"xmlrpc_socket_noexist"			=> "The socket does not exist",
+	"xmlrpc_socket_noperms"			=> "Cannot read permissions for the socket",
+	"xmlrpc_socket_nosocket"		=> "The socket seems not to be a unix socket",
+	"xmlrpc_socket_nowrite"			=> "Cannot write socket",
+	"xmlrpc_socket_noread"			=> "Cannot read socket",
+	"xmlrpc_url_empty"			=> "The URL is empty",
+	"xmlrpc_localport_outofrange"		=> "Port is out of range",
+	"xmlrpc_port_invalidip"			=> "Invalid IP address",
+	"xmlrpc_port_invalidipplus"		=> "Invalid IP address (this message should never appear - if it does, open a ticker in the rTWi trac, and attach your users.conf)",
+	"xmlrpc_port_outofrange"		=> "Port is out of range",
+	"xmlrpc_nodestination"			=> "Nowhere to connect (malformed address)",
+	"xmlrpc_scgi_connectfailed"		=> "Connecting to rTorrent has failed",
+	"xmlrpc_scgi_readfailed"		=> "Receiving answer from rTorrent has failed",
+	"xmlrpc_scgi_emptystring"		=> "rTorrent has returnde nothing (SCGI)",
+	"xmlrpc_gw_connectfailed"		=> "Connecting to rTorrent (using SCGI gateway) has failed",
+	"xmlrpc_gw_emptystring"			=> "rTorrent has returnde nothing (GW)",
+	"xmlrpc_xml_noload"			=> "Malformed XML (propably a HTTP error, or redirect)",
+	"xmlrpc_request_invalidtype"		=> "Invalid parameter type",
+	"xmlrpc_fault"				=> "rTorrent returned an XMLRPC error",
+
 	"unknown"				=> "Unknown",
 );
@@ -140,4 +161,5 @@
 	"viewtype_default"			=> "預設",
 	"viewtype_name"				=> "名稱",
+	"viewtype_active"			=> "Active",
 	"viewtype_started"			=> "已開始",
 	"viewtype_stopped"			=> "已停止",
Index: includes/messages.de.inc.php
===================================================================
--- includes/messages.de.inc.php	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ includes/messages.de.inc.php	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -133,4 +133,25 @@
 	"proxy_address_0000"			=> "Nicht gesetzt",
 
+	"xmlrpc_socket_empty"			=> "Malformed unix socket path",
+	"xmlrpc_socket_noexist"			=> "The socket does not exist",
+	"xmlrpc_socket_noperms"			=> "Cannot read permissions for the socket",
+	"xmlrpc_socket_nosocket"		=> "The socket seems not to be a unix socket",
+	"xmlrpc_socket_nowrite"			=> "Cannot write socket",
+	"xmlrpc_socket_noread"			=> "Cannot read socket",
+	"xmlrpc_url_empty"			=> "The URL is empty",
+	"xmlrpc_localport_outofrange"		=> "Port is out of range",
+	"xmlrpc_port_invalidip"			=> "Invalid IP address",
+	"xmlrpc_port_invalidipplus"		=> "Invalid IP address (this message should never appear - if it does, open a ticker in the rTWi trac, and attach your users.conf)",
+	"xmlrpc_port_outofrange"		=> "Port is out of range",
+	"xmlrpc_nodestination"			=> "Nowhere to connect (malformed address)",
+	"xmlrpc_scgi_connectfailed"		=> "Connecting to rTorrent has failed",
+	"xmlrpc_scgi_readfailed"		=> "Receiving answer from rTorrent has failed",
+	"xmlrpc_scgi_emptystring"		=> "rTorrent has returnde nothing (SCGI)",
+	"xmlrpc_gw_connectfailed"		=> "Connecting to rTorrent (using SCGI gateway) has failed",
+	"xmlrpc_gw_emptystring"			=> "rTorrent has returnde nothing (GW)",
+	"xmlrpc_xml_noload"			=> "Malformed XML (propably a HTTP error, or redirect)",
+	"xmlrpc_request_invalidtype"		=> "Invalid parameter type",
+	"xmlrpc_fault"				=> "rTorrent returned an XMLRPC error",
+
 	"unknown"				=> "Unbekannt",
 );
@@ -140,4 +161,5 @@
 	"viewtype_default"			=> "Standard",
 	"viewtype_name"				=> "Name",
+	"viewtype_active"			=> "Active",
 	"viewtype_started"			=> "Gestartet",
 	"viewtype_stopped"			=> "Gestoppt",
Index: includes/messages.en.inc.php
===================================================================
--- includes/messages.en.inc.php	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ includes/messages.en.inc.php	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -133,4 +133,25 @@
 	"proxy_address_0000"			=> "Not set",
 
+	"xmlrpc_socket_empty"			=> "Malformed unix socket path",
+	"xmlrpc_socket_noexist"			=> "The socket does not exist",
+	"xmlrpc_socket_noperms"			=> "Cannot read permissions for the socket",
+	"xmlrpc_socket_nosocket"		=> "The socket seems not to be a unix socket",
+	"xmlrpc_socket_nowrite"			=> "Cannot write socket",
+	"xmlrpc_socket_noread"			=> "Cannot read socket",
+	"xmlrpc_url_empty"			=> "The URL is empty",
+	"xmlrpc_localport_outofrange"		=> "Port is out of range",
+	"xmlrpc_port_invalidip"			=> "Invalid IP address",
+	"xmlrpc_port_invalidipplus"		=> "Invalid IP address (this message should never appear - if it does, open a ticker in the rTWi trac, and attach your users.conf)",
+	"xmlrpc_port_outofrange"		=> "Port is out of range",
+	"xmlrpc_nodestination"			=> "Nowhere to connect (malformed address)",
+	"xmlrpc_scgi_connectfailed"		=> "Connecting to rTorrent has failed",
+	"xmlrpc_scgi_readfailed"		=> "Receiving answer from rTorrent has failed",
+	"xmlrpc_scgi_emptystring"		=> "rTorrent has returnde nothing (SCGI)",
+	"xmlrpc_gw_connectfailed"		=> "Connecting to rTorrent (using SCGI gateway) has failed",
+	"xmlrpc_gw_emptystring"			=> "rTorrent has returnde nothing (GW)",
+	"xmlrpc_xml_noload"			=> "Malformed XML (propably a HTTP error, or redirect)",
+	"xmlrpc_request_invalidtype"		=> "Invalid parameter type",
+	"xmlrpc_fault"				=> "rTorrent returned an XMLRPC error",
+
 	"unknown"				=> "Unknown",
 );
@@ -140,4 +161,5 @@
 	"viewtype_default"			=> "Default",
 	"viewtype_name"				=> "Name",
+	"viewtype_active"			=> "Active",
 	"viewtype_started"			=> "Started",
 	"viewtype_stopped"			=> "Stopped",
Index: includes/messages.hu.inc.php
===================================================================
--- includes/messages.hu.inc.php	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ includes/messages.hu.inc.php	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -133,4 +133,25 @@
 	"proxy_address_0000"			=> "Nincs beállítva",
 
+	"xmlrpc_socket_empty"			=> "A unix socket útvonalának formátuma hiás",
+	"xmlrpc_socket_noexist"			=> "A socket nem létezik",
+	"xmlrpc_socket_noperms"			=> "Nem lehet kiolvasni a socket jogosultságait",
+	"xmlrpc_socket_nosocket"		=> "A socket nem unix socket",
+	"xmlrpc_socket_nowrite"			=> "A socket nem írható",
+	"xmlrpc_socket_noread"			=> "A socket nem olvasható",
+	"xmlrpc_url_empty"			=> "Az URL üres",
+	"xmlrpc_localport_outofrange"		=> "A port 1 és 65535 között kell, hogy legyen",
+	"xmlrpc_port_invalidip"			=> "Hibás IP cím",
+	"xmlrpc_port_invalidipplus"		=> "Hibás IP cím (ez a hiba elvileg nem fordulhat elő, ellenkező esetben nyiss egy ticket-et a trac-ban és csatold a users.conf fájlt)",
+	"xmlrpc_port_outofrange"		=> "A port 1 és 65535 között kell, hogy legyen",
+	"xmlrpc_nodestination"			=> "Ninc hová csatlakozni (hibás cím)",
+	"xmlrpc_scgi_connectfailed"		=> "Nem sikerült kapcsolódni az rTorrent-hez",
+	"xmlrpc_scgi_readfailed"		=> "Nem sikerült választ kapni az rTorrent-től",
+	"xmlrpc_scgi_emptystring"		=> "Az rTorrent semmit nem adott vissza (SCGI)",
+	"xmlrpc_gw_connectfailed"		=> "Nem siker csatlakozni az rTorrent-hez (SCGI gateway haszálatával)",
+	"xmlrpc_gw_emptystring"			=> "Az rTorrent semmit nem adott vissza (GW)",
+	"xmlrpc_xml_noload"			=> "Hibás XML (valószínqleg HTTP hibaoldal, vagy átirányítás)",
+	"xmlrpc_request_invalidtype"		=> "Hibás paraméter típus",
+	"xmlrpc_fault"				=> "Az rTorrent XMLRPC hibával tért vissza",
+
 	"unknown"				=> "Ismeretlen",
 );
@@ -140,4 +161,5 @@
 	"viewtype_default"			=> "Alapértelmezett",
 	"viewtype_name"				=> "Név szerint",
+	"viewtype_active"			=> "Aktív",
 	"viewtype_started"			=> "Elindított torrentek",
 	"viewtype_stopped"			=> "Leállított torrentek",
Index: index.php
===================================================================
--- index.php	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ index.php	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -606,453 +606,491 @@
 
 // deciding what to do
-switch ( $mod ) {
-	case "login" : { // login
-		// adding language select
-		if ( $config["language"] ) {
-			addlanguages( $xml, $root, $root, $languages );
-		}
-
-		$layout_file = "layout.main.login.xsl";
-
-		break;
-	}
-	case "serverinfo" : { // server info
-		// creating torrents node
-		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
-		// adding auto-refresh select
-		if ( $config["refresh"] ) {
-			addrefreshrates( $xml, $root, $tnode, $refreshrates );
-		}
-		// adding language select
-		if ( $config["language"] ) {
-			addlanguages( $xml, $root, $tnode, $languages );
-		}
-
-		// retrieving server info
-		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-		if ( !$xmlrpc->call() || !$xmlrpc->parse() ) {
-		}
-		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-
-		// getting up/down rates for totals
-		$methodlist = array( "d.get_down_rate=", "d.get_up_rate=" );
-		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$response = $xmlrpc->fetch();
-
-		// counting totals
-		$bytes_down = 0;
-		$bytes_up = 0;
-		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
-				$d_responses[$i][$methodval] = $response[$i][$r];
-			}
-			$bytes_down += $d_responses[$i]["d_down_rate"];
-			$bytes_up += $d_responses[$i]["d_up_rate"];
-		}
-
-		$si_responses["bytes_down"] = $bytes_down;
-		$si_responses["bytes_up"] = $bytes_up;
-
-		// preparing values
-		prepare_serverinfo_responses( $si_responses, $message, $config );
-
-		// addng some more values to xml (total up/down rate, limits)
-		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["download_rate_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
-
-		// addng some more values to xml (total up/down rate, limits)
-		$inode = $tnode->appendChild( $xml->createElement( "server_info" ) );
-		xmlrpc_multiappend( $xml, $inode, $si_responses );
-
-		$layout_file = "layout.main.index.xsl";
-
-		break;
-	}
-	case "addtorrent" : { // add a new torrent
-		// getting download directory
-		$xmlrpc->setmrequest( array( "get_directory", "system.get_cwd" ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$directories = $xmlrpc->fetch();
-		$directory = $directories[0];
-		$cwd = $directories[1];
-
-		// full download directory path
-		$directory = myrealpath( $directories[0][0], $config["home_path"], $directories[1][0] );
-
-		$ppath = substr( $path, 0, strrpos( $path, "/" ) );
-		// scanning for subdirectories
-		$scan = scandir( myrealpath( "{$directory}/{$path}", $config["home_path"], $directories[1][0] ) );
-		// checking free space
-		$freespace = switch_bytes( disk_free_space( myrealpath( "{$directory}/{$ppath}", $config["home_path"], $directories[1][0] ) ) );
-
-		// adding values to xml
-		$atnode = $root->appendChild( $xml->createElement( "addtorrent" ) );
-		$atnode->setAttribute( "name", $ppath );
-		$atnode->setAttribute( "path", $path );
-		$atnode->setAttribute( "ppath", urlencode( $ppath ) );
-		$atnode->setAttribute( "freespace", disk_free_space( "{$directory}/{$ppath}" ) );
-		$atnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
-		$atnode->setAttribute( "freespace_suffix", $freespace[1] );
-
-		// adding language select
-		if ( $config["language"] === "1" ) {
-			addlanguages( $xml, $root, $atnode, $languages );
-		}
-
-		// checking subdirectories for free space
-		foreach( $scan as $key => $val ) {
-			$dpath = str_replace( "//", "/", "{$path}/{$val}" );
-			$fdpath = str_replace( "//", "/", "{$directory}/{$dpath}" );
-			if ( ( is_dir( $fdpath ) || ( is_link( $fdpath ) && is_dir( readlink( $fdpath ) ) ) ) && substr( $val, 0, 1 ) != "."  ) {
-				$freespace = switch_bytes( disk_free_space( $fdpath ) );
-
-				$dnode = $atnode->appendChild( $xml->createElement( "dlpath" ) );
-				$dnode->setAttribute( "name", $val );
-				$dnode->setAttribute( "path", urlencode( $dpath ) );
-				$dnode->setAttribute( "freespace", disk_free_space( $fdpath ) );
-				$dnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
-				$dnode->setAttribute( "freespace_suffix", $freespace[1] );
-			}
-		}
-
-		$layout_file = "layout.main.index.xsl";
-
-		break;
-	}
-	case "torrent" : { // torrent
-		// creating torrents node
-		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
-		// adding auto-refresh select
-		if ( $config["refresh"] ) {
-			addrefreshrates( $xml, $root, $tnode, $refreshrates );
-		}
-		// adding language select
-		if ( $config["language"] ) {
-			addlanguages( $xml, $root, $tnode, $languages );
-		}
-
-		// retrieving server info
-		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-
-		// retrieving download info
-		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$response = $xmlrpc->fetch();
-
-		// counting totals
-		$bytes_down = 0;
-		$bytes_up = 0;
-		$torrent = false;
-		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
-				$d_responses[$i][$methodval] = $response[$i][$r];
-			}
-			$bytes_down += $d_responses[$i]["d_down_rate"];
-			$bytes_up += $d_responses[$i]["d_up_rate"];
-
-			// if hash matches save the download data
-			if ( $d_responses[$i]["d_hash"] == $hash ) {
-				$torrent = $d_responses[$i];
-			}
-		}
-		unset( $d_responses );
-
-		// when we have a match
-		if ( is_array( $torrent ) ) {
-			// prepare download variables
-			prepare_downloadlist_responses( $torrent, $message, $config["home_path"], $si_responses["get_cwd"] );
-			// decide what to do
-			switch ( $page ) {
-				case "peers" : { // peer list page
-					// create peer nodes
-					$node = $tnode->appendChild( $xml->createElement( "torrent_peers_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_peers" ) );
-
-					// retrieve peer list info
-					$xmlrpc->setrequest( "p.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["p"] ) );
-					$xmlrpc->call();
-					$xmlrpc->parse();
-					$response = $xmlrpc->fetch();
-					
-					// process the peer info
-					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $xmlrpc_methods["p"] ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["p"][$r] );
-							$responses[$i][$methodval] = $response[$i][$r];
+if ( $ajax === true ) {
+	$layout_file = "layout.ajax.index.xsl";
+} else {
+	$layout_file = "layout.main.index.xsl";
+}
+if ( ( isset( $xmlrpc ) && ( $xmlrpc->geterrorsnum() == 0 ) ) || ( $mod == "login" ) ) {
+	switch ( $mod ) {
+		case "login" : { // login
+			// adding language select
+			if ( $config["language"] ) {
+				addlanguages( $xml, $root, $root, $languages );
+			}
+
+			$layout_file = "layout.main.login.xsl";
+
+			break;
+		}
+		case "serverinfo" : { // server info
+			// creating torrents node
+			$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
+			// adding auto-refresh select
+			if ( $config["refresh"] ) {
+				addrefreshrates( $xml, $root, $tnode, $refreshrates );
+			}
+			// adding language select
+			if ( $config["language"] ) {
+				addlanguages( $xml, $root, $tnode, $languages );
+			}
+
+			// retrieving server info
+			if ( !$xmlrpc->setmrequest( $xmlrpc_methods["si"] ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+				break;
+			}
+			$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+			// getting up/down rates for totals
+			$methodlist = array( "d.get_down_rate=", "d.get_up_rate=" );
+			if ( !$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+				break;
+			}
+			$response = $xmlrpc->fetch();
+
+			// counting totals
+			$bytes_down = 0;
+			$bytes_up = 0;
+			for ( $i = 0; $i < count( $response ); $i++ ) {
+				for ( $r = 0; $r < count( $methodlist ); $r++ ) {
+					$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
+					$d_responses[$i][$methodval] = $response[$i][$r];
+				}
+				$bytes_down += $d_responses[$i]["d_down_rate"];
+				$bytes_up += $d_responses[$i]["d_up_rate"];
+			}
+
+			$si_responses["bytes_down"] = $bytes_down;
+			$si_responses["bytes_up"] = $bytes_up;
+
+			// preparing values
+			prepare_serverinfo_responses( $si_responses, $message, $config );
+
+			// addng some more values to xml (total up/down rate, limits)
+			$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
+			$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
+			$node->setAttribute( "value", $si_responses["bytes_down_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
+			$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
+			$node->setAttribute( "value", $si_responses["bytes_up_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
+			$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
+			$node->setAttribute( "value", $si_responses["download_rate_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
+			$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
+			$node->setAttribute( "value", $si_responses["upload_rate_value"] );
+
+			// addng some more values to xml (total up/down rate, limits)
+			$inode = $tnode->appendChild( $xml->createElement( "server_info" ) );
+			xmlrpc_multiappend( $xml, $inode, $si_responses );
+
+			$layout_file = "layout.main.index.xsl";
+
+			break;
+		}
+		case "addtorrent" : { // add a new torrent
+			// getting download directory
+			if ( !$xmlrpc->setmrequest( array( "get_directory", "system.get_cwd" ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+				break;
+			}
+			$directories = $xmlrpc->fetch();
+			$directory = $directories[0];
+			$cwd = $directories[1];
+
+			// full download directory path
+			$directory = myrealpath( $directories[0][0], $config["home_path"], $directories[1][0] );
+
+			$ppath = substr( $path, 0, strrpos( $path, "/" ) );
+			// scanning for subdirectories
+			$scan = scandir( myrealpath( "{$directory}/{$path}", $config["home_path"], $directories[1][0] ) );
+			// checking free space
+			$freespace = switch_bytes( disk_free_space( myrealpath( "{$directory}/{$ppath}", $config["home_path"], $directories[1][0] ) ) );
+
+			// adding values to xml
+			$atnode = $root->appendChild( $xml->createElement( "addtorrent" ) );
+			$atnode->setAttribute( "name", $ppath );
+			$atnode->setAttribute( "path", $path );
+			$atnode->setAttribute( "ppath", urlencode( $ppath ) );
+			$atnode->setAttribute( "freespace", disk_free_space( "{$directory}/{$ppath}" ) );
+			$atnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
+			$atnode->setAttribute( "freespace_suffix", $freespace[1] );
+
+			// adding language select
+			if ( $config["language"] === "1" ) {
+				addlanguages( $xml, $root, $atnode, $languages );
+			}
+
+			// checking subdirectories for free space
+			foreach( $scan as $key => $val ) {
+				$dpath = str_replace( "//", "/", "{$path}/{$val}" );
+				$fdpath = str_replace( "//", "/", "{$directory}/{$dpath}" );
+				if ( ( is_dir( $fdpath ) || ( is_link( $fdpath ) && is_dir( readlink( $fdpath ) ) ) ) && substr( $val, 0, 1 ) != "."  ) {
+					$freespace = switch_bytes( disk_free_space( $fdpath ) );
+
+					$dnode = $atnode->appendChild( $xml->createElement( "dlpath" ) );
+					$dnode->setAttribute( "name", $val );
+					$dnode->setAttribute( "path", urlencode( $dpath ) );
+					$dnode->setAttribute( "freespace", disk_free_space( $fdpath ) );
+					$dnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
+					$dnode->setAttribute( "freespace_suffix", $freespace[1] );
+				}
+			}
+
+			$layout_file = "layout.main.index.xsl";
+
+			break;
+		}
+		case "torrent" : { // torrent
+			// creating torrents node
+			$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
+			// adding auto-refresh select
+			if ( $config["refresh"] ) {
+				addrefreshrates( $xml, $root, $tnode, $refreshrates );
+			}
+			// adding language select
+			if ( $config["language"] ) {
+				addlanguages( $xml, $root, $tnode, $languages );
+			}
+
+			// retrieving server info
+			if ( !$xmlrpc->setmrequest( $xmlrpc_methods["si"] ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+				break;
+			}
+			$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+			// retrieving download info
+			if ( !$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+				break;
+			}
+			$response = $xmlrpc->fetch();
+
+			// counting totals
+			$bytes_down = 0;
+			$bytes_up = 0;
+			$torrent = false;
+			for ( $i = 0; $i < count( $response ); $i++ ) {
+				for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
+					$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
+					$d_responses[$i][$methodval] = $response[$i][$r];
+				}
+				$bytes_down += $d_responses[$i]["d_down_rate"];
+				$bytes_up += $d_responses[$i]["d_up_rate"];
+
+				// if hash matches save the download data
+				if ( $d_responses[$i]["d_hash"] == $hash ) {
+					$torrent = $d_responses[$i];
+				}
+			}
+			unset( $d_responses );
+
+			// when we have a match
+			if ( is_array( $torrent ) ) {
+				// prepare download variables
+				prepare_downloadlist_responses( $torrent, $message, $config["home_path"], $si_responses["get_cwd"] );
+				// decide what to do
+				switch ( $page ) {
+					case "peers" : { // peer list page
+						// create peer nodes
+						$node = $tnode->appendChild( $xml->createElement( "torrent_peers_root" ) );
+						$node = $node->appendChild( $xml->createElement( "torrent_peers" ) );
+
+						// retrieve peer list info
+						if ( !$xmlrpc->setrequest( "p.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["p"] ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+							$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+							break;
 						}
+						$response = $xmlrpc->fetch();
+						
+						// process the peer info
+						for ( $i = 0; $i < count( $response ); $i++ ) {
+							for ( $r = 0; $r < count( $xmlrpc_methods["p"] ); $r++ ) {
+								$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["p"][$r] );
+								$responses[$i][$methodval] = $response[$i][$r];
+							}
+						}
+						// adding an ID to each peer in the list
+						for ( $i = 0; $i < $torrent["d_peers_connected"]; $i++ ) {
+							prepare_peerlist_responses( $responses[$i], $message, $config );
+							$pnode = $node->appendChild( $xml->createElement( "peer" ) );
+							$pnode->setAttribute( "id", $i );
+							xmlrpc_multiappend( $xml, $pnode, $responses[$i] );
+						}
+
+
+						break;
 					}
-					// adding an ID to each peer in the list
-					for ( $i = 0; $i < $torrent["d_peers_connected"]; $i++ ) {
-						prepare_peerlist_responses( $responses[$i], $message, $config );
-						$pnode = $node->appendChild( $xml->createElement( "peer" ) );
-						$pnode->setAttribute( "id", $i );
-						xmlrpc_multiappend( $xml, $pnode, $responses[$i] );
+					case "info" : {
+						// crate info nodes
+						$node = $tnode->appendChild( $xml->createElement( "torrent_info_root" ) );
+						$node = $node->appendChild( $xml->createElement( "torrent_info" ) );
+
+						break;
 					}
-
-
+					case "files" : {
+						// create file list nodes
+						$node = $tnode->appendChild( $xml->createElement( "torrent_files_root" ) );
+						$node = $node->appendChild( $xml->createElement( "torrent_files" ) );
+
+						// create downloads root direcrory node
+						$node = $node->appendChild( $xml->createElement( "files_root" ) );
+						$node = $node->appendChild( $xml->createElement( "directory" ) );
+						$node->setAttribute( "dirname", $torrent["d_base_filename"] );
+
+						$fst = getmicrotime();
+
+						// retreive file list info
+						if ( !$xmlrpc->setrequest( "f.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["f"] ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+							$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+							break;
+						}
+						$response = $xmlrpc->fetch();
+						// process the file info
+						for ( $i = 0; $i < count( $response ); $i++ ) {
+							for ( $r = 0; $r < count( $xmlrpc_methods["f"] ); $r++ ) {
+								$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["f"][$r] );
+								$responses[$i][$methodval] = $response[$i][$r];
+							}
+						}
+
+						// build som kind of struct
+						$dstruct = array();
+						for ( $i = 0; $i < $torrent["d_size_files"]; $i++ ) {
+							prepare_filelist_responses( $responses[$i], $message, $home_path, $si_responses["get_cwd"] );
+
+							$n = 0;
+							$tmp = &$dstruct;
+							foreach ( $responses[$i]["f_path_components"] as $key => $val ) {
+								if ( count( $responses[$i]["f_path_components"] ) == ++$n ) {
+									$tmp[$i] = $val;
+								} else {
+									if ( !isset( $tmp[$val] ) ) {
+										$tmp[$val] = array();
+									}
+									$tmp = &$tmp[$val];
+								}
+							}
+
+						}
+						// build an xml tree of the files
+						$fnode = build_xmltree( $dstruct, $node, $xml, $torrent["d_directory_value"], $responses );
+
+						$ftt = getmicrotime();
+
+						break;
+					}
+					case "trackers" : {
+						// creating tracker list nodes
+						$node = $tnode->appendChild( $xml->createElement( "torrent_trackers_root" ) );
+						$node = $node->appendChild( $xml->createElement( "torrent_trackers" ) );
+
+						// retrieving tracker list info
+						if ( !$xmlrpc->setrequest( "t.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["t"] ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+							$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+							break;
+						}
+						$response = $xmlrpc->fetch();
+						// processing the tracker info
+						for ( $i = 0; $i < count( $response ); $i++ ) {
+							for ( $r = 0; $r < count( $xmlrpc_methods["t"] ); $r++ ) {
+								$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["t"][$r] );
+								$responses[$i][$methodval] = $response[$i][$r];
+							}
+						}
+						// adding an ID to each tracker in the list
+						for ( $i = 0; $i < $torrent["d_tracker_size"]; $i++ ) {
+							prepare_trackerlist_responses( $responses[$i], $message, $config["home_path"] );
+							$tracnode = $node->appendChild( $xml->createElement( "tracker" ) );
+							$tracnode->setAttribute( "id", $i );
+							xmlrpc_multiappend( $xml, $tracnode, $responses[$i] );
+						}
+
+						break;
+					}
+					case "chunks" : { // unimplemented
+						$node = $tnode->appendChild( $xml->createElement( "torrent_chunks_root" ) );
+						$node = $node->appendChild( $xml->createElement( "torrent_chunks" ) );
+
+						break;
+					}
+					case "transfers" : { // unimplemented
+						$node = $tnode->appendChild( $xml->createElement( "torrent_transfers_root" ) );
+						$node = $node->appendChild( $xml->createElement( "torrent_transfers" ) );
+
+						break;
+					}
+				}
+				// adding the download info to the xml
+				xmlrpc_multiappend( $xml, $node, $torrent );
+			} else {
+				$_SESSION["rtwi_err"] = "nohashfound";
+			}
+
+			$si_responses["bytes_down"] = $bytes_down;
+			$si_responses["bytes_up"] = $bytes_up;
+
+			// adding values to xml
+			prepare_serverinfo_responses( $si_responses, $message, $home_path, $config );
+
+			// addng some more values to xml (total up/down rate, limits)
+			$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
+			$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
+			$node->setAttribute( "value", $si_responses["bytes_down_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
+			$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
+			$node->setAttribute( "value", $si_responses["bytes_up_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
+			$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
+			$node->setAttribute( "value", $si_responses["download_rate_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
+			$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
+			$node->setAttribute( "value", $si_responses["upload_rate_value"] );
+
+			// decide what to send back to the browser
+			if ( $ajax === true ) {
+				$layout_file = "layout.ajax.index.xsl";
+			} else {
+				$layout_file = "layout.main.index.xsl";
+			}
+
+			break;
+		}
+		case "getfile" : { // download a file
+			// checking if users are allowed to download
+			if ( !$config["download"] ) {
+				$_SESSION["rtwi_err"] = "downloadnotallowed";
+				header( "location: {$url["index"]}" );
+				exit;
+			} elseif ( $id < 0 ) { // checking if the file id is given and is valid
+				$_SESSION["rtwi_err"] = "noidfound";
+				header( "location: {$url["index"]}" );
+				exit;
+			} else {
+				// retrieving server info
+				if ( !$xmlrpc->setmrequest( $xmlrpc_methods["si"] ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
 					break;
 				}
-				case "info" : {
-					// crate info nodes
-					$node = $tnode->appendChild( $xml->createElement( "torrent_info_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_info" ) );
-
+				$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+				// retrieving download info
+				if ( !$xmlrpc->setrequest( "download_list", array( $_SESSION["rtwi_view"] ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
 					break;
 				}
-				case "files" : {
-					// create file list nodes
-					$node = $tnode->appendChild( $xml->createElement( "torrent_files_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_files" ) );
-
-					// create downloads root direcrory node
-					$node = $node->appendChild( $xml->createElement( "files_root" ) );
-					$node = $node->appendChild( $xml->createElement( "directory" ) );
-					$node->setAttribute( "dirname", $torrent["d_base_filename"] );
-
-					$fst = getmicrotime();
-
-					// retreive file list info
-					$xmlrpc->setrequest( "f.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["f"] ) );
-					$xmlrpc->call();
-					$xmlrpc->parse();
-					$response = $xmlrpc->fetch();
-					// process the file info
-					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $xmlrpc_methods["f"] ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["f"][$r] );
-							$responses[$i][$methodval] = $response[$i][$r];
-						}
+				$torrents = $xmlrpc->fetch();
+
+				// checking if we've found the torrent
+				if ( in_array( $hash, $torrents ) ) {
+					// getting the filename
+					if ( !$xmlrpc->setmrequest( $xmlrpc_methods["g"], array( $hash, $id ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+						$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+						break;
 					}
-
-					// build som kind of struct
-					$dstruct = array();
-					for ( $i = 0; $i < $torrent["d_size_files"]; $i++ ) {
-						prepare_filelist_responses( $responses[$i], $message, $home_path, $si_responses["get_cwd"] );
-
-						$n = 0;
-						$tmp = &$dstruct;
-						foreach ( $responses[$i]["f_path_components"] as $key => $val ) {
-							if ( count( $responses[$i]["f_path_components"] ) == ++$n ) {
-								$tmp[$i] = $val;
-							} else {
-								if ( !isset( $tmp[$val] ) ) {
-									$tmp[$val] = array();
-								}
-								$tmp = &$tmp[$val];
-							}
-						}
-
-					}
-					// build an xml tree of the files
-					$fnode = build_xmltree( $dstruct, $node, $xml, $torrent["d_directory_value"], $responses );
-
-					$ftt = getmicrotime();
-
-					break;
+					$response = $xmlrpc->mfetch( $xmlrpc_methods["g"] );
+
+					// getting the absolute path of the download's directory
+					$d_directory_value = myrealpath( $response["d_directory"], $config["home_path"], $si_responses["get_cwd"] );
+				} else {
+					$_SESSION["rtwi_err"] = "nohashfound";
+					$layout_file = "layout.main.index.xsl";
 				}
-				case "trackers" : {
-					// creating tracker list nodes
-					$node = $tnode->appendChild( $xml->createElement( "torrent_trackers_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_trackers" ) );
-
-					// retrieving tracker list info
-					$xmlrpc->setrequest( "t.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["t"] ) );
-					$xmlrpc->call();
-					$xmlrpc->parse();
-					$response = $xmlrpc->fetch();
-					// processing the tracker info
-					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $xmlrpc_methods["t"] ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["t"][$r] );
-							$responses[$i][$methodval] = $response[$i][$r];
-						}
-					}
-					// adding an ID to each tracker in the list
-					for ( $i = 0; $i < $torrent["d_tracker_size"]; $i++ ) {
-						prepare_trackerlist_responses( $responses[$i], $message, $home_path );
-						$tracnode = $node->appendChild( $xml->createElement( "tracker" ) );
-						$tracnode->setAttribute( "id", $i );
-						xmlrpc_multiappend( $xml, $tracnode, $responses[$i] );
-					}
-
-					break;
+			}
+
+			break;
+		}
+		default : { // torrents
+			// retrieving server info
+			if ( !$xmlrpc->setmrequest( $xmlrpc_methods["si"] ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+				break;
+			}
+			$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+			// creating torrents node
+			$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
+			// adding sort view select
+			addviewtypes( $xml, $root, $tnode, $si_responses["view_list"], $viewtypes );
+			// adding auto-refresh select
+			if ( $config["refresh"] ) {
+				addrefreshrates( $xml, $root, $tnode, $refreshrates );
+			}
+			// adding language select
+			if ( $config["language"] ) {
+				addlanguages( $xml, $root, $tnode, $languages );
+			}
+			// retrieving download info
+			if ( !$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+				break;
+			}
+			$response = $xmlrpc->fetch();
+
+			// valirables for counting total up/down rate
+			$bytes_down = 0;
+			$bytes_up = 0;
+			// process the download info
+			for ( $i = 0; $i < count( $response ); $i++ ) {
+				for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
+					$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
+					$d_responses[$i][$methodval] = $response[$i][$r];
 				}
-				case "chunks" : { // unimplemented
-					$node = $tnode->appendChild( $xml->createElement( "torrent_chunks_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_chunks" ) );
-
-					break;
-				}
-				case "transfers" : { // unimplemented
-					$node = $tnode->appendChild( $xml->createElement( "torrent_transfers_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_transfers" ) );
-
-					break;
-				}
-			}
-			// adding the download info to the xml
-			xmlrpc_multiappend( $xml, $node, $torrent );
-		} else {
-			$_SESSION["rtwi_err"] = "nohashfound";
-		}
-
-		$si_responses["bytes_down"] = $bytes_down;
-		$si_responses["bytes_up"] = $bytes_up;
-
-		// adding values to xml
-		prepare_serverinfo_responses( $si_responses, $message, $home_path, $config );
-
-		// addng some more values to xml (total up/down rate, limits)
-		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["download_rate_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
-
-		// decide what to send back to the browser
-		if ( $ajax === true ) {
-			$layout_file = "layout.ajax.index.xsl";
-		} else {
+				// oincreasing total up/down rate with the current download's rates
+				$bytes_down += $d_responses[$i]["d_down_rate"];
+				$bytes_up += $d_responses[$i]["d_up_rate"];
+
+				// formatting and inserting values to xml
+				prepare_downloadlist_responses( $d_responses[$i], $message, $home_path, $si_responses["get_cwd"] );
+				$ttnode = $tnode->appendChild( $xml->createElement( "torrent" ) );
+				xmlrpc_multiappend( $xml, $ttnode, $d_responses[$i] );
+			}
+
+			// setting total up/down rate
+			$si_responses["bytes_down"] = $bytes_down;
+			$si_responses["bytes_up"] = $bytes_up;
+
+			// adding values to xml
+			prepare_serverinfo_responses( $si_responses, $message, $config );
+
+			// addng some more values to xml (total up/down rate, limits)
+			$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
+			$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
+			$node->setAttribute( "value", $si_responses["bytes_down_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
+			$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
+			$node->setAttribute( "value", $si_responses["bytes_up_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
+			$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
+			$node->setAttribute( "value", $si_responses["download_rate_value"] );
+			$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
+			$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
+			$node->setAttribute( "value", $si_responses["upload_rate_value"] );
+
 			$layout_file = "layout.main.index.xsl";
-		}
-
-		break;
-	}
-	case "getfile" : { // download a file
-		// checking if users are allowed to download
-		if ( !$config["download"] ) {
-			$_SESSION["rtwi_err"] = "downloadnotallowed";
-			header( "location: {$url["index"]}" );
-			exit;
-		} elseif ( $id < 0 ) { // checking if the file id is given and is valid
-			$_SESSION["rtwi_err"] = "noidfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		} else {
-			// retrieving server info
-			$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-			$xmlrpc->call();
-			$xmlrpc->parse();
-			$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-
-			// retrieving download info
-			$xmlrpc->setrequest( "download_list", array( $_SESSION["rtwi_view"] ) );
-			$xmlrpc->call();
-			$xmlrpc->parse();
-			$torrents = $xmlrpc->fetch();
-
-			// checking if we've found the torrent
-			if ( in_array( $hash, $torrents ) ) {
-				// getting the filename
-				$xmlrpc->setmrequest( $xmlrpc_methods["g"], array( $hash, $id ) );
-				$xmlrpc->call();
-				$xmlrpc->parse();
-				$response = $xmlrpc->mfetch( $xmlrpc_methods["g"] );
-
-				// getting the absolute path of the download's directory
-				$d_directory_value = myrealpath( $response["d_directory"], $home_path, $si_responses["get_cwd"] );
-			} else {
-				$_SESSION["rtwi_err"] = "nohashfound";
-				$layout_file = "layout.main.index.xsl";
-			}
-		}
-
-		break;
-	}
-	default : { // torrents
-		// retrieving server info
-		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-
-		// creating torrents node
-		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
-		// adding sort view select
-		addviewtypes( $xml, $root, $tnode, $si_responses["view_list"], $viewtypes );
-		// adding auto-refresh select
-		if ( $config["refresh"] ) {
-			addrefreshrates( $xml, $root, $tnode, $refreshrates );
-		}
-		// adding language select
-		if ( $config["language"] ) {
-			addlanguages( $xml, $root, $tnode, $languages );
-		}
-
-		// retrieving download info
-		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$response = $xmlrpc->fetch();
-
-		// valirables for counting total up/down rate
-		$bytes_down = 0;
-		$bytes_up = 0;
-		// process the download info
-		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
-				$d_responses[$i][$methodval] = $response[$i][$r];
-			}
-			// oincreasing total up/down rate with the current download's rates
-			$bytes_down += $d_responses[$i]["d_down_rate"];
-			$bytes_up += $d_responses[$i]["d_up_rate"];
-
-			// formatting and inserting values to xml
-			prepare_downloadlist_responses( $d_responses[$i], $message, $home_path, $si_responses["get_cwd"] );
-			$ttnode = $tnode->appendChild( $xml->createElement( "torrent" ) );
-			xmlrpc_multiappend( $xml, $ttnode, $d_responses[$i] );
-		}
-
-		// setting total up/down rate
-		$si_responses["bytes_down"] = $bytes_down;
-		$si_responses["bytes_up"] = $bytes_up;
-
-		// adding values to xml
-		prepare_serverinfo_responses( $si_responses, $message, $config );
-
-		// addng some more values to xml (total up/down rate, limits)
-		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["download_rate_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
-
+
+			break;
+		}
+	}
+} elseif ( isset( $xmlrpc ) ) {
+	$_SESSION["rtwi_err"] = $xmlrpc->getlasterror();
+
+	if ( $ajax === true ) {
+		$layout_file = "layout.ajax.index.xsl";
+	} else {
 		$layout_file = "layout.main.index.xsl";
-
-		break;
+	}
+} else {
+	// adding language select
+	if ( $config["language"] ) {
+		addlanguages( $xml, $root, $root, $languages );
+	}
+
+	if ( $ajax === true ) {
+		$layout_file = "layout.ajax.index.xsl";
+	} else {
+		$layout_file = "layout.main.index.xsl";
 	}
 }
@@ -1060,6 +1098,16 @@
 // adding (error) message to xml
 if ( isset( $_SESSION["rtwi_err"] ) && $_SESSION["rtwi_err"] != "" ) {
+	if ( is_array( $_SESSION["rtwi_err"] ) ) {
+		$lasterr = array_pop( $_SESSION["rtwi_err"] );
+		$preverr = array_pop( $_SESSION["rtwi_err"] );
+		$_SESSION["rtwi_err"] = $lasterr;
+	}
 	$node = $root->appendChild( $xml->createElement( "err" ) );
-	$node = $node->appendChild( $xml->createElement( "errmsg", $message[$_SESSION["rtwi_err"]] ) );
+	$mnode = $node->appendChild( $xml->createElement( "errmsg" ) );
+	$mnode->appendChild( $xml->createElement( "msg", $message[$_SESSION["rtwi_err"]] ) );
+	if ( in_array( $_SESSION["rtwi_err"], array( "xmlrpc_fault", "xmlrpc_scgi_connect_failed", "xmlrpc_gw_connect_failed", "xmlrpc_request_invalidtype" ) ) ) {
+		$mnode = $node->appendChild( $xml->createElement( "errmsg" ) );
+		$mnode->appendChild( $xml->createElement( "msg", isset( $preverr ) ? $preverr : $_SESSION["rtwi_err"] ) );
+	}
 
 	$_SESSION["rtwi_err"] = "";
Index: input.php
===================================================================
--- input.php	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ input.php	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -75,5 +75,4 @@
 				$_SESSION["rtwi_password"] = $_REQUEST["loginpass"];
 			}
-
 
 			if ( isset( $_REQUEST["rememberme"] ) && $_REQUEST["rememberme"] == "on" ) {
@@ -123,7 +122,9 @@
 	case "changeview" : { // change view
 		if ( isset( $_REQUEST["viewtype"] ) && $_REQUEST["viewtype"] != "" ) {
-			$xmlrpc->setrequest( "view_list", "" );
-			$xmlrpc->call();
-			$xmlrpc->parse();
+			if ( !$xmlrpc->setrequest( "view_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+				header( "location: {$config["index"]}" );
+				exit;
+			}
 			$viewtypes = $xmlrpc->fetch();
 
@@ -224,8 +225,14 @@
 			}
 
-			$xmlrpc->setrequest( "set_upload_rate", $upspeed * 1024 );
-			$xmlrpc->call();
-			$xmlrpc->setrequest( "set_download_rate", $downspeed * 1024 );
-			$xmlrpc->call();
+			if ( !$xmlrpc->setrequest( "set_upload_rate", $upspeed * 1024 ) || !$xmlrpc->call() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+				header( "location: {$_SESSION["rtwi_lastpage"]}" );
+				exit;
+			}
+			if ( !$xmlrpc->setrequest( "set_download_rate", $downspeed * 1024 ) || !$xmlrpc->call() ) {
+				$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+				header( "location: {$_SESSION["rtwi_lastpage"]}" );
+				exit;
+			}
 
 			$_SESSION["rtwi_err"] = "succthrottlechange";
@@ -247,12 +254,16 @@
 		}
 
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$torrents = $xmlrpc->fetch();
-
-		$xmlrpc->setmrequest( array( "get_directory", "system.get_cwd" ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}?mod=addtorrent}" );
+			exit;
+		}
+		$torrents = $xmlrpc->fetch();
+
+		if ( !$xmlrpc->setmrequest( array( "get_directory", "system.get_cwd" ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}?mod=addtorrent}" );
+			exit;
+		}
 		$directories = $xmlrpc->fetch();
 		$directory = $directories[0][0];
@@ -355,9 +366,13 @@
 
 		if ( $_REQUEST["tfmethod"] == "url" || isset( $_REQUEST["keeptorrentfile"] ) && $_REQUEST["keeptorrentfile"] == "on"  ) {
-			$xmlrpc->setrequest( "load_verbose", $param );
-		} else {
-			$xmlrpc->setrequest( "load_raw_verbose", $param );
-		}
-		$xmlrpc->call();
+			$method = "load_verbose";
+		} else {
+			$method = "load_raw_verbose";
+		}
+		if ( !$xmlrpc->setrequest( $method, $param ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		$_SESSION["rtwi_err"] = "succtorrentload";
@@ -368,7 +383,9 @@
 	}
 	case "torrentstart" : { // start a torrent
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 		$torrents = $xmlrpc->fetch();
 
@@ -379,6 +396,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.start", $hash );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "d.start", $hash ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -391,7 +411,9 @@
 	}
 	case "torrentopen" : { // open a torrent
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 		$torrents = $xmlrpc->fetch();
 
@@ -402,6 +424,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.open", $hash );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "d.open", $hash ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -414,7 +439,9 @@
 	}
 	case "torrentstop" : { // stop a torrent
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 		$torrents = $xmlrpc->fetch();
 
@@ -425,6 +452,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.stop", $hash );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "d.stop", $hash ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -437,7 +467,9 @@
 	}
 	case "torrentclose" : { // close a torrent
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 		$torrents = $xmlrpc->fetch();
 
@@ -448,6 +480,9 @@
 		}
 
-		$xmlrpc->setmrequest( array( "d.stop", "d.close" ), array( $hash ) );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setmrequest( array( "d.stop", "d.close" ), array( $hash ) ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -460,7 +495,9 @@
 	}
 	case "torrentcheckhash" : { // check hash for a torrent
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 		$torrents = $xmlrpc->fetch();
 
@@ -471,6 +508,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.check_hash", $hash );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "d.check_hash", $hash ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -483,7 +523,9 @@
 	}
 	case "torrentremove" : { // remove a torrent
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 		$torrents = $xmlrpc->fetch();
 
@@ -494,6 +536,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.erase", $hash );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "d.erase", $hash ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -512,7 +557,9 @@
 		}
 
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 		$torrents = $xmlrpc->fetch();
 
@@ -523,13 +570,22 @@
 		}
 
-		$xmlrpc->setrequest( "d.get_base_path", $hash );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "d.get_base_path", $hash ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
 		$response = $xmlrpc->fetch();
 
-		$xmlrpc->setrequest( "execute", array( "rm", "-rf", "--", $response ) );
-		$xmlrpc->call();
-		$xmlrpc->setrequest( "d.erase", $hash );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "execute", array( "rm", "-rf", "--", $response ) ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+		if ( !$xmlrpc->setrequest( "d.erase", $hash ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -544,6 +600,9 @@
 		switch ( $_REQUEST["task"] ) {
 			case "start" : {
-				$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.start=" ) );
-				$xmlrpc->call();
+				if ( !$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.start=" ) ) || !$xmlrpc->call() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+					header( "location: {$config["index"]}" );
+					exit;
+				}
 
 				sleep( 1 );
@@ -556,6 +615,9 @@
 			}
 			case "stop" : {
-				$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.stop=" ) );
-				$xmlrpc->call();
+				if ( !$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.stop=" ) ) || !$xmlrpc->call() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+					header( "location: {$config["index"]}" );
+					exit;
+				}
 
 				sleep( 1 );
@@ -568,6 +630,9 @@
 			}
 			case "open" : {
-				$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.open=" ) );
-				$xmlrpc->call();
+				if ( !$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.open=" ) ) || !$xmlrpc->call() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+					header( "location: {$config["index"]}" );
+					exit;
+				}
 
 				sleep( 1 );
@@ -580,6 +645,9 @@
 			}
 			case "close" : {
-				$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.stop=", "d.close=" ) );
-				$xmlrpc->call();
+				if ( !$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.stop=", "d.close=" ) ) || !$xmlrpc->call() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+					header( "location: {$config["index"]}" );
+					exit;
+				}
 
 				sleep( 1 );
@@ -592,6 +660,9 @@
 			}
 			case "checkhash" : {
-				$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.check_hash=" ) );
-				$xmlrpc->call();
+				if ( !$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.check_hash=" ) ) || !$xmlrpc->call() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+					header( "location: {$config["index"]}" );
+					exit;
+				}
 
 				sleep( 1 );
@@ -604,6 +675,9 @@
 			}
 			case "remove" : {
-				$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.erase=" ) );
-				$xmlrpc->call();
+				if ( !$xmlrpc->setrequest( "d.multicall", array( $_SESSION["rtwi_view"], "d.erase=" ) ) || !$xmlrpc->call() ) {
+					$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+					header( "location: {$config["index"]}" );
+					exit;
+				}
 
 				sleep( 1 );
@@ -627,7 +701,10 @@
 	}
 	case "changepriority" : { // set priority
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
 		$torrents = $xmlrpc->fetch();
 
@@ -652,6 +729,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.set_priority", array( $hash, $priority ) );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "d.set_priority", array( $hash, $priority ) ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -664,9 +744,4 @@
 	}
 	case "changefilepriority" : { // set file priority
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$torrents = $xmlrpc->fetch();
-
 		if ( isset( $_REQUEST["ajax"] ) && $_REQUEST["ajax"] == "true" ) {
 			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files&ajax=true";
@@ -674,4 +749,11 @@
 			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files";
 		}
+
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
+		$torrents = $xmlrpc->fetch();
 
 		if ( !in_array( $hash, $torrents ) ) {
@@ -690,7 +772,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.get_size_files", $hash );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "d.get_size_files", $hash ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
 		$response = $xmlrpc->fetch();
 
@@ -716,9 +800,15 @@
 		}
 
-		$xmlrpc->setrequest( "f.set_priority", array( $hash, $id, $filepriority ) );
-		$xmlrpc->call();
-
-		$xmlrpc->setrequest( "d.update_priorities", $hash );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "f.set_priority", array( $hash, $id, $filepriority ) ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
+
+		if ( !$xmlrpc->setrequest( "d.update_priorities", $hash ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -731,9 +821,4 @@
 	}
 	case "changedirpriority" : { // set file priority
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$torrents = $xmlrpc->fetch();
-
 		if ( isset( $_REQUEST["ajax"] ) && $_REQUEST["ajax"] == "true" ) {
 			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files&ajax=true";
@@ -741,4 +826,11 @@
 			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files";
 		}
+
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
+		$torrents = $xmlrpc->fetch();
 
 		if ( !in_array( $hash, $torrents ) ) {
@@ -776,7 +868,9 @@
 		$len = strlen( $dir );
 
-		$xmlrpc->setrequest( "f.multicall", array( $hash, 0, "f.get_frozen_path=" ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "f.multicall", array( $hash, 0, "f.get_frozen_path=" ) ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
 		$files = $xmlrpc->fetch();
 
@@ -801,12 +895,17 @@
 		}
 
-		$xmlrpc->setumrequest( $request, $params );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$torrents = $xmlrpc->fetch();
-
-		$xmlrpc->setrequest( "d.update_priorities", $hash );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setumrequest( $request, $params ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
+		$torrents = $xmlrpc->fetch();
+
+		if ( !$xmlrpc->setrequest( "d.update_priorities", $hash ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
+
 		$torrents = $xmlrpc->fetch();
 
@@ -820,9 +919,4 @@
 	}
 	case "changetrackerenabled" : { // set if tracker is enabled
-		$xmlrpc->setrequest( "download_list", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$torrents = $xmlrpc->fetch();
-
 		if ( isset( $_REQUEST["ajax"] ) && $_REQUEST["ajax"] == "true" ) {
 			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=trackers&ajax=true";
@@ -830,4 +924,11 @@
 			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=trackers";
 		}
+
+		if ( !$xmlrpc->setrequest( "download_list", "" ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
+		$torrents = $xmlrpc->fetch();
 
 		if ( !in_array( $hash, $torrents ) ) {
@@ -846,7 +947,9 @@
 		}
 
-		$xmlrpc->setrequest( "d.get_size_trackers", $hash );
-		$xmlrpc->call();
-		$xmlrpc->parse();
+		if ( !$xmlrpc->setrequest( "d.get_tracker_size", $hash ) || !$xmlrpc->call() || !$xmlrpc->parse() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
 		$response = $xmlrpc->fetch();
 
@@ -872,6 +975,9 @@
 		}
 
-		$xmlrpc->setrequest( "t.set_enabled", array( $hash, $id, $trackerenabled ) );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "t.set_enabled", array( $hash, $id, $trackerenabled ) ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$tourl}" );
+			exit;
+		}
 
 		sleep( 1 );
@@ -900,6 +1006,9 @@
 		$dhtstatus = $dhtstatus == 1 ? "on" : "off";
 
-		$xmlrpc->setrequest( "dht", $dhtstatus );
-		$xmlrpc->call();
+		if ( !$xmlrpc->setrequest( "dht", $dhtstatus ) || !$xmlrpc->call() ) {
+			$_SESSION["rtwi_err"] = $xmlrpc->geterrors();
+			header( "location: {$config["index"]}?mod=serverinfo" );
+			exit;
+		}
 
 		$_SESSION["rtwi_err"] = $dhtstatus == "on" ? "succdhtstart" : "succdhtstop";
Index: themes/default_ajax/inc/style.css
===================================================================
--- themes/default_ajax/inc/style.css	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ themes/default_ajax/inc/style.css	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -123,6 +123,5 @@
 }
 
-#err, #aerr {
-		height: 1.5em;
+#err {
 		margin: 0 0 1em 0;
 		color: #aa0000;
@@ -579,9 +578,2 @@
 		margin: 0 0 0 .5em;
 }
-
-
-
-
-
-
-
Index: themes/default_ajax/layout.ajax.index.xsl
===================================================================
--- themes/default_ajax/layout.ajax.index.xsl	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ themes/default_ajax/layout.ajax.index.xsl	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -12,8 +12,12 @@
 
  <xsl:template match="err">
-  <div id="aerr">
-   <span title="{/root/labels/clicktohide}" onmouseover="this.style.cursor='pointer';" onclick="document.getElementById( 'aerr' ).style.display='none';">
-    <xsl:value-of select="errmsg" />
-   </span>
+  <div id="err" title="{/root/labels/clicktohide}" onmouseover="this.style.cursor='pointer';" onclick="this.parentNode.removeChild( this );">
+   <xsl:apply-templates select="errmsg" />
+  </div>
+ </xsl:template>
+ 
+ <xsl:template match="errmsg">
+  <div>
+   <xsl:value-of select="msg" />
   </div>
  </xsl:template>
Index: themes/default_ajax/layout.main.index.xsl
===================================================================
--- themes/default_ajax/layout.main.index.xsl	(revision ac81d6ab67f361949a2231eeea3a030ff5f7987e)
+++ themes/default_ajax/layout.main.index.xsl	(revision db24b1974ada4954f70f18a6b6f6a53bbdc83b31)
@@ -83,10 +83,15 @@
 
  <xsl:template match="err">
-  <div id="err">
-   <span title="{/root/labels/clicktohide}" onmouseover="this.style.cursor='pointer';" onclick="document.getElementById( 'err' ).style.display='none';">
-    <xsl:value-of select="errmsg" />
-   </span>
+  <div id="err" title="{/root/labels/clicktohide}" onmouseover="this.style.cursor='pointer';" onclick="this.parentNode.removeChild( this );">
+   <xsl:apply-templates select="errmsg" />
   </div>
  </xsl:template>
+ 
+ <xsl:template match="errmsg">
+  <div>
+   <xsl:value-of select="msg" />
+  </div>
+ </xsl:template>
+
 
  <xsl:template match="addtorrent">
