Index: !install.txt
===================================================================
--- !install.txt	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ !install.txt	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -1,4 +1,4 @@
 requirements:
--rtorrent 0.7.8, compiled with "--with-xmlrpc-c"
+-rtorrent 0.8.0, compiled with "--with-xmlrpc-c"
  -xmlrpc >= 1.07
 -some webserver
@@ -25,7 +25,7 @@
 to install libtorrent, follow the next steps, as root:
 	mkdir /usr/src/libtorrent
-	wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.11.9.tar.gz
-	tar xvf libtorrent-0.11.9.tar.gz
-	cd /usr/src/libtorrent-0.11.9
+	wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.12.0.tar.gz
+	tar xvf libtorrent-0.12.0.tar.gz
+	cd /usr/src/libtorrent-0.12.0
 	./configure
 	make
@@ -34,7 +34,7 @@
 to install rtorrent, follow the next steps, as root:
 	mkdir /usr/src/rtorrent
-	wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.7.9.tar.gz
-	tar xvf rtorrent-0.7.9.tar.gz
-	cd /usr/src/rtorrent-0.7.9
+	wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.8.0.tar.gz
+	tar xvf rtorrent-0.8.0.tar.gz
+	cd /usr/src/rtorrent-0.8.0
 	./configure --with-xmlrpc-c
 	make
Index: includes/classes/xmlrpc_handler.inc.php
===================================================================
--- includes/classes/xmlrpc_handler.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/classes/xmlrpc_handler.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -0,0 +1,134 @@
+<?php
+
+class xmlrpc_handler {
+	var $socket;
+	var $host;
+	var $port;
+	var $timeout;
+	var $request;
+	var $response;
+	var $calls;
+	var $mcalls;
+	var $times;
+	var $mtimes;
+
+	function __construct( $xmlrpc_array ) {
+		if ( isset( $xmlrpc_array["socket"] ) ) {
+			$this->socket	= $xmlrpc_array["socket"];
+		} else {
+			$this->host		= $xmlrpc_array["host"];
+			$this->port		= $xmlrpc_array["port"];
+		}
+		$this->timeout	= $xmlrpc_array["timeout"];
+		$this->request	= null;
+		$this->response	= null;
+		$this->calls	= 0;
+		$this->mcalls	= 0;
+	}
+
+	function setmrequest( $methods, $params = array() ) {
+		$this->request = array();
+		foreach ( $methods as $methodkey => $methodval ) {
+			$this->request[] = array( "methodName" => $methodval, "params" => $params );
+		}
+		$this->request = xmlrpc_encode_request( "system.multicall", array( $this->request ) );
+	}
+
+	function setrequest( $method, $attributes ) {
+		$this->request = xmlrpc_encode_request( $method, $attributes );
+	}
+
+	function call() {
+		$st = getmicrotime();
+
+		$len = strlen( $this->request );
+		$headers = "CONTENT_LENGTH\0{$len}\0";
+		$headers .= "SCGI\01\0";
+		$len = strlen( $headers );
+		$out = "{$len}:{$headers},{$this->request}";
+
+		if ( isset( $this->socket ) ) {
+			$fp = fsockopen( "unix://{$this->socket}", $this->port, $errno, $errstr, $this->timeout );
+		} else {
+			$fp = fsockopen( $this->host, $this->port, $errno, $errstr, $this->timeout );
+		}
+		if ( $fp ) {
+			fwrite( $fp, $out );
+			do {
+				$line = fgets( $fp );
+			} while ( trim( $line ) != "" );
+			
+			if ( ( $this->response = stream_get_contents( $fp ) ) !== false ) {
+				$tt = getmicrotime();
+				$this->calls++;
+				$this->times = $this->times + $tt - $st;
+
+				return true;
+			} 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 false;
+		}
+	}
+
+	function parse() {
+		$this->response = preg_replace( "/i8|ex\.i8/", "string", $this->response );
+		if ( ( $this->response = xmlrpc_decode( $this->response ) ) !== false ) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	function mfetch( $methods ) {
+		$r = -1;
+		$responses = array();
+//print_r( $this->response );
+		foreach ( $methods as $methodkey => $methodval ) {
+			if ( $methodval[1] == "." ) {
+				$prefix = substr( $methodval, 0, 1 );
+				$methodval = substr( $methodval, 5 );
+				$methodval = "{$prefix}{$methodval}";
+			} elseif ( strlen( $methodval ) > 6 && $methodval[6] == "." ) {
+				$prefix = substr( $methodval, 0, 1 );
+				$methodval = substr( $methodval, 7 );
+				$methodval = "{$methodval}";
+			} elseif ( $methodval == "view_list" ) {
+			} elseif ( substr( $methodval, 0, 3 ) == "dht" ) {
+			} else {
+				$methodval = substr( $methodval, 4 );
+			}
+			$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];
+				}
+			}
+		}
+
+		return $responses;
+	}
+
+	function fetch() {
+		return $this->response;
+	}
+
+}
+
+?>
Index: cludes/config.inc.php
===================================================================
--- includes/config.inc.php	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ 	(revision )
@@ -1,73 +1,0 @@
-<?php
-
-/*******************************
-* path settings
-*******************************/
-
-// URLs
-$url["base"]	= "http://rtwi.cyla.homelinux.net/";	// base url
-$url["index"]	= "index.html";				// index page
-$url["input"]	= "input.php";				// input file (for forms)
-$url["full"]	= "{$url["base"]}/{$url["index"]}";	// absolute url of the index page
-
-/*******************************
-* xmlrpc settings
-*******************************/
-
-$xmlrpc_array = array(
-	"host"		=> "127.0.0.1",	// ip address of rtorrent
-	"port"		=> 0,		// scgi port - we will set this depending on the user's settings
-	"timeout"	=> 10,		// connection timeout
-);
-
-/*******************************
-* user settings
-*******************************/
-
-// home directories (with heading and trailing slash)
-$home_path = "/home/";
-
-// array of users, each, with the sha1 hash of the password, and the scgi port of the rtorrent -- you can add users here
-$users = array(
-	"user1"	=> array( "pass" => "7e240de74fb1ed08fa08d38063f6a6a91462a815", "port"	=> "36100" ),
-);
-
-/*******************************
-* other settings
-*******************************/
-
-// do a directory tree - set to false (witouth the quotes), if your webserver is running on a slow machine, and you have torrents with a lots of files (a few hundreds)
-$config["dodirtree"] = true;
-
-// true if ajax is allowed
-$config["allow"]["ajax"] = true;
-
-// true if dht is enabled
-$config["allow"]["dht"] = true;
-
-// true if users are allowed to download finished files from the webui
-$config["allow"]["download"] = true;
-
-// true if users are allowed to erase downloaded data from the webui
-$config["allow"]["erase"] = true;
-
-// true if hiding the filelist is allowed
-$config["allow"]["hidedirtree"] = true;
-
-// true if users are allowed to set a meta-refresh interval
-$config["allow"]["refresh"] = true;
-
-// true if users are allowed to set throttle
-$config["allow"]["throttle"] = true;
-
-/*******************************
-* theme and lingual settings
-*******************************/
-
-// language (only english is available atm)
-$lang = "en";
-
-// site theme (look for themes in the "themes" directory)
-$site_theme = "default_ajax";
-
-?>
Index: includes/config.inc.php.sample
===================================================================
--- includes/config.inc.php.sample	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/config.inc.php.sample	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -0,0 +1,76 @@
+<?php
+
+/*******************************
+* path settings
+*******************************/
+
+// URLs
+$url["base"]	= "http://rtwi.cyla.homelinux.net/";	// base url
+$url["index"]	= "index.html";				// index page
+$url["input"]	= "input.php";				// input file (for forms)
+$url["full"]	= "{$url["base"]}/{$url["index"]}";	// absolute url of the index page
+
+/*******************************
+* xmlrpc settings
+*******************************/
+
+$xmlrpc_array = array(
+	"host"		=> "127.0.0.1",	// ip address of rtorrent
+	"port"		=> 0,		// scgi port - we will set this depending on the user's settings
+	"timeout"	=> 10,		// connection timeout
+);
+
+/*******************************
+* user settings
+*******************************/
+
+// home directories (with heading and trailing slash)
+$home_path = "/home/";
+
+// array of users, each, with the sha1 hash of the password, and the scgi port of the rtorrent -- you can add users here
+$users = array(
+	"user1"	=> array( "pass" => "7e240de74fb1ed08fa08d38063f6a6a91462a815", "port"	=> "36100" ),
+);
+
+/*******************************
+* other settings
+*******************************/
+
+// do a directory tree - set to "false" (witouth the quotes), if your webserver is running on a slow machine, and you have torrents with a lots of files (a few hundreds)
+$config["dodirtree"] = true;
+
+// true if ajax is allowed
+$config["allow"]["ajax"] = true;
+
+// true if dht is enabled
+$config["allow"]["dht"] = false;
+
+// true if users are allowed to download finished files from the webui
+$config["allow"]["download"] = true;
+
+// true if users are allowed to erase downloaded data from the webui
+$config["allow"]["erase"] = true;
+
+// true if hiding the filelist is allowed
+$config["allow"]["hidedirtree"] = true;
+
+// true if users are allowed to set the language of the web interface
+$config["allow"]["language"] = true;
+
+// true if users are allowed to set a meta-refresh interval
+$config["allow"]["refresh"] = true;
+
+// true if users are allowed to set throttle
+$config["allow"]["throttle"] = true;
+
+/*******************************
+* theme and lingual settings
+*******************************/
+
+// language (only english is available atm)
+$lang = "en";
+
+// site theme (look for themes in the "themes" directory)
+$site_theme = "default_ajax";
+
+?>
Index: includes/messages.en.inc.php
===================================================================
--- includes/messages.en.inc.php	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ includes/messages.en.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -39,6 +39,10 @@
 	"badpriorityfound"			=> "Bad priority was given",
 
+	"noviewtype"				=> "No view was given",
 	"badviewtype"				=> "Bad view was given",
+	"norefreshrate"				=> "No refresh rate was given",
 	"badrefreshrate"			=> "Bad refresh rate was given",
+	"nolanguage"				=> "No language was given",
+	"badlanguage"				=> "Bad language was given (no translation is available for this language)",
 
 	"succtorrentload"			=> "Torrent loaded",
@@ -64,4 +68,5 @@
 	"succviewchange"			=> "View changed",
 	"succrefreshchange"			=> "Refresh rate changed",
+	"succlanguagechange"			=> "Language changed",
 	"succdhtstart"				=> "DHT server started",
 	"succdhtstop"				=> "DHT server stopped",
@@ -71,13 +76,4 @@
 	"refreshnotallowed"			=> "You are not allowed to set a meta-refresh interval",
 	"throttlenotallowed"			=> "You are not allowed to set throttle",
-
-	"viewtype_main"				=> "Main",
-	"viewtype_name"				=> "Name",
-	"viewtype_started"			=> "Started",
-	"viewtype_stopped"			=> "Stopped",
-	"viewtype_complete"			=> "Complete",
-	"viewtype_incomplete"			=> "Incomplete",
-	"viewtype_hashing"			=> "Hashing",
-	"viewtype_seeding"			=> "Seeding",
 
 	"no"					=> "No",
@@ -113,9 +109,13 @@
 	"d_state_0"				=> "Stopped",
 	"d_state_1"				=> "Started",
-	"f_is_open_0"				=> "Closed",
-	"f_is_open_1"				=> "Open",
+	"f_open_0"				=> "Closed",
+	"f_open_1"				=> "Open",
 	"f_priority_0"				=> "Off",
 	"f_priority_1"				=> "Normal",
 	"f_priority_2"				=> "High",
+	"p_encrypted_0"				=> "Plain",
+	"p_encrypted_1"				=> "Encrypted",
+	"p_incoming_0"				=> "Outgoing",
+	"p_incoming_1"				=> "Incoming",
 	"t_enabled_0"				=> "Disabled",
 	"t_enabled_1"				=> "Enabled",
@@ -124,4 +124,6 @@
 	"t_type_1"				=> "TCP",
 	"t_type_2"				=> "UDP",
+	"dht_0"					=> "Stopped",
+	"dht_1"					=> "Started",
 
 	"bind_0000"				=> "All IP addresses",
@@ -130,13 +132,29 @@
 );
 
-$refresh = array(
+$viewtypes = array(
+	"viewtype_main"				=> "Main",
+	"viewtype_default"			=> "Default",
+	"viewtype_name"				=> "Name",
+	"viewtype_started"			=> "Started",
+	"viewtype_stopped"			=> "Stopped",
+	"viewtype_complete"			=> "Complete",
+	"viewtype_incomplete"			=> "Incomplete",
+	"viewtype_hashing"			=> "Hashing",
+	"viewtype_seeding"			=> "Seeding",
+	"viewtype_scheduler"			=> "Scheduler",
+);
+
+$refreshrates = array(
 	"refreshrate_0"				=> "Off",
 	"refreshrate_60"			=> "1 minute",
-	"refreshrate_120"			=> "2 minutes",
 	"refreshrate_180"			=> "3 minutes",
-	"refreshrate_300"			=> "5 minutes",
-	"refreshrate_600"			=> "10 minutes",
+	"refreshrate_420"			=> "7 minutes",
 	"refreshrate_900"			=> "15 minutes",
-	"refreshrate_1200"			=> "20 minutes",
+	"refreshrate_1500"			=> "25 minutes",
+);
+
+$languages = array(
+	"en"					=> "English",
+	"hu"					=> "Hungarian",
 );
 
@@ -145,5 +163,4 @@
 	"title"					=> "rTWi - The rTorrent Web interface",
 	"description"				=> "rTWi - The rTorrent Web interface",
-	"keywords"				=> "rTWi - The rTorrent Web interface",
 	"author"				=> "Gabor Hudiczius",
 	"mailto"				=> "ghudiczius@gmail.com?subject=rTWi - The rTorrent Web interface",
@@ -152,4 +169,5 @@
 	"username"				=> "Username",
 	"password"				=> "Password",
+	"rememberme"				=> "Remember me",
 	"login"					=> "Login",
 
@@ -180,7 +198,13 @@
 	"refresh"				=> "Refresh",
 	"selectrefreshrate"			=> "Select refresh rate",
+	"language"				=> "Language",
+	"selectlanguage"			=> "Select language",
 
 	"areyousure"				=> "Are you sure?",
 	"areyousureerase"			=> "Are you sure? All downloaded data will be erased.",
+
+	"homepage"				=> "rTWi project homepage",
+
+	"highest"				=> "highest",
 
 	// add torrent
@@ -293,4 +317,7 @@
 	"connectiontype"			=> "Connection type",
 	"trackers"				=> "Trackers",
+	"peersconnected"			=> "Peers connected",
+	"dmaxpeers"				=> "Maximum",
+	"dminpeers"				=> "Minimum",
 	"leechers"				=> "Leechers",
 	"seeders"				=> "Seeders",
@@ -308,4 +335,5 @@
 	"sessiondirectory"			=> "Session directory",
 	"hostname"				=> "Hostname",
+	"pid"					=> "PID",
 	"listeningipaddress"			=> "Listening IP address",
 	"reportedipaddress"			=> "IP address reported to the tracker",
@@ -313,4 +341,5 @@
 	"randomport"				=> "Random port",
 	"portrange"				=> "Port range",
+	"udptrackers"				=> "Use UDP trackers",
 	"changedhtstatus"			=> "Start/stop DHT server",
 	"dht"					=> "DHT server",
@@ -335,4 +364,15 @@
 	"receivebuffer"				=> "Receive buffer",
 
+	// peer list page
+	"address"				=> "Address",
+	"port"					=> "Port",
+	"up_rate"				=> "Up",
+	"down_rate"				=> "Down",
+	"peer_rate"				=> "Peer",
+	"pdone"					=> "Done",
+	"encrypted"				=> "Encrypted",
+	"incoming"				=> "Connection",
+	"pclientversion"			=> "Client version",
+
 	// tracker list page
 	"focus"					=> "Focus",
Index: includes/messages.hu.inc.php
===================================================================
--- includes/messages.hu.inc.php	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ includes/messages.hu.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -39,6 +39,10 @@
 	"badpriorityfound"			=> "Hibás prioritás",
 
+	"noviewtype"				=> "Nincs megadva nézet",
 	"badviewtype"				=> "Hibás nézet",
+	"norefreshrate"				=> "Nincs megadva intervallum",
 	"badrefreshrate"			=> "Hibás frissítési intervallum",
+	"nolanguage"				=> "Nincs megadva nyelv",
+	"badlanguage"				=> "Nincs ilyen nyelvi file",
 
 	"succtorrentload"			=> "Torrent betöltve",
@@ -64,4 +68,5 @@
 	"succviewchange"			=> "Nézet beállítva",
 	"succrefreshchange"			=> "Frissítés beállítva",
+	"succlanguagechange"			=> "Nyelv beállítva",
 	"succdhtstart"				=> "DHT szerver elindítva",
 	"succdhtstop"				=> "DHT szerver leállítva",
@@ -71,13 +76,4 @@
 	"refreshnotallowed"			=> "Nem vagy jogosult frissítés beállítására",
 	"throttlenotallowed"			=> "Nem vagy jogosult sebességkorlát beállítására",
-
-	"viewtype_main"				=> "Alapértelmezett",
-	"viewtype_name"				=> "Név szerint",
-	"viewtype_started"			=> "Elindított torrentek",
-	"viewtype_stopped"			=> "Leállított torrentek",
-	"viewtype_complete"			=> "Befejezett torrentek",
-	"viewtype_incomplete"			=> "Befejezetlen torrentek",
-	"viewtype_hashing"			=> "Ellenőrzés alatt álló torrentek",
-	"viewtype_seeding"			=> "Feltöltések",
 
 	"no"					=> "Nem",
@@ -113,9 +109,13 @@
 	"d_state_0"				=> "Leállítva",
 	"d_state_1"				=> "Elindítva",
-	"f_is_open_0"				=> "Zárva",
-	"f_is_open_1"				=> "Nyitva",
+	"f_open_0"				=> "Zárva",
+	"f_open_1"				=> "Nyitva",
 	"f_priority_0"				=> "Leállítva",
 	"f_priority_1"				=> "Normál",
 	"f_priority_2"				=> "Magas",
+	"p_encrypted_0"				=> "Sima",
+	"p_encrypted_1"				=> "Titkosított",
+	"p_incoming_0"				=> "Kimenő",
+	"p_incoming_1"				=> "Bejövő",
 	"t_enabled_0"				=> "Letiltva",
 	"t_enabled_1"				=> "Engedélyezve",
@@ -124,4 +124,6 @@
 	"t_type_1"				=> "TCP",
 	"t_type_2"				=> "UDP",
+	"dht_0"					=> "Leállítva",
+	"dht_1"					=> "Elindítva",
 
 	"bind_0000"				=> "Minden IP cím",
@@ -130,13 +132,29 @@
 );
 
-$refresh = array(
+$viewtypes = array(
+	"viewtype_main"				=> "Fő nézet",
+	"viewtype_default"			=> "Alapértelmezett",
+	"viewtype_name"				=> "Név szerint",
+	"viewtype_started"			=> "Elindított torrentek",
+	"viewtype_stopped"			=> "Leállított torrentek",
+	"viewtype_complete"			=> "Befejezett torrentek",
+	"viewtype_incomplete"			=> "Befejezetlen torrentek",
+	"viewtype_hashing"			=> "Ellenőrzés alatt álló torrentek",
+	"viewtype_seeding"			=> "Feltöltések",
+	"viewtype_scheduler"			=> "A nemlétező ütemező",
+);
+
+$refreshrates = array(
 	"refreshrate_0"				=> "Letiltva",
 	"refreshrate_60"			=> "1 perc",
-	"refreshrate_120"			=> "2 perc",
 	"refreshrate_180"			=> "3 perc",
-	"refreshrate_300"			=> "5 perc",
-	"refreshrate_600"			=> "10 perc",
+	"refreshrate_420"			=> "7 perc",
 	"refreshrate_900"			=> "15 perc",
-	"refreshrate_1200"			=> "20 perc",
+	"refreshrate_1500"			=> "25 perc",
+);
+
+$languages = array(
+	"en"					=> "Angol",
+	"hu"					=> "Magyar",
 );
 
@@ -145,5 +163,4 @@
 	"title"					=> "rTWi - Az rTorrent Web interfész",
 	"description"				=> "rTWi - Az rTorrent Web interfész",
-	"keywords"				=> "rTWi - Az rTorrent Web interfész",
 	"author"				=> "Hudiczius Gábor",
 	"mailto"				=> "ghudiczius@gmail.com?subject=rTWi - Az rTorrent Web interfész",
@@ -152,4 +169,5 @@
 	"username"				=> "Felhasználó",
 	"password"				=> "Jelszó",
+	"rememberme"				=> "Jegyezz meg",
 	"login"					=> "Belépés",
 
@@ -180,7 +198,13 @@
 	"refresh"				=> "Frissítés",
 	"selectrefreshrate"			=> "Válassz frissítési időközt",
+	"language"				=> "Nyelv",
+	"selectlanguage"			=> "Válassz nyelvet",
 
 	"areyousure"				=> "Biztosan törlöd?",
 	"areyousureerase"			=> "Biztosan törlöd? Minden letöltött adat törlésre kerül.",
+
+	"homepage"				=> "rTWi honlap",
+
+	"highest"				=> "legmagasabb",
 
 	// add torrent
@@ -293,4 +317,7 @@
 	"connectiontype"			=> "Kapcsolat tipusa",
 	"trackers"				=> "Trackerek száma",
+	"peersconnected"			=> "Kapcsolódott peer-ek",
+	"dmaxpeers"				=> "Maximum",
+	"dminpeers"				=> "Minimum",
 	"leechers"				=> "Letöltők száma",
 	"seeders"				=> "Feltöltők száma",
@@ -308,4 +335,5 @@
 	"sessiondirectory"			=> "Munkamenet könyvtár",
 	"hostname"				=> "Hosztnév",
+	"pid"					=> "PID",
 	"listeningipaddress"			=> "Kapcsolatot fogadó IP cím",
 	"reportedipaddress"			=> "Tracker felé jelentett IP cím",
@@ -313,4 +341,5 @@
 	"randomport"				=> "Véletlen port",
 	"portrange"				=> "Porttartomány",
+	"udptrackers"				=> "UDP tracker-ek használata",
 	"changedhtstatus"			=> "DHT szerver elindítása/leállítása",
 	"dht"					=> "DHT szerver",
@@ -335,4 +364,15 @@
 	"receivebuffer"				=> "Bejövő puffer",
 
+	// peer list page
+	"address"				=> "IP cím",
+	"port"					=> "Port",
+	"up_rate"				=> "Fel",
+	"down_rate"				=> "Le",
+	"peer_rate"				=> "Peer",
+	"pdone"					=> "Kész",
+	"encrypted"				=> "Titkosítás",
+	"incoming"				=> "Kapcsolat",
+	"pclientversion"			=> "Kliens verziószám",
+
 	// tracker list page
 	"focus"					=> "Fókusz",
Index: index.html
===================================================================
--- index.html	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ index.html	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -91,4 +91,5 @@
 	$responses["handshake_log_value"] = $responses["handshake_log"] == 0 ? $message["no"] : $message["yes"];
 	$responses["safe_sync_value"] = $responses["safe_sync"] == 0 ? $message["no"] : $message["yes"];
+	$responses["use_udp_trackers_value"] = $responses["use_udp_trackers"] == 0 ? $message["no"] : $message["yes"];
 
 	$responses["bind_value"] = $responses["bind"] == "0.0.0.0" ? $message["bind_0000"] : $responses["bind"];
@@ -135,5 +136,5 @@
 		}
 
-		$responses["dht_statistics_active_value"] = $responses["dht_statistics_active"] == 0 ? $message["disabled"] : $message["enabled"];
+		$responses["dht_statistics_active_value"] = $responses["dht_statistics_active"] == 0 ? $message["dht_0"] : $message["dht_1"];
 	}
 
@@ -192,7 +193,4 @@
 	$responses["d_hash_checked_value"] = $responses["d_hash_checked"] == 1 ? $message["d_hash_checked_1"] : $message["d_hash_checked_0"];
 	$responses["d_hash_checking_value"] = $responses["d_hash_checking"] == 1 ? $message["d_hash_checking_1"] : $message["d_hash_checking_0"];
-	$responses["d_max_peers_value"] = $responses["d_max_peers"] == -1 ? $message["disabled"] : $responses["d_max_peers"];
-	$responses["d_max_uploads_value"] = $responses["d_max_uploads"] == -1 ? $message["disabled"] : $responses["d_max_uploads"];
-	$responses["d_min_peers_value"] = $responses["d_min_peers"] == -1 ? $message["disabled"] : $responses["d_min_peers"];
 	$responses["d_multi_file_value"] = $responses["d_multi_file"] == 1 ? $message["d_multi_file_multi"] : $message["d_multi_file_single"];
 	$responses["d_open_value"] = $responses["d_open"] == 1 ? $message["d_open_1"] : $message["d_open_0"];
@@ -264,5 +262,5 @@
 	$responses["f_size_bytes_suffix"] = $f_size_bytes_arr[1];
 
-	$responses["f_is_open_value"] = $responses["f_is_open"] == 1 ? $message["f_is_open_1"] : $message["f_is_open_0"];
+	$responses["f_open_value"] = $responses["f_open"] == 1 ? $message["f_open_1"] : $message["f_open_0"];
 	$responses["f_last_touched_value"] = date( "Y-m-d H:i:s", substr( $responses["f_last_touched"], 0, -6 ) );
 
@@ -288,4 +286,33 @@
 }
 
+function prepare_p_responses( &$responses, &$message ) {
+	$p_down_rate_arr = switch_bytes( $responses["p_down_rate"] );
+	$p_down_total_arr = switch_bytes( $responses["p_down_total"] );
+	$p_peer_rate_arr = switch_bytes( $responses["p_peer_rate"] );
+	$p_peer_total_arr = switch_bytes( $responses["p_peer_total"] );
+	$p_up_rate_arr = switch_bytes( $responses["p_up_rate"] );
+	$p_up_total_arr = switch_bytes( $responses["p_up_total"] );
+
+	$responses["p_down_rate_value"] = sprintf( "%.1f", $p_down_rate_arr[0] );
+	$responses["p_down_rate_suffix"] = $p_down_rate_arr[1];
+	$responses["p_down_total_value"] = sprintf( "%.1f", $p_down_total_arr[0] );
+	$responses["p_down_total_suffix"] = $p_down_total_arr[1];
+	$responses["p_peer_rate_value"] = sprintf( "%.1f", $p_peer_rate_arr[0] );
+	$responses["p_peer_rate_suffix"] = $p_peer_rate_arr[1];
+	$responses["p_peer_total_value"] = sprintf( "%.1f", $p_peer_total_arr[0] );
+	$responses["p_peer_total_suffix"] = $p_peer_total_arr[1];
+	$responses["p_up_rate_value"] = sprintf( "%.1f", $p_up_rate_arr[0] );
+	$responses["p_up_rate_suffix"] = $p_up_rate_arr[1];
+	$responses["p_up_total_value"] = sprintf( "%.1f", $p_up_total_arr[0] );
+	$responses["p_up_total_suffix"] = $p_up_total_arr[1];
+
+	$responses["p_encrypted_value"] = $responses["p_encrypted"] == 1 ? $message["p_encrypted_1"] : $message["p_encrypted_0"];
+	$responses["p_incoming_value"] = $responses["p_incoming"] == 1 ? $message["p_incoming_1"] : $message["p_incoming_0"];
+
+	ksort( $responses );
+
+	return true;
+}
+
 function prepare_trac_responses( &$responses, &$message ) {
 	$t_scrape_downloaded_arr = switch_bytes( $responses["t_scrape_downloaded"] );
@@ -310,46 +337,40 @@
 }
 
-function addview( &$xml, &$node, &$message ) {
-	$node->setAttribute( "viewtype", $_SESSION["rtwi_view"] );
+function addlanguages( &$xml, &$root, &$node, &$languages ) {
+	$root->setAttribute( "language", $_SESSION["rtwi_language"] );
+
+	// adding languages
+	$rrrnode = $node->appendChild( $xml->createElement( "languages" ) );
+	$rrrnode->setAttribute( "value", $_SESSION["rtwi_language"] );
+	foreach ( $languages as $key => $val ) {
+		$rrnode = $rrrnode->appendChild( $xml->createElement( "language" ) );
+		$rrnode->setAttribute( "value", $key );
+		$rrnode->setAttribute( "title", $val );
+	}
+}
+
+function addrefreshrates( &$xml, &$root, &$node, &$refreshrates ) {
+	$root->setAttribute( "refreshrate", $_SESSION["rtwi_refresh"] );
+
+	// adding refresh rates
+	$rrrnode = $node->appendChild( $xml->createElement( "refreshrates" ) );
+	$rrrnode->setAttribute( "value", $_SESSION["rtwi_refresh"] );
+	foreach ( $refreshrates as $key => $val ) {
+		$rrnode = $rrrnode->appendChild( $xml->createElement( "refreshrate" ) );
+		$rrnode->setAttribute( "value", substr( $key, 12 ) );
+		$rrnode->setAttribute( "title", $val );
+	}
+}
+
+function addviewtypes( &$xml, &$root, &$node, &$view_list, &$viewtypes ) {
+	$root->setAttribute( "viewtype", $_SESSION["rtwi_view"] );
 
 	// adding viewtypes
 	$vcrnode = $node->appendChild( $xml->createElement( "viewtypes" ) );
 	$vcrnode->setAttribute( "value", $_SESSION["rtwi_view"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "main" );
-	$vcnode->setAttribute( "title", $message["viewtype_main"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "name" );
-	$vcnode->setAttribute( "title", $message["viewtype_name"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "started" );
-	$vcnode->setAttribute( "title", $message["viewtype_started"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "stopped" );
-	$vcnode->setAttribute( "title", $message["viewtype_stopped"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "complete" );
-	$vcnode->setAttribute( "title", $message["viewtype_complete"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "incomplete" );
-	$vcnode->setAttribute( "title", $message["viewtype_incomplete"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "hashing" );
-	$vcnode->setAttribute( "title", $message["viewtype_hashing"] );
-	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-	$vcnode->setAttribute( "value", "seeding" );
-	$vcnode->setAttribute( "title", $message["viewtype_seeding"] );
-}
-
-function addrefresh( &$xml, &$node, &$refresh ) {
-	$node->setAttribute( "refreshrate", $_SESSION["rtwi_refresh"] );
-
-	// adding refresh rates
-	$rrrnode = $node->appendChild( $xml->createElement( "refreshrates" ) );
-	$rrrnode->setAttribute( "value", $_SESSION["rtwi_refresh"] );
-	foreach ( $refresh as $key => $val ) {
-		$rrnode = $rrrnode->appendChild( $xml->createElement( "refreshrate" ) );
-		$rrnode->setAttribute( "value", substr( $key, 12 ) );
-		$rrnode->setAttribute( "title", $val );
+	foreach ( $view_list as $key => $val ) {
+		$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
+		$vcnode->setAttribute( "value", $val );
+		$vcnode->setAttribute( "title", isset( $viewtypes["viewtype_{$val}"] ) ? $viewtypes["viewtype_{$val}"] : $val );
 	}
 }
@@ -372,71 +393,4 @@
 
 	return $ret;
-}
-
-function xmlrpc_call( &$xmlrpc_array, &$request, &$callnum, &$calltime ) {
-	$st = getmicrotime();
-
-	$len = strlen( $request );
-	$headers = "CONTENT_LENGTH\0{$len}\0";
-	$headers .= "SCGI\01\0";
-	$len = strlen( $headers );
-	$out = "{$len}:{$headers},{$request}";
-
-	$fp = fsockopen( $xmlrpc_array["host"], $xmlrpc_array["port"], $errno, $errstr, $xmlrpc_array["timeout"] );
-	if ( $fp ) {
-		fwrite( $fp, $out );
-		do {
-			$line = fgets( $fp );
-		} while ( trim( $line ) != "" );
-		
-		$ret = stream_get_contents( $fp );
-	} else {
-		$_SESSION["rtwi_err"] = "noconn";
-		$ret = $errno;
-	}
-
-	$tt = getmicrotime();
-	$callnum++;
-	$calltime += $tt - $st;
-
-	return $ret;
-}
-
-function xmlrpc_multicall( &$xmlrpc_array, &$methodlist, &$multicallnum, &$callnum, &$calltime, $params = array() ) {
-	$request = array();
-	foreach ( $methodlist as $methodkey => $methodval ) {
-		$request[] = array( "methodName" => $methodval, "params" => $params );
-	}
-	$request = xmlrpc_encode_request( "system.multicall", array( $request ) );
-	$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime ); 
-	$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-	$response = xmlrpc_decode( $response );
-	$r = 0;
-	$responses = array();
-	foreach ( $methodlist as $methodkey => $methodval ) {
-		if ( $methodval[1] == "." ) {
-			$prefix = substr( $methodval, 0, 1 );
-			$methodval = substr( $methodval, 5 );
-			$methodval = "{$prefix}{$methodval}";
-		} elseif ( strlen( $methodval ) > 6 && $methodval[6] == "." ) {
-			$prefix = substr( $methodval, 0, 1 );
-			$methodval = substr( $methodval, 7 );
-			$methodval = "{$methodval}";
-		} elseif ( substr( $methodval, 0, 3 ) == "dht" ) {
-		} else {
-			$methodval = substr( $methodval, 4 );
-		}
-		if ( $methodval == "dht_statistics" ) {
-			foreach ( $response[$r++][0] as $dkey => $dval ) {
-				$responses["{$methodval}_{$dkey}"] = $dval;
-			}
-		} else {
-			$responses[$methodval] = $response[$r++][0];
-		}
-	}
-
-	$multicallnum++;
-
-	return $responses;
 }
 
@@ -468,5 +422,5 @@
 //error_reporting( E_ALL ^ E_NOTICE );
 
-set_time_limit( 0 );
+set_time_limit( 10 );
 
 session_start();
@@ -476,5 +430,15 @@
 
 require_once( "includes/config.inc.php" );
-require_once( "includes/messages.{$lang}.inc.php" );
+
+if ( !isset( $_SESSION["rtwi_language"] ) ) {
+	if ( !isset( $_COOKIE["rtwi_language"] ) ) {
+		$_SESSION["rtwi_language"] = $lang;
+	} elseif ( !isset( $_SESSION["rtwi_view"] ) ) {
+		$_SESSION["rtwi_language"] = $_COOKIE["rtwi_language"];
+	}
+}
+
+require_once( "includes/classes/xmlrpc_handler.inc.php" );
+require_once( "includes/messages.{$_SESSION["rtwi_language"]}.inc.php" );
 require_once( "includes/tools/functions.time.inc.php" );
 
@@ -485,8 +449,12 @@
 
 $xmlrpc_methods = array(
-	"si"	=> $config["allow"]["dht"] == true ? array( "dht_statistics", "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_dht_port", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid" ) : array( "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid" ),
-	"d"	=> array( "d.get_base_filename=", "d.get_base_path=", "d.get_bytes_done=", "d.get_chunk_size=", "d.get_chunks_hashed=", "d.get_complete=", "d.get_completed_bytes=", "d.get_completed_chunks=", "d.get_connection_current=", "d.get_connection_leech=", "d.get_connection_seed=", "d.get_creation_date=", "d.get_custom1=", "d.get_custom2=", "d.get_custom3=", "d.get_custom4=", "d.get_custom5=", "d.get_directory=", "d.get_down_rate=", "d.get_down_total=", "d.get_free_diskspace=", "d.get_hash=", "d.get_hashing=", "d.get_ignore_commands=", "d.get_left_bytes=", "d.get_local_id=", "d.get_local_id_html=", "d.get_max_file_size=", "d.get_max_peers=", "d.get_max_size_pex=", "d.get_max_uploads=", "d.get_message=", "d.get_min_peers=", "d.get_name=", "d.get_peer_exchange=", "d.get_peers_accounted=", "d.get_peers_complete=", "d.get_peers_connected=", "d.get_peers_max=", "d.get_peers_min=", "d.get_peers_not_connected=", "d.get_priority=", "d.get_priority_str=", "d.get_ratio=", "d.get_size_bytes=", "d.get_size_chunks=", "d.get_size_files=", "d.get_size_pex=", "d.get_skip_rate=", "d.get_skip_total=", "d.get_state=", "d.get_state_changed=", "d.get_tied_to_file=", "d.get_tracker_focus=", "d.get_tracker_numwant=", "d.get_tracker_size=", "d.get_up_rate=", "d.get_up_total=", "d.get_uploads_max=", "d.is_active=", "d.is_hash_checked=", "d.is_hash_checking=", "d.is_multi_file=", "d.is_open=", "d.is_pex_active=", "d.is_private=" ),
-	"f"	=> array( "f.get_completed_chunks=", "f.get_frozen_path=", "f.get_is_created=", "f.get_is_open=", "f.get_last_touched=", "f.get_match_depth_next=", "f.get_match_depth_prev=", "f.get_offset=", "f.get_path=", "f.get_path_components=", "f.get_path_depth=", "f.get_priority=", "f.get_range_first=", "f.get_range_second=", "f.get_size_bytes=", "f.get_size_chunks=" ),
-	"t"	=> array( "t.get_group=", "t.get_id=", "t.get_min_interval=", "t.get_normal_interval=", "t.get_scrape_complete=", "t.get_scrape_downloaded=", "t.get_scrape_incomplete=", "t.get_scrape_time_last=", "t.get_type=", "t.get_url=", "t.is_enabled=", "t.is_open=" )
+	"si"	=> $config["allow"]["dht"] == true ? 
+			array( "dht_statistics", "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_dht_port", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid", "view_list" ) :
+			array( "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid", "view_list" ),
+	"d"	=> array( "d.get_base_filename=", "d.get_base_path=", "d.get_bytes_done=", "d.get_chunk_size=", "d.get_chunks_hashed=", "d.get_complete=", "d.get_completed_bytes=", "d.get_completed_chunks=", "d.get_connection_current=", "d.get_connection_leech=", "d.get_connection_seed=", "d.get_creation_date=", "d.get_custom1=", "d.get_custom2=", "d.get_custom3=", "d.get_custom4=", "d.get_custom5=", "d.get_directory=", "d.get_down_rate=", "d.get_down_total=", "d.get_free_diskspace=", "d.get_hash=", "d.get_hashing=", "d.get_ignore_commands=", "d.get_left_bytes=", "d.get_local_id=", "d.get_local_id_html=", "d.get_max_file_size=", "d.get_max_size_pex=", "d.get_message=", "d.get_name=", "d.get_peer_exchange=", "d.get_peers_accounted=", "d.get_peers_complete=", "d.get_peers_connected=", "d.get_peers_max=", "d.get_peers_min=", "d.get_peers_not_connected=", "d.get_priority=", "d.get_priority_str=", "d.get_ratio=", "d.get_size_bytes=", "d.get_size_chunks=", "d.get_size_files=", "d.get_size_pex=", "d.get_skip_rate=", "d.get_skip_total=", "d.get_state=", "d.get_state_changed=", "d.get_tied_to_file=", "d.get_tracker_focus=", "d.get_tracker_numwant=", "d.get_tracker_size=", "d.get_up_rate=", "d.get_up_total=", "d.get_uploads_max=", "d.is_active=", "d.is_hash_checked=", "d.is_hash_checking=", "d.is_multi_file=", "d.is_open=", "d.is_pex_active=", "d.is_private=" ),
+	"f"	=> array( "f.get_completed_chunks=", "f.get_frozen_path=", "f.is_created=", "f.is_open=", "f.get_last_touched=", "f.get_match_depth_next=", "f.get_match_depth_prev=", "f.get_offset=", "f.get_path=", "f.get_path_components=", "f.get_path_depth=", "f.get_priority=", "f.get_range_first=", "f.get_range_second=", "f.get_size_bytes=", "f.get_size_chunks=" ),
+	"p"	=> array( "p.get_address=", "p.get_client_version=", "p.get_completed_percent=", "p.get_down_rate=", "p.get_down_total=", "p.get_id=", "p.get_id_html=", "p.get_options_str=", "p.get_peer_rate=", "p.get_peer_total=", "p.get_port=", "p.get_up_rate=", "p.get_up_total=", "p.is_encrypted=", "p.is_incoming=", "p.is_obfuscated=", "p.is_snubbed=" ),
+	"t"	=> array( "t.get_group=", "t.get_id=", "t.get_min_interval=", "t.get_normal_interval=", "t.get_scrape_complete=", "t.get_scrape_downloaded=", "t.get_scrape_incomplete=", "t.get_scrape_time_last=", "t.get_type=", "t.get_url=", "t.is_enabled=", "t.is_open=" ),
+	"g"	=> array( "d.get_name", "d.get_directory", "f.get_path", "f.get_frozen_path", "f.get_size_bytes" ),
 );
 
@@ -521,10 +489,10 @@
 			break;
 		}
-		case "info" : {
+		case "peers" : {
+			$page = "peers";
+			break;
+		}
+		default : {
 			$page = "info";
-			break;
-		}
-		default : {
-			$page = "peers";
 			break;
 		}
@@ -553,6 +521,20 @@
 }
 
-if ( isset( $_SESSION["rtwi_auth"] ) && $_SESSION["rtwi_auth"] === 1 ) {
+//print_r( $_COOKIE );
+
+if ( ( isset( $_SESSION["rtwi_auth"] ) && $_SESSION["rtwi_auth"] === 1 ) || ( isset( $_COOKIE["rtwi_auth"] ) && $_COOKIE["rtwi_auth"] == 1 && isset( $_COOKIE["rtwi_nick"] ) && array_key_exists( $_COOKIE["rtwi_nick"], $users ) ) ) {
+	if ( !isset( $_SESSION["rtwi_auth"] ) || $_SESSION["rtwi_auth"] !== 1 ) {
+		$_SESSION["rtwi_auth"] = 1;
+		$_SESSION["rtwi_nick"] = $_COOKIE["rtwi_nick"];
+		$_SESSION["rtwi_port"] = $users[$_COOKIE["rtwi_nick"]];
+
+		settype( $_SESSION["rtwi_port"], "int" );
+
+		$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
+	}
+
 	$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
+	$xmlrpc = new xmlrpc_handler( $xmlrpc_array );
+
 	if ( !isset( $_SESSION["rtwi_view"] ) ) {
 		if ( !isset( $_COOKIE["rtwi_view"] ) ) {
@@ -587,5 +569,6 @@
 $root->appendChild( $xml->createElement( "purl", isset( $_SESSION["rtwi_lastpage"] ) ? str_replace( "&", "&amp;", $_SESSION["rtwi_lastpage"] ) : "" ) );
 $root->appendChild( $xml->createElement( "datetime", date( "Y. m. d. H:i:s", time() ) ) );
-$root->appendChild( $xml->createElement( "lang", $lang ) );
+$root->appendChild( $xml->createElement( "language", $_SESSION["rtwi_language"] ) );
+
 foreach ( $config["allow"] as $key => $val ) {
 	if ( $val == true ) {
@@ -613,4 +596,7 @@
 switch ( $mod ) {
 	case "login" : { // login
+		if ( $config["allow"]["language"] ) {
+			addlanguages( $xml, $root, $root, $languages );
+		}
 		$layout_file = "layout.main.login.xsl";
 
@@ -621,16 +607,21 @@
 		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
 		if ( $config["allow"]["refresh"] ) {
-			addrefresh( $xml, $tnode, $refresh );
+			addrefreshrates( $xml, $root, $tnode, $refreshrates );
+		}
+		if ( $config["allow"]["language"] ) {
+			addlanguages( $xml, $root, $tnode, $languages );
 		}
 
 		// retrieving server info
-		$methodlist = $xmlrpc_methods["si"];
-		$si_responses = xmlrpc_multicall( $xmlrpc_array, $methodlist, $multicallnum, $callnum, $calltime );
-
+		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+		if ( !$xmlrpc->call() || !$xmlrpc->parse() ) {
+		}
+		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+//print_r( $si_responses );
 		$methodlist = array( "d.get_down_rate=", "d.get_up_rate=" );
-		$request = xmlrpc_encode_request( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$response = xmlrpc_decode( $response );
+		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$response = $xmlrpc->fetch();
 
 		$bytes_down = 0;
@@ -670,9 +661,10 @@
 		break;
 	}
-	case "addtorrent" : {
-		$request = xmlrpc_encode_request( "get_directory", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$directory = xmlrpc_decode( $response );
+	case "addtorrent" : { // add a new torrent
+		$xmlrpc->setrequest( "get_directory", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$directory = $xmlrpc->fetch();
+
 		if ( substr( $directory, -1 ) == "/" ) {
 			$directory = substr( $directory, 0, -1 );
@@ -714,4 +706,7 @@
 		$atnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
 		$atnode->setAttribute( "freespace_suffix", $freespace[1] );
+		if ( $config["allow"]["language"] ) {
+			addlanguages( $xml, $root, $atnode, $languages );
+		}
 		foreach( $scan as $key => $val ) {
 			$dpath = str_replace( "//", "/", "{$path}/{$val}" );
@@ -737,16 +732,20 @@
 		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
 		if ( $config["allow"]["refresh"] ) {
-			addrefresh( $xml, $tnode, $refresh );
+			addrefreshrates( $xml, $root, $tnode, $refreshrates );
+		}
+		if ( $config["allow"]["language"] ) {
+			addlanguages( $xml, $root, $tnode, $languages );
 		}
 
 		// retrieving server info
-		$methodlist = $xmlrpc_methods["si"];
-		$si_responses = xmlrpc_multicall( $xmlrpc_array, $methodlist, $multicallnum, $callnum, $calltime );
-
-		$methodlist = $xmlrpc_methods["d"];
-		$request = xmlrpc_encode_request( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$response = xmlrpc_decode( $response );
+		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$response = $xmlrpc->fetch();
 
 		$bytes_down = 0;
@@ -754,10 +753,11 @@
 		$torrent = false;
 		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $methodlist[$r] );
+			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 ( $d_responses[$i]["d_hash"] == $hash ) {
 				$torrent = $d_responses[$i];
@@ -773,4 +773,22 @@
 					$node = $node->appendChild( $xml->createElement( "torrent_peers" ) );
 
+					$xmlrpc->setrequest( "p.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["p"] ) );
+					$xmlrpc->call();
+					$xmlrpc->parse();
+					$response = $xmlrpc->fetch();
+					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];
+						}
+					}
+					for ( $i = 0; $i < $torrent["d_peers_connected"]; $i++ ) {
+						prepare_p_responses( $responses[$i], $message, $home_path );
+						$pnode = $node->appendChild( $xml->createElement( "peer" ) );
+						$pnode->setAttribute( "id", $i );
+						xmlrpc_multiappend( $xml, $pnode, $responses[$i] );
+					}
+
+
 					break;
 				}
@@ -791,12 +809,12 @@
 					$fst = getmicrotime();
 
-					$methodlist = $xmlrpc_methods["f"];
-					$request = xmlrpc_encode_request( "f.multicall", array_merge( array( $torrent["d_hash"], 0 ), $methodlist ) );
-					$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-					$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-					$response = xmlrpc_decode( $response );
+					$xmlrpc->setrequest( "f.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["f"] ) );
+					$xmlrpc->call();
+					$xmlrpc->parse();
+					$response = $xmlrpc->fetch();
+//					print_r( $response );
 					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $methodlist[$r] );
+						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];
 						}
@@ -833,12 +851,11 @@
 					$node = $node->appendChild( $xml->createElement( "torrent_trackers" ) );
 
-					$methodlist = $xmlrpc_methods["t"];
-					$request = xmlrpc_encode_request( "t.multicall", array_merge( array( $torrent["d_hash"], 0 ), $methodlist ) );
-					$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-					$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-					$response = xmlrpc_decode( $response );
+					$xmlrpc->setrequest( "t.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["t"] ) );
+					$xmlrpc->call();
+					$xmlrpc->parse();
+					$response = $xmlrpc->fetch();
 					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $methodlist[$r] );
+						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];
 						}
@@ -908,44 +925,22 @@
 		} else {
 			// retrieving server info
-			$methodlist = $xmlrpc_methods["si"];
-			$si_responses = xmlrpc_multicall( $xmlrpc_array, $methodlist, $multicallnum, $callnum, $calltime );
-
-			$request = xmlrpc_encode_request( "download_list", array( $_SESSION["rtwi_view"] ) );
-			$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-			$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-			$torrents = xmlrpc_decode( $response );
+			$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+			$xmlrpc->call();
+			$xmlrpc->parse();
+			$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+			$xmlrpc->setrequest( "download_list", array( $_SESSION["rtwi_view"] ) );
+			$xmlrpc->call();
+			$xmlrpc->parse();
+			$torrents = $xmlrpc->fetch();
 
 			if ( in_array( $hash, $torrents ) ) {
 				// getting name
-				$request = xmlrpc_encode_request( "d.get_name", $hash );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-				$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-				$d_name = xmlrpc_decode( $response );
-
-				// getting download directory
-				$request = xmlrpc_encode_request( "d.get_directory", $hash );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-				$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-				$d_directory = xmlrpc_decode( $response );
-
-				//getting path
-				$request = xmlrpc_encode_request( "f.get_path", array( $hash, $id ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-				$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-				$f_path = xmlrpc_decode( $response );
-
-				//getting path
-				$request = xmlrpc_encode_request( "f.get_frozen_path", array( $hash, $id ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-				$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-				$f_frozen_path = xmlrpc_decode( $response );
-
-				//getting file size
-				$request = xmlrpc_encode_request( "f.get_size_bytes", array( $hash, $id ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-				$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-				$f_size_bytes = xmlrpc_decode( $response );
-
-				$d_directory_value = make_abs_path( $d_directory, $si_responses["get_cwd"], "{$home_path}{$_SESSION["rtwi_nick"]}" );
+				$xmlrpc->setmrequest( $xmlrpc_methods["g"], array( $hash, $id ) );
+				$xmlrpc->call();
+				$xmlrpc->parse();
+				$response = $xmlrpc->mfetch( $xmlrpc_methods["g"] );
+
+				$d_directory_value = make_abs_path( $response["d_directory"], $si_responses["get_cwd"], "{$home_path}{$_SESSION["rtwi_nick"]}" );
 			} else {
 				$_SESSION["rtwi_err"] = "nohashfound";
@@ -957,26 +952,33 @@
 	}
 	default : { // torrents
+		// retrieving server info
+		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+//print_r( $si_responses );
+
 		// creating torrents node
 		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
-		addview( $xml, $tnode, $message );
+		addviewtypes( $xml, $root, $tnode, $si_responses["view_list"], $viewtypes );
 		if ( $config["allow"]["refresh"] ) {
-			addrefresh( $xml, $tnode, $refresh );
-		}
-
-		// retrieving server info
-		$methodlist = $xmlrpc_methods["si"];
-		$si_responses = xmlrpc_multicall( $xmlrpc_array, $methodlist, $multicallnum, $callnum, $calltime );
-
-		$methodlist = $xmlrpc_methods["d"];
-		$request = xmlrpc_encode_request( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$response = xmlrpc_decode( $response );
-//print_r( $response ); exit;
+			addrefreshrates( $xml, $root, $tnode, $refreshrates );
+		}
+		if ( $config["allow"]["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();
+//print_r( $response );
+
 		$bytes_down = 0;
 		$bytes_up = 0;
 		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $methodlist[$r] );
+			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];
 			}
@@ -1047,5 +1049,5 @@
 } else {
 	set_time_limit( 0 );
-	$path = "{$d_directory_value}/{$f_path}";
+	$path = "{$d_directory_value}/{$response["f_path"]}";
 	$filesize = filesize( $path );
 
@@ -1054,11 +1056,11 @@
 	@header( "Content-Type: application/force-download" );
 	@header( "Content-Length: {$filesize}" );
-	@header( "Content-Disposition: attachment; filename={$f_path}" );
+	@header( "Content-Disposition: attachment; filename={$response["f_path"]}" );
 	readfile( $path );
 }
 
 $tt = getmicrotime();
-
-printf( "<br />\r\nXMLRPC calls: %d (%d multicall)", $callnum, $multicallnum );
+/*
+printf( "<br />\r\nXMLRPC calls: %d", $callnum );
 printf( "<br />\r\nXMLRPC time: %0.6f sec", $calltime );
 if( isset( $fst ) && isset( $ftt ) ) {
@@ -1066,4 +1068,4 @@
 }
 printf( "<br />\r\nTotal time: %0.6f sec", $tt - $st );
-
+*/
 ?>
Index: input.php
===================================================================
--- input.php	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ input.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -58,8 +58,10 @@
 }
 
-if ( ( !isset( $_SESSION["rtwi_auth"] ) || $_SESSION["rtwi_auth"] !== 1 ) && $_REQUEST["mod"] != "login" ) {
-	header( "location: {$url["index"]}" );
-	exit;
-} elseif ( $_REQUEST["mod"] != "login" ) {
+if ( ( !isset( $_SESSION["rtwi_auth"] ) || $_SESSION["rtwi_auth"] !== 1 ) ) {
+	if ( $_REQUEST["mod"] != "login" && $_REQUEST["mod"] != "changelanguage" ) {
+		header( "location: {$url["index"]}" );
+		exit;
+	}
+} else {
 	$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
 }
@@ -84,4 +86,9 @@
 			$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
 
+			if ( isset( $_REQUEST["rememberme"] ) && $_REQUEST["rememberme"] == "on" ) {
+				setcookie( "rtwi_auth", 1, time() + 60 * 60 * 24 * 365 );
+				setcookie( "rtwi_nick", $_REQUEST["loginname"], time() + 60 * 60 * 24 * 365 );
+			}
+
 			$_SESSION["rtwi_err"] = "succlogin";
 			header( "location: {$url["index"]}" );
@@ -101,4 +108,5 @@
 		$_SESSION["rtwi_view"] = "";
 		$_SESSION["rtwi_refresh"] = 0;
+		$_SESSION["rtwi_language"] = "";
 
 		unset( $_SESSION["rtwi_auth"] );
@@ -107,4 +115,8 @@
 		unset( $_SESSION["rtwi_view"] );
 		unset( $_SESSION["rtwi_refresh"] );
+		unset( $_SESSION["rtwi_language"] );
+
+		setcookie( "rtwi_auth", 0 );
+		setcookie( "rtwi_nick", "" );
 
 		$_SESSION["rtwi_err"] = "succlogout";
@@ -116,37 +128,15 @@
 	case "changeview" : { // change view
 		if ( isset( $_REQUEST["viewtype"] ) && $_REQUEST["viewtype"] != "" ) {
-			switch ( $_REQUEST["viewtype"] ) {
-				case "name" : {
-					$_SESSION["rtwi_view"] = "name";
-					break;
-				}
-				case "started" : {
-					$_SESSION["rtwi_view"] = "started";
-					break;
-				}
-				case "stopped" : {
-					$_SESSION["rtwi_view"] = "stopped";
-					break;
-				}
-				case "complete" : {
-					$_SESSION["rtwi_view"] = "complete";
-					break;
-				}
-				case "incomplete" : {
-					$_SESSION["rtwi_view"] = "incomplete";
-					break;
-				}
-				case "hashing" : {
-					$_SESSION["rtwi_view"] = "hashing";
-					break;
-				}
-				case "seeding" : {
-					$_SESSION["rtwi_view"] = "seeding";
-					break;
-				}
-				default : {
-					$_SESSION["rtwi_view"] = "default";
-					break;
-				}
+			$request = xmlrpc_encode_request( "view_list", array() );
+			$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+			$response = preg_replace( "/i8|ex\.i8/", "string", $response );
+			$viewtypes = xmlrpc_decode( $response );
+
+			if ( in_array( $_REQUEST["viewtype"], $viewtypes ) ) {
+				$_SESSION["rtwi_view"] = $_REQUEST["viewtype"];
+			} else {
+				$_SESSION["rtwi_err"] = "badviewtype";
+				header( "location: {$url["index"]}" );
+				exit;
 			}
 
@@ -157,5 +147,5 @@
 			exit;
 		} else {
-			$_SESSION["rtwi_err"] = "badviewtype";
+			$_SESSION["rtwi_err"] = "noviewtype";
 			header( "location: {$url["index"]}" );
 			exit;
@@ -173,5 +163,5 @@
 			$refreshrate = $_REQUEST["refreshrate"];
 			settype( $refreshrate, "int" );
-			if ( $refreshrate < 5 ) {
+			if ( $refreshrate < 60 ) {
 				$refreshrate = 0;
 			}
@@ -185,5 +175,34 @@
 			exit;
 		} else {
-			$_SESSION["rtwi_err"] = "badrefreshrate";
+			$_SESSION["rtwi_err"] = "norefreshrate";
+			header( "location: {$_SESSION["rtwi_lastpage"]}" );
+			exit;
+		}
+
+		break;
+	}
+	case "changelanguage" : { // change language
+		if ( !$config["allow"]["language"] ) {
+			$_SESSION["rtwi_err"] = "languagenotallowed";
+			header( "location: {$url["index"]}" );
+			exit;
+		}
+		if ( isset( $_REQUEST["language"] ) && $_REQUEST["language"] != "" ) {
+			$language = $_REQUEST["language"];
+			if ( is_readable( "includes/messages.{$language}.inc.php" ) ) {
+				$_SESSION["rtwi_language"] = $language;
+
+				setcookie( "rtwi_language", $_SESSION["rtwi_language"], time() + 60 * 60 * 24 * 30 );
+
+				$_SESSION["rtwi_err"] = "succlanguagechange";
+				header( "location: {$_SESSION["rtwi_lastpage"]}" );
+				exit;
+			} else {
+				$_SESSION["rtwi_err"] = "badlanguage";
+				header( "location: {$_SESSION["rtwi_lastpage"]}" );
+				exit;
+			}
+		} else {
+			$_SESSION["rtwi_err"] = "nolanguage";
 			header( "location: {$_SESSION["rtwi_lastpage"]}" );
 			exit;
@@ -551,5 +570,5 @@
 			$directory = substr( $directory, 0, -1 );
 		}
-//		print_r( split( "/", $directory ) );
+
 		if ( in_array( "..", split( "/", $directory ) ) ) {
 			$_SESSION["rtwi_err"] = "badrtdirectory";
@@ -589,5 +608,5 @@
 		$dirs = array();
 		foreach ( $files as $key => $val ) {
-				$dirs[] = dirname( $val[0] );
+			$dirs[] = dirname( $val[0] );
 			if ( is_writable( $val[0] ) ) {
 				if ( @unlink( $val[0] ) ) {
@@ -610,7 +629,7 @@
 		}
 		rsort( $dirs );
-//		print_r( $dirs );
-
-		$size_dirs = count( $dirs );
+		//print_r( $dirs );
+
+		$size_dirs = $size_files == 1 ? 0 : count( $dirs );
 		$rmdir_num = 0;
 		foreach ( $dirs as $key => $val ) {
@@ -627,5 +646,5 @@
 		sleep( 1 );
 
-		if ( $unlink_num != $size_files && $rmdir_num != $size_dirs ) {
+		if ( $unlink_num != $size_files || $rmdir_num != $size_dirs ) {
 			$_SESSION["rtwi_err"] = "warntorrenterase";
 			header( "location: {$url["index"]}" );
@@ -997,5 +1016,5 @@
 		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
 
-		$_SESSION["rtwi_err"] = $dhtstatus == 1 ? "succdhtstart" : "succdhtstop";
+		$_SESSION["rtwi_err"] = $dhtstatus == "on" ? "succdhtstart" : "succdhtstop";
 
 		sleep( 1 );
Index: themes/default_ajax/inc/hfunc.js
===================================================================
--- themes/default_ajax/inc/hfunc.js	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ themes/default_ajax/inc/hfunc.js	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -3,6 +3,6 @@
   case '_info' :
   case 'torrent_info' :
-  case 'torrent_trackers' :
-  case 'serverinfo_info' : {
+  case 'torrent_peers' :
+  case 'torrent_trackers' : {
    if ( document.getElementById( 'changethrottleform' ) != null ) {
     document.getElementById( 'throttleupinput' ).style.display = 'none';
@@ -16,4 +16,19 @@
    break;
   }
+  case 'serverinfo_info' : {
+   if ( document.getElementById( 'changethrottleform' ) != null ) {
+    document.getElementById( 'throttleupinput' ).style.display = 'none';
+    document.getElementById( 'throttledowninput' ).style.display = 'none';
+    document.getElementById( 'tsubmit' ).style.display = 'none';
+
+    document.getElementById( 'throttleup' ).style.display = '';
+    document.getElementById( 'throttledown' ).style.display = '';
+   }
+
+   document.getElementById( 'changedht' ).style.display = '';
+   document.getElementById( 'changedhtselect' ).style.display = 'none';
+
+   break;
+  }
   case '_info_restore' : {
    document.getElementById( 'throttleupinput' ).style.display = '';
@@ -23,4 +38,12 @@
    document.getElementById( 'throttleup' ).style.display = 'none';
    document.getElementById( 'throttledown' ).style.display = 'none';
+
+   break;
+  }
+  case 'serverinfo_info_restore' : {
+   if ( document.getElementById( 'changethrottleform' ) != null ) {
+    document.getElementById( 'changedht' ).style.display = 'none';
+    document.getElementById( 'changedhtselect' ).style.display = '';
+   }
 
    break;
Index: themes/default_ajax/inc/style.css
===================================================================
--- themes/default_ajax/inc/style.css	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ themes/default_ajax/inc/style.css	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -86,4 +86,10 @@
 		margin: 0 0 0 0;
 		padding: 0;
+}
+
+#footer {
+		margin: 4em 1em 2em 0;
+		text-align: right;
+		font-size: smaller;
 }
 
@@ -137,8 +143,22 @@
 #changerefreshform {
 		float: left;
+		margin: 0 1em 0 0;
+}
+
+#changelanguageform {
+		float: left;
+}
+
+#loginbox #changelanguageform {
+		float: none;
+		margin: 0 0 1em 0;
 }
 
 #doonalltorrentform {
 		float: right;
+}
+
+#addtorrent {
+		clear: both;
 }
 
@@ -167,5 +187,5 @@
 }
 
-.line.spacer{
+.spacer {
 		margin: 0 0 1em 0;
 }
@@ -277,5 +297,5 @@
 .tratio {
 		float: right;
-		width: 5.5em;
+		width: 6em;
 		margin: 0 0 0 .5em;
 		background: #eeeeee;
@@ -296,24 +316,8 @@
 }
 
-.tcontainer a.info {
-		float: left;
-		width: 11.3em;
+.tcontainer a.subpage {
+		float: left;
+		width: 10em;
 		margin: 0 .5em 0 0;
-		background: #eeeeee;
-		text-align: center;
-}
-
-.tcontainer a.files {
-		float: left;
-		width: 14em;
-		margin: 0 .5em 0 0;
-		background: #eeeeee;
-		text-align: center;
-}
-
-.tcontainer a.trackers {
-		float: left;
-		width: 11em;
-		margin: 0;
 		background: #eeeeee;
 		text-align: center;
@@ -512,11 +516,69 @@
 }
 
-
-
-
-
-
-
-
-
-
+.phead {
+		font-weight: bold;
+}
+
+.paddress {
+		float: left;
+		width: 8em;
+}
+
+.pup {
+		float: left;
+		width: 5em;
+		margin: 0 0 0 .5em;
+		text-align: right;
+}
+
+.pdown {
+		float: left;
+		width: 5em;
+		margin: 0 0 0 .5em;
+		text-align: right;
+}
+
+.prate {
+		float: left;
+		width: 5em;
+		margin: 0 0 0 .5em;
+		text-align: right;
+}
+
+.pdone {
+		float: left;
+		width: 4em;
+		margin: 0 0 0 .5em;
+		text-align: right;
+}
+
+.pencrypted {
+		float: left;
+		width: 6em;
+		margin: 0 0 0 .5em;
+}
+
+.pincoming {
+		float: left;
+		width: 6em;
+		margin: 0 0 0 1.5em;
+}
+
+.poptions {
+		float: left;
+		width: 6em;
+		margin: 0 0 0 .5em;
+		font-size: smaller;
+}
+
+.pclient {
+		float: left;
+		margin: 0 0 0 .5em;
+}
+
+
+
+
+
+
+
Index: themes/default_ajax/layout.ajax.index.xsl
===================================================================
--- themes/default_ajax/layout.ajax.index.xsl	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ themes/default_ajax/layout.ajax.index.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -4,5 +4,5 @@
  <xsl:output method="xml"
              indent="no"
-	     encoding="utf-8" />
+             encoding="utf-8" />
 
  <xsl:template match="root">
@@ -23,4 +23,5 @@
    <xsl:apply-templates select="torrent_info_root" />
    <xsl:apply-templates select="torrent_files_root" />
+   <xsl:apply-templates select="torrent_peers_root" />
    <xsl:apply-templates select="torrent_trackers_root" />
   </ul>
@@ -183,4 +184,15 @@
   <li class="line">
    <div class="infoleft">
+    <xsl:value-of select="/root/labels/peersconnected" />
+   </div>
+   <div class="inforight">
+    <span title="{/root/labels/dminpeers}: {d_peers_min} - {/root/labels/dmaxpeers}: {d_peers_max}">
+     <xsl:value-of select="d_peers_connected" />
+    </span>
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
     <xsl:value-of select="/root/labels/leechers" />
    </div>
@@ -280,4 +292,39 @@
  <xsl:template match="torrent_trackers">
   <xsl:apply-templates select="tracker" />
+ </xsl:template>
+
+ <xsl:template match="torrent_peers_root">
+  <xsl:apply-templates select="torrent_peers" />
+ </xsl:template>
+
+ <xsl:template match="torrent_peers">
+  <li class="phead">
+   <div class="paddress">
+    <xsl:value-of select="/root/labels/address" />
+   </div>
+   <div class="pup">
+    <xsl:value-of select="/root/labels/up_rate" />
+   </div>
+   <div class="pdown">
+    <xsl:value-of select="/root/labels/down_rate" />
+   </div>
+   <div class="prate">
+    <xsl:value-of select="/root/labels/peer_rate" />
+   </div>
+   <div class="pdone">
+    <xsl:value-of select="/root/labels/done" />
+   </div>
+   <div class="pincoming">
+    <xsl:value-of select="/root/labels/incoming" />
+   </div>
+   <div class="pencrypted">
+    <xsl:value-of select="/root/labels/encrypted" />
+   </div>
+   <div class="pclient">
+    <xsl:value-of select="/root/labels/pclientversion" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <xsl:apply-templates select="peer" />
  </xsl:template>
 
@@ -467,3 +514,40 @@
  </xsl:template>
 
+ <xsl:template match="peer">
+  <li>
+   <div class="paddress">
+    <xsl:value-of select="p_address" />
+   </div>
+   <div class="pup">
+    <xsl:value-of select="p_up_rate/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="p_up_rate/@suffix" />
+   </div>
+   <div class="pdown">
+    <xsl:value-of select="p_down_rate/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="p_down_rate/@suffix" />
+   </div>
+   <div class="prate">
+    <xsl:value-of select="p_peer_rate/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="p_peer_rate/@suffix" />
+   </div>
+   <div class="pdone">
+    <xsl:value-of select="p_completed_percent" />
+    <xsl:text> %</xsl:text>
+   </div>
+   <div class="pincoming">
+    <xsl:value-of select="p_incoming/@value" />
+   </div>
+   <div class="pencrypted">
+    <xsl:value-of select="p_encrypted/@value" />
+   </div>
+   <div class="pclient">
+    <xsl:value-of select="p_client_version" />
+   </div>
+   <div class="clr"></div>
+  </li>
+ </xsl:template>
+
 </xsl:stylesheet>
Index: themes/default_ajax/layout.editor.index.xsl
===================================================================
--- themes/default_ajax/layout.editor.index.xsl	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ themes/default_ajax/layout.editor.index.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -24,5 +24,4 @@
     <meta name="author" content="{/root/labels/author}" />
     <meta name="description" content="{/root/labels/description}" />
-    <meta name="keywords" content="{/root/labels/keywords}" />
     <meta name="doc-type" content="web page" />
     <meta name="rating" content="general" />
Index: themes/default_ajax/layout.main.index.xsl
===================================================================
--- themes/default_ajax/layout.main.index.xsl	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ themes/default_ajax/layout.main.index.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -3,5 +3,5 @@
                 lang="en">
  <xsl:output method="xml"
-             indent="yes"
+             indent="no"
              encoding="utf-8"
              doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
@@ -9,8 +9,8 @@
 
  <xsl:template match="root">
-  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{lang}" lang="{lang}">
+  <html xml:lang="{language}" lang="{language}">
    <head>
     <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-    <meta http-equiv="content-language" content="{lang}" />
+    <meta http-equiv="content-language" content="{language}" />
     <meta http-equiv="cache-control" content="no-store, no-cache, must-revalidate, post-check=0, pre-check=0" />
     <meta http-equiv="pragma" content="no-cache" />
@@ -18,11 +18,10 @@
     <meta http-equiv="imagetoolbar" content="no" />  
     <xsl:choose>
-     <xsl:when test="torrents/@refreshrate != 0">
-      <meta http-equiv="refresh" content="{torrents/@refreshrate}; url={curl}" />  
+     <xsl:when test="@refreshrate != 0">
+      <meta http-equiv="refresh" content="{@refreshrate}; url={curl}" />  
      </xsl:when>
     </xsl:choose>
     <meta name="author" content="{labels/author}" />
     <meta name="description" content="{labels/description}" />
-    <meta name="keywords" content="{labels/keywords}" />
     <meta name="doc-type" content="web page" />
     <meta name="rating" content="general" />
@@ -43,5 +42,5 @@
         <xsl:choose>
          <xsl:when test="mod = 'torrent'">
-          <li class="submenu notshown">
+          <li class="submenu">
            <a href="?mod=torrent&amp;hash={hash}&amp;page=peers" title="{labels/peerlist}"><xsl:value-of select="labels/peerlist" /></a>
           </li>
@@ -76,4 +75,7 @@
      <div class="clr1"></div>
     </div>
+    <div id="footer">
+     <span><a href="http://projects.cyla.homeip.net/rtwi/" title="{labels/homepage}"><xsl:value-of select="labels/homepage" /></a></span>
+    </div>
    </body>
   </html>
@@ -89,4 +91,7 @@
 
  <xsl:template match="addtorrent">
+  <div class="spacer">
+   <xsl:apply-templates select="languages" />
+  </div>
   <form id="addtorrent" name="addtorrent" enctype="multipart/form-data" method="post" action="{/root/iurl}?mod=addtorrent">
    <ul class="tuform">
@@ -156,4 +161,5 @@
     <xsl:apply-templates select="viewtypes" />
     <xsl:apply-templates select="refreshrates" />
+    <xsl:apply-templates select="languages" />
     <xsl:choose>
      <xsl:when test="/root/mod = ''">
@@ -180,4 +186,5 @@
    <xsl:apply-templates select="torrent_info_root" />
    <xsl:apply-templates select="torrent_files_root" />
+   <xsl:apply-templates select="torrent_peers_root" />
    <xsl:apply-templates select="torrent_trackers_root" />
    <xsl:apply-templates select="server_info" />
@@ -261,5 +268,5 @@
  <xsl:template match="viewtype">
   <xsl:choose>
-   <xsl:when test="/root/torrents/@viewtype = @value">
+   <xsl:when test="/root/@viewtype = @value">
     <option value="{@value}" title="{@title}" selected="selected"><xsl:value-of select="@title" /></option>
    </xsl:when>
@@ -287,5 +294,31 @@
  <xsl:template match="refreshrate">
   <xsl:choose>
-   <xsl:when test="/root/torrents/@refreshrate = @value">
+   <xsl:when test="/root/@refreshrate = @value">
+    <option value="{@value}" title="{@title}" selected="selected"><xsl:value-of select="@title" /></option>
+   </xsl:when>
+   <xsl:otherwise>
+    <option value="{@value}" title="{@title}"><xsl:value-of select="@title" /></option>
+   </xsl:otherwise>
+  </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="languages">
+  <form id="changelanguageform" name="changelanguageform" method="post" action="{/root/iurl}?mod=changelanguage">
+   <xsl:text>[</xsl:text>
+   <xsl:value-of select="/root/labels/language" />
+   <xsl:text>: </xsl:text>
+   <select class="whiteselect" name="language" title="{/root/labels/selectlanguage}" onchange="window.location='{/root/iurl}?mod=changelanguage&amp;language='+this.value;">
+    <xsl:apply-templates select="language" />
+   </select>
+   <noscript>
+    <input class="submit" id="lsubmit" type="submit" name="lsubmit" title="{/root/labels/ok}" value="{/root/labels/ok}" />
+   </noscript>
+   <xsl:text>]</xsl:text>
+  </form>
+ </xsl:template>
+
+ <xsl:template match="language">
+  <xsl:choose>
+   <xsl:when test="/root/@language = @value">
     <option value="{@value}" title="{@title}" selected="selected"><xsl:value-of select="@title" /></option>
    </xsl:when>
@@ -518,7 +551,8 @@
     <xsl:when test="/root/allow_ajax = 'true'">
      <div class="tcontainer" id="torrent_{d_hash}" style="display: none;">
-      <a class="info" href="?mod=torrent&amp;hash={d_hash}&amp;page=info" title="{/root/labels/info}" onclick="loadcontent( '{d_hash}', 'info' ); return false;"><xsl:value-of select="/root/labels/info" /></a>
-      <a class="files" href="?mod=torrent&amp;hash={d_hash}&amp;page=files" title="{/root/labels/filelist}" onclick="loadcontent( '{d_hash}', 'files' ); return false;"><xsl:value-of select="/root/labels/filelist" /></a>
-      <a class="trackers" href="?mod=torrent&amp;hash={d_hash}&amp;page=trackers" title="{/root/labels/trackerlist}" onclick="loadcontent( '{d_hash}', 'trackers' ); return false;"><xsl:value-of select="/root/labels/trackerlist" /></a>
+      <a class="subpage" href="?mod=torrent&amp;hash={d_hash}&amp;page=peers" title="{/root/labels/peerlist}" onclick="loadcontent( '{d_hash}', 'peers' ); return false;"><xsl:value-of select="/root/labels/peerlist" /></a>
+      <a class="subpage" href="?mod=torrent&amp;hash={d_hash}&amp;page=info" title="{/root/labels/info}" onclick="loadcontent( '{d_hash}', 'info' ); return false;"><xsl:value-of select="/root/labels/info" /></a>
+      <a class="subpage" href="?mod=torrent&amp;hash={d_hash}&amp;page=files" title="{/root/labels/filelist}" onclick="loadcontent( '{d_hash}', 'files' ); return false;"><xsl:value-of select="/root/labels/filelist" /></a>
+      <a class="subpage" href="?mod=torrent&amp;hash={d_hash}&amp;page=trackers" title="{/root/labels/trackerlist}" onclick="loadcontent( '{d_hash}', 'trackers' ); return false;"><xsl:value-of select="/root/labels/trackerlist" /></a>
       <div class="clr"></div>
       <div class="tcontent" id="torrent_{d_hash}_content"></div>
@@ -686,4 +720,15 @@
   <li class="line">
    <div class="infoleft">
+    <xsl:value-of select="/root/labels/peersconnected" />
+   </div>
+   <div class="inforight">
+    <span title="{/root/labels/dminpeers}: {d_peers_min} - {/root/labels/dmaxpeers}: {d_peers_max}">
+     <xsl:value-of select="d_peers_connected" />
+    </span>
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
     <xsl:value-of select="/root/labels/leechers" />
    </div>
@@ -785,7 +830,60 @@
  </xsl:template>
 
+ <xsl:template match="torrent_peers_root">
+  <xsl:apply-templates select="torrent_peers" />
+ </xsl:template>
+
+ <xsl:template match="torrent_peers">
+  <li class="phead">
+   <div class="paddress">
+    <xsl:value-of select="/root/labels/address" />
+   </div>
+   <div class="pup">
+    <xsl:value-of select="/root/labels/up_rate" />
+   </div>
+   <div class="pdown">
+    <xsl:value-of select="/root/labels/down_rate" />
+   </div>
+   <div class="prate">
+    <xsl:value-of select="/root/labels/peer_rate" />
+   </div>
+   <div class="pdone">
+    <xsl:value-of select="/root/labels/pdone" />
+   </div>
+   <div class="pincoming">
+    <xsl:value-of select="/root/labels/incoming" />
+   </div>
+   <div class="pencrypted">
+    <xsl:value-of select="/root/labels/encrypted" />
+   </div>
+   <div class="pclient">
+    <xsl:value-of select="/root/labels/pclientversion" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <xsl:apply-templates select="peer" />
+ </xsl:template>
+
  <xsl:template match="server_info">
   <li class="line">
    <div class="infoleft">
+    <xsl:value-of select="/root/labels/hostname" />
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="hostname" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line spacer">
+   <div class="infoleft">
+    <xsl:value-of select="/root/labels/pid" />
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="pid" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
     <xsl:value-of select="/root/labels/clientversion" />
    </div>
@@ -833,13 +931,4 @@
   <li class="line">
    <div class="infoleft">
-    <xsl:value-of select="/root/labels/hostname" />
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="hostname" />
-   </div>
-   <div class="clr"></div>
-  </li>
-  <li class="line">
-   <div class="infoleft">
     <xsl:value-of select="/root/labels/listeningipaddress" />
    </div>
@@ -876,10 +965,19 @@
    <div class="clr"></div>
   </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:value-of select="/root/labels/portrange" />
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="port_range/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
   <li class="line spacer">
    <div class="infoleft">
-    <xsl:value-of select="/root/labels/portrange" />
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="port_range/@value" />
+    <xsl:value-of select="/root/labels/udptrackers" />
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="use_udp_trackers/@value" />
    </div>
    <div class="clr"></div>
@@ -893,13 +991,18 @@
         <xsl:value-of select="/root/labels/dht" />
        </div>
-       <div class="inforight">
+       <div class="inforight" onmouseover="this.style.cursor='pointer';" onclick="toggle( 'serverinfo_info_restore' );">
         <form class="changedhtstatusform" name="changedhtstatusform" method="post" action="{/root/iurl}?mod=changedhtstatus">
-         <select class="whiteselect" name="dhtstatus" title="{/root/labels/changedhtstatus}" onchange="window.location='{/root/iurl}?mod=changedhtstatus&amp;dhtstatus='+this.value;">
-          <option value="0" title="{/root/labels/stopped}" selected="selected"><xsl:value-of select="/root/labels/stopped" /></option>
-          <option value="1" title="{/root/labels/start}"><xsl:value-of select="/root/labels/start" /></option>
-         </select>
+         <span id="changedhtselect">
+          <select class="whiteselect" name="dhtstatus" title="{/root/labels/changedhtstatus}" onchange="window.location='{/root/iurl}?mod=changedhtstatus&amp;dhtstatus='+this.value;">
+           <option value="0" title="{/root/labels/stopped}" selected="selected"><xsl:value-of select="/root/labels/stopped" /></option>
+           <option value="1" title="{/root/labels/start}"><xsl:value-of select="/root/labels/start" /></option>
+          </select>
+         </span>
          <noscript>
           <input class="submit" type="submit" name="{/root/labels/ok}" value="{/root/labels/ok}" title="{/root/labels/ok}" />
          </noscript>
+         <span id="changedht" title="{/root/labels/clicktochange}">
+          <xsl:value-of select="dht_statistics_active/@value" />
+         </span>
         </form>
        </div>
@@ -912,13 +1015,18 @@
         <xsl:value-of select="/root/labels/dht" />
        </div>
-       <div class="inforight">
+       <div class="inforight" onmouseover="this.style.cursor='pointer';" onclick="toggle( 'serverinfo_info_restore' );">
         <form class="changedhtstatusform" name="changedhtstatusform" method="post" action="{/root/iurl}?mod=changedhtstatus">
-         <select class="whiteselect" name="dhtstatus" title="{/root/labels/changedhtstatus}" onchange="window.location='{/root/iurl}?mod=changedhtstatus&amp;dhtstatus='+this.value;">
-          <option value="0" title="{/root/labels/stop}"><xsl:value-of select="/root/labels/stop" /></option>
-          <option value="1" title="{/root/labels/started}" selected="selected"><xsl:value-of select="/root/labels/started" /></option>
-         </select>
+         <span id="changedhtselect">
+          <select class="whiteselect" name="dhtstatus" title="{/root/labels/changedhtstatus}" onchange="window.location='{/root/iurl}?mod=changedhtstatus&amp;dhtstatus='+this.value;">
+           <option value="0" title="{/root/labels/stop}"><xsl:value-of select="/root/labels/stop" /></option>
+           <option value="1" title="{/root/labels/started}" selected="selected"><xsl:value-of select="/root/labels/started" /></option>
+          </select>
+         </span>
          <noscript>
           <input class="submit" type="submit" name="{/root/labels/ok}" value="{/root/labels/ok}" title="{/root/labels/ok}" />
          </noscript>
+         <span id="changedht" title="{/root/labels/clicktochange}">
+          <xsl:value-of select="dht_statistics_active/@value" />
+         </span>
         </form>
        </div>
@@ -999,6 +1107,9 @@
        <div class="inforight">
         <xsl:value-of select="dht_statistics_peers" />
-        <xsl:text> / </xsl:text>
+        <xsl:text> (</xsl:text>
+        <xsl:value-of select="/root/labels/highest" />
+        <xsl:text>: </xsl:text>
         <xsl:value-of select="dht_statistics_peers_max" />
+        <xsl:text>)</xsl:text>
        </div>
        <div class="clr"></div>
@@ -1325,3 +1436,40 @@
  </xsl:template>
 
+ <xsl:template match="peer">
+  <li>
+   <div class="paddress">
+    <xsl:value-of select="p_address" />
+   </div>
+   <div class="pup">
+    <xsl:value-of select="p_up_rate/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="p_up_rate/@suffix" />
+   </div>
+   <div class="pdown">
+    <xsl:value-of select="p_down_rate/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="p_down_rate/@suffix" />
+   </div>
+   <div class="prate">
+    <xsl:value-of select="p_peer_rate/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="p_peer_rate/@suffix" />
+   </div>
+   <div class="pdone">
+    <xsl:value-of select="p_completed_percent" />
+    <xsl:text> %</xsl:text>
+   </div>
+   <div class="pincoming">
+    <xsl:value-of select="p_incoming/@value" />
+   </div>
+   <div class="pencrypted">
+    <xsl:value-of select="p_encrypted/@value" />
+   </div>
+   <div class="pclient">
+    <xsl:value-of select="p_client_version" />
+   </div>
+   <div class="clr"></div>
+  </li>
+ </xsl:template>
+
 </xsl:stylesheet>
Index: themes/default_ajax/layout.main.login.xsl
===================================================================
--- themes/default_ajax/layout.main.login.xsl	(revision 49fafb4c4b73ded67f75984b08c402355a202a61)
+++ themes/default_ajax/layout.main.login.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
@@ -9,8 +9,8 @@
 
  <xsl:template match="root">
-  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{lang}" lang="{lang}">
+  <html xml:lang="{language}" lang="{language}">
    <head>
     <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-    <meta http-equiv="content-language" content="{lang}" />
+    <meta http-equiv="content-language" content="{language}" />
     <meta http-equiv="cache-control" content="no-store, no-cache, must-revalidate, post-check=0, pre-check=0" />
     <meta http-equiv="pragma" content="no-cache" />
@@ -19,5 +19,4 @@
     <meta name="author" content="{labels/author}" />
     <meta name="description" content="{labels/description}" />
-    <meta name="keywords" content="{labels/keywords}" />
     <meta name="doc-type" content="web page" />
     <meta name="rating" content="general" />
@@ -31,4 +30,5 @@
     <div id="loginbox">
      <xsl:apply-templates select="err" />
+     <xsl:apply-templates select="languages" />
      <form id="login" method="post" action="{iurl}?mod=login">
       <ul>
@@ -45,4 +45,10 @@
         </div>
        </li>
+       <li>
+        <div class="lftitle"><xsl:value-of select="labels/rememberme" />:</div>
+        <div class="lffield">
+         <input id="lfremember" type="checkbox" title="labels/rememberme" name="rememberme" />
+        </div>
+       </li>
        <li class="formsend">
         <input class="inputok" type="submit" title="{labels/login}" name="{labels/login}" value="{labels/login}" />
@@ -50,4 +56,7 @@
       </ul>
      </form>
+    </div>
+    <div id="footer">
+     <span><a href="http://projects.cyla.homeip.net/rtwi/" title="{labels/homepage}"><xsl:value-of select="labels/homepage" /></a></span>
     </div>
    </body>
@@ -63,3 +72,29 @@
  </xsl:template>
 
+ <xsl:template match="languages">
+  <form id="changelanguageform" name="changelanguageform" method="post" action="{/root/iurl}?mod=changelanguage">
+   <xsl:text>[</xsl:text>
+   <xsl:value-of select="/root/labels/language" />
+   <xsl:text>: </xsl:text>
+   <select class="whiteselect" name="language" title="{/root/labels/selectlanguage}" onchange="window.location='{/root/iurl}?mod=changelanguage&amp;language='+this.value;">
+    <xsl:apply-templates select="language" />
+   </select>
+   <noscript>
+    <input class="submit" id="lsubmit" type="submit" name="lsubmit" title="{/root/labels/ok}" value="{/root/labels/ok}" />
+   </noscript>
+   <xsl:text>]</xsl:text>
+  </form>
+ </xsl:template>
+
+ <xsl:template match="language">
+  <xsl:choose>
+   <xsl:when test="/root/@language = @value">
+    <option value="{@value}" title="{@title}" selected="selected"><xsl:value-of select="@title" /></option>
+   </xsl:when>
+   <xsl:otherwise>
+    <option value="{@value}" title="{@title}"><xsl:value-of select="@title" /></option>
+   </xsl:otherwise>
+  </xsl:choose>
+ </xsl:template>
+
 </xsl:stylesheet>
