Index: ode_net.c
===================================================================
--- ode_net.c	(revision 920)
+++ ode_net.c	(revision 921)
@@ -52,11 +52,11 @@
     int group;
 
 //    raydium_log("ode_net: NEWELEM event, from %i",buff[1]);
-    
+
     // if we already have this element, refresh it
-    if(elem>=0) 
+    if(elem>=0)
         raydium_ode_element_delete(elem,1);
-    
+
     memcpy(&type,buff+dec,sizeof(int));
     dec+=sizeof(int);
 
@@ -179,9 +179,24 @@
 dReal q[4];
 dReal *p;
 
+
 if(raydium_network_mode!=RAYDIUM_NETWORK_MODE_CLIENT)
     return;
 
+if(!nelems)
+    {
+    time_t now;
+
+    time(&now);
+    if(now>raydium_network_keepalive[raydium_network_uid]+RAYDIUM_NETWORK_TIMEOUT/2)
+        {
+        memset(data,raydium_network_uid,RAYDIUM_NETWORK_PACKET_SIZE);
+        raydium_network_write(NULL,raydium_network_uid,RAYDIUM_NETWORK_PACKET_KEEP_ALIVE_CLIENT,data);
+        //raydium_log("->Keep Alive");
+        }
+    return;
+    }
+
 dec=RAYDIUM_NETWORK_PACKET_OFFSET;
 
 dec+=sizeof(nelems);
@@ -189,7 +204,7 @@
 for(i=0;i<nelems;i++)
  {
  if(!raydium_ode_element_isvalid(e[i])) continue;
- if(raydium_ode_element[e[i]].nid<0) continue;
+ if(raydium_ode_element[e[i]].nid<1000) continue;
  if(raydium_ode_element[e[i]].distant) continue;
  //Ignore at a level of 99% disabled body // Not accurate need to be tested more deeply.
 // if( raydium_ode_element_disable_get(e[i]) && raydium_random_0_x(1)>0.01) continue;
@@ -229,7 +244,7 @@
 n=0;
 for(i=0;i<RAYDIUM_ODE_MAX_ELEMENTS;i++)
  if(raydium_ode_element_isvalid(i) &&
-    raydium_ode_element[i].nid>=0 )
+    raydium_ode_element[i].nid>=1000 )
         {
         e[n]=i;
         n++;
@@ -256,7 +271,7 @@
 while(i<nelems)
     {
     n=raydium_random_i(0,RAYDIUM_ODE_MAX_ELEMENTS);
-    if(raydium_ode_element[n].state && raydium_ode_element[n].nid>=0 && !done[n])
+    if(raydium_ode_element[n].state && raydium_ode_element[n].nid>=1000 && !done[n])
         {
         done[n]=1;
         e[i]=n;
@@ -285,10 +300,11 @@
     {
     curr++;
     if(curr>=RAYDIUM_ODE_MAX_ELEMENTS) curr=0;
-    if(raydium_ode_element[curr].state && raydium_ode_element[curr].nid>=0)
+    if(raydium_ode_element[curr].state && raydium_ode_element[curr].nid>=1000 && !raydium_ode_element[curr].distant)
         {
         e[i]=curr;
         i++;
+        //raydium_log("sending %d %s",raydium_ode_element[curr].nid,raydium_ode_element[curr].name);
         }
     total++;
     if(total>RAYDIUM_ODE_MAX_ELEMENTS) break;
@@ -317,10 +333,12 @@
 dReal *pos;
 dReal Pcross[3];
 
+//raydium_log("NetOde data %d",ev->nid);
 elem=raydium_network_nid_element_find(ev->nid);
-if(elem<0) 
+if(elem<0)
     {
     // ask for this nid:
+    //raydium_log("Nid Who %d elem.",ev->nid);
     raydium_ode_network_nidwho(ev->nid);
     return; // nid not found.. unknown element !
     }
@@ -339,7 +357,7 @@
 {
     raydium_ode_element_move(elem,ev->pos);
     memcpy(raydium_ode_element[elem].netvel,ev->vel,sizeof(dReal)*3);
-#ifdef DEBUG_ODENET    
+#ifdef DEBUG_ODENET
     raydium_log("%i elem's first update (or 0 hz ODE callback)",elem);
 #endif
 }
@@ -424,7 +442,7 @@
     return;
 
 for(i=0;i<RAYDIUM_ODE_MAX_ELEMENTS;i++)
-    if(raydium_ode_element[i].nid>=0 && 
+    if(raydium_ode_element[i].nid>=1000 &&
        raydium_ode_element[i].distant &&
        (time(NULL)>raydium_ode_element[i].lastnetupdate+RAYDIUM_NETWORK_TIMEOUT))
             {
@@ -436,9 +454,9 @@
 if(raydium_network_read(&id,&type,data)!=RAYDIUM_NETWORK_DATA_OK)
 //if(raydium_network_read_flushed(&id,&type,data)!=RAYDIUM_NETWORK_DATA_OK)
     return;
-    
+
 #ifndef ODE_NETWORK_GHOSTS
-if(id==raydium_network_uid) 
+if(id==raydium_network_uid)
     return; // do not update our elements !
 #endif
 
@@ -462,7 +480,7 @@
 
 if(raydium_network_mode!=RAYDIUM_NETWORK_MODE_CLIENT)
     return;
-    
+
 if(!raydium_ode_element_isvalid(e)) return;
 if(raydium_ode_element[e].distant) return;
 
@@ -506,7 +524,7 @@
     return;
 
 if(!raydium_ode_element_isvalid(e)) return;
-if(raydium_ode_element[e].nid<0) return;
+if(raydium_ode_element[e].nid<1000) return;
 if(raydium_ode_element[e].distant) return;
 
 dec=RAYDIUM_NETWORK_PACKET_OFFSET;