Index: tolbase/lib/rmtps_client/rmtps_client.tcl
===================================================================
--- tolbase/lib/rmtps_client/rmtps_client.tcl	(revision 71d086839b0727dc943218326f9fe7ca6542d5ce)
+++ tolbase/lib/rmtps_client/rmtps_client.tcl	(revision bc98cf72238492cd013e98425b050d736b2d041b)
@@ -9,4 +9,27 @@
 
 package provide rmtps_client 1.0
+
+package require base64
+
+if { [ catch { package require tlogger } ] } {
+  namespace eval tlogger {
+    variable _level "error"
+
+    proc init { svc {logfile ""} } {
+    }
+    
+    proc level { svc l } {
+      variable _level $l
+    }
+
+    proc log { l msg } {
+      variable _level 
+
+      if { $l eq $_level } {
+        puts $msg
+      }
+    }
+  }
+}
 
 ###############################################################################
@@ -38,4 +61,16 @@
   #
   variable mydir [file normalize [file dir [info script]]]
+
+  
+}
+
+proc ::rmtps_client::init { {logfile ""} } {
+  ::tlogger::init  rmtps_client $logfile
+  ::tlogger::level rmtps_client "error"
+}
+
+proc ::rmtps_client::log { level msg } {
+  
+  ::tlogger::log rmtps_client $level $msg
 }
 
@@ -96,6 +131,9 @@
   variable error_reason
 
+  log "debug" "wait_result $chan"
+
   if {![eof $chan]} {
     if {[gets $chan data] == -1} {
+      log "debug" "wait_result : incomplete data"
       return;			# only handle complete lines
     }
@@ -106,4 +144,5 @@
     fileevent $chan readable {}
     set error_reason "end of channel from server"
+    log "warn" "wait_result : end of channel from server"
     # Cancel vwait
     #
@@ -116,4 +155,5 @@
   # Return the data via the vwaited variable
   #
+  log "debug" "wait_result read : $data"
   set server_result $data
 }
@@ -128,4 +168,6 @@
   variable server_result
   variable error_reason
+
+  log "debug" "handle_timeout $chan" 
 
   # Set result from server to empty to return from vwait
@@ -161,4 +203,6 @@
   variable asking_error
 
+  log "debug" "enter ask_server $host $port $request"
+
   # open channel to server
   #
@@ -190,11 +234,8 @@
   vwait ::rmtps_client::server_result
   
-#  if {$asking_error} {
-#    set asking_error 0
-#  } elseif {[string is integer $server_result] && $server_result==0} {
-#    set asking_error 1
-#    set error_reason [ask_server $host $port "LERROR"]
-#  }
   catch {close $chan}
+
+  log "debug" "enter ask_server $host $port $server_result"
+  
   set server_result
 }
@@ -218,8 +259,14 @@
 proc ::rmtps_client::server_ping { host port } {
 
+  log "debug" "enter server_ping $host $port"
+
   # send request to server
   #
   set ans [ask_server $host $port "PING"]
-  expr {$ans eq "RMTPS_SERVER WORKING"}
+  set result [expr {$ans eq "RMTPS_SERVER WORKING"}]
+
+  log "debug" "leave server_ping $host $port"
+
+  set result
 }
 
@@ -243,10 +290,16 @@
 proc ::rmtps_client::ps_is_active { host port PID } {
 
+  log "debug" "enter ps_is_active $host $port $PID"
+
   # send request to server
   #
   set result [ask_server $host $port "ALIVE $PID"]
-  # Answer from server must be an integer or boolean value
-  #
-  if {![string is integer $result] || ![string is boolean $result]} {
+
+  log "debug" "from ask_server = '$result'"
+
+  # Answer from server must be an integer value
+  #
+  if { $result eq "" || ![string is integer $result] ||
+      ![string is boolean $result] } {
     set result -1
   } else {
@@ -255,4 +308,8 @@
     set result [expr {!!$result}]
   }
+
+  log "debug" "leave ps_is_active $host $port $PID : $result"
+
+  set result
 }
 
@@ -277,4 +334,6 @@
 ###############################################################################
 proc ::rmtps_client::ps_kill { host port PID } {
+
+  log "debug" "enter ps_kill $host $port $PID"
 
   # send request to server
@@ -288,6 +347,10 @@
     # Make sure 0, 1 or -1 is returned
     #
-    expr {$result==-1?-1:$result!=0}
-  }
+    set result [expr {$result==-1?-1:$result!=0}]
+  }
+
+  log "debug" "leave ps_kill $host $port $PID : $result"
+
+  set result
 }
 
@@ -310,4 +373,6 @@
 proc ::rmtps_client::ps_run { host port cmdline } {
 
+  log "debug" "enter ps_run $host $port $cmdline"
+
   # send request to server
   #
@@ -318,4 +383,44 @@
     set result 0
   }
+
+  log "debug" "leave ps_run $host $port $cmdline : $result"
+
+  set result
+}
+
+
+###############################################################################
+#
+#  ps_runtol -- execute a TOL process on a remote host
+#
+#   Arguments --
+#
+#     host        - computer (remote host) where RmtPS_Server is running
+#     port        - port where the server socket is listening
+#     cmdln_args  - TOL arguments
+#
+#   Return --
+#
+#     PID of the process if cmdline could be executed
+#     0 if the command line could not be executed
+#
+###############################################################################
+proc ::rmtps_client::ps_runtol { host port cmdln_args } {
+
+  log "debug" "enter ps_runtol $host $port $cmdln_args"
+
+  # send request to server
+  #
+  set cmdln64 [ base64::encode -wrapchar "" $cmdln_args ]
+  #set cmdln64 $cmdln_args
+  set result [ask_server $host $port "RUNTOL $cmdln64"]
+  # Make sure that 0 or PID>0 is returned
+  #
+  if {![string is integer $result] || $result<0} {
+    set result 0
+  }
+
+  log "debug" "leave ps_runtol $host $port $cmdln_args : $result"
+
   set result
 }
Index: tolbase/lib/rmtps_client/rmtps_client.tol
===================================================================
--- tolbase/lib/rmtps_client/rmtps_client.tol	(revision 71d086839b0727dc943218326f9fe7ca6542d5ce)
+++ tolbase/lib/rmtps_client/rmtps_client.tol	(revision bc98cf72238492cd013e98425b050d736b2d041b)
@@ -10,6 +10,7 @@
  *  Argumentos:
  *
- *    Host:
- *    Port:
+ *    Host: host que aloja al servidor RMTPS
+ *    
+ *    Port: puerto donde el servidor RMPTS esta escuchando
  *
  *  Resultado:
@@ -37,6 +38,8 @@
  *  Argumentos:
  *
- *    Host:
- *    Port:
+ *    Host: host que aloja al servidor RMTPS
+ *    
+ *    Port: puerto donde el servidor RMPTS esta escuchando
+ *
  *    CmdLine:
  *
@@ -65,7 +68,95 @@
 
 /**
+ *  RemoteTOL -- Invoca un proceso TOL remoto
+ *
+ *  Argumentos:
+ *
+ *    Host: host que aloja al servidor RMTPS
+ *    
+ *    Port: puerto donde el servidor RMPTS esta escuchando
+ *
+ *    Args:
+ *
+ *  Resultado:
+ *
+ *    PID del proceso TOL lanzado o 0 si algun error ha ocurrido
+ *  
+ */
+Real RemoteTOL(Text Host, Real Port, Set Args )
+{
+
+  Text cmd = "::rmtps_client::ps_runtol";
+  Text port = FormatReal(Port, "%.0lf");
+  Text project = Args[ 1 ];
+  Set tolargs = Args[ 2 ];
+  Set cmdln_args = If( project=="", Copy( Empty ),
+                       [[ "-project", project ]] );
+  Set EvalSet( tolargs, Real( Set item ) {
+      Text type = Name( item[ 1 ] );
+      Case( type=="expr", {
+          Set Append( cmdln_args, [[ "-expr", item[ 1 ] ]] );
+          Real 0
+        },
+        type=="file", {
+          Real idx_rel = FindIndexByName( item, "relative" );
+          Set Append( cmdln_args,
+                      If( idx_rel, {
+                          Set [[ "-relative", item[ idx_rel ],
+                                 "-file", item[ 1 ] ]]
+                        }, {
+                          Set [[ "-file", item[ 1 ] ]]
+                        } ) );
+          Real 0
+        } ,
+        1, {
+          Warning( "RemoteTOL: tipo de elemento desconocido '"
+                   + type + "' debe "
+                   "ser 'expr' o 'file'" );
+          Real 0
+        } );
+        Real 0
+    } );
+  Set tcl_args = [[ cmd, host, port ]] << [[ cmdln_args ]];
+  //Set View( tcl_args, "Std" );
+  Set result = Tcl_EvalEx( tcl_args );
+  Real If(result["status"], Eval(result["result"]),{
+      WriteLn("RemoteTOL: "+result["result"],"E");
+      Real 0
+    })
+};
+PutDescription("Ejecuta en proceso TOL remoto. Args es un conjunto con los "
+               "argumentos a pasar a TOL en la linea de comandos.\n"
+               "Los elementos de Args son interpretados por el servidor de "
+               "procesos TOL y se traducen en argumentos de linea de comandos "
+               "al proceso TOL que se invoca. Los argumentos son:\n"
+               "\tText project = nombre del proyecto que se cargara\n"
+               "\tSet tolargs = conjunto de elementos a evaluar.\n"
+               "El conjunto tolargs contiene expresiones TOL o archivos a "
+               "evaluar en la linea de comandos. Cada uno de los "
+               "elementos es un conjunto con los siguientes elementos con "
+               "nombre:\n"
+               "\tText tolargs[1] : contiene la expresion o el nombre del "
+               "\tarchivo a evaluar. El nombre de tolargs[1] debe ser expr o "
+               "\tfile. Si el nombre es expr el valor se considera una "
+               "\texpresion TOL. Si el nombre es file el valor se considera "
+               "\tel nombre de un archivo a evaluar."
+               "\tText relative = nombre de proyecto respecto al cual se "
+               "\tcargara el archivo TOL. Este campo es opcional y solo se "
+               "\tconsidera cuando el tolargs[1] es un archivo. Por omision "
+               "\tel archivo se toma trelativo al argumento project.\n\n"
+               "Retorna el PID del proceso TOL ejecutado o 0 si algun error "
+               "ocurrio durante el intento de ejecucion. "
+               "Necesita que un servidor RmtPS_Server este escuchando en el "
+               "puerto Port del ordenador Host",
+               RemoteTOL);
+
+/**
  *  RemoteAlive -- Verifica, en remoto, si un proceso continua vivo
  *
  *  Argumentos:
+ *
+ *    Host: host que aloja al servidor RMTPS
+ *    
+ *    Port: puerto donde el servidor RMPTS esta escuchando
  *
  *    Host:
@@ -108,4 +199,8 @@
  *  Argumentos:
  *
+ *    Host: host que aloja al servidor RMTPS
+ *    
+ *    Port: puerto donde el servidor RMPTS esta escuchando
+ *
  *    Host:
  *    Port:
