diff -Nru clearsilver-0.9.6/Makefile clearsilver-0.9.7/Makefile
--- clearsilver-0.9.6/Makefile	Mon Oct 20 14:19:29 2003
+++ clearsilver-0.9.7/Makefile	Tue Nov 18 18:07:55 2003
@@ -107,8 +107,8 @@
 		mkdir -p $$mdir; \
 	done
 
-CS_DISTDIR = clearsilver-0.9.6
-CS_LABEL = CLEARSILVER-0_9_6
+CS_DISTDIR = clearsilver-0.9.7
+CS_LABEL = CLEARSILVER-0_9_7
 CS_FILES = README README.python INSTALL LICENSE CS_LICENSE rules.mk.in Makefile util cs cgi python scripts mod_ecs imd java-jni perl ruby dso csharp acconfig.h autogen.sh config.guess config.sub configure.in cs_config.h.in mkinstalldirs install-sh ClearSilver.h ports contrib
 cs_dist:
 	rm -rf $(CS_DISTDIR)
diff -Nru clearsilver-0.9.6/cgi/cgi.c clearsilver-0.9.7/cgi/cgi.c
--- clearsilver-0.9.6/cgi/cgi.c	Wed Oct  8 16:45:40 2003
+++ clearsilver-0.9.7/cgi/cgi.c	Tue Nov 18 17:54:37 2003
@@ -199,6 +199,8 @@
   {"HTTP_USER_AGENT", "UserAgent"},
   {"HTTP_IF_MODIFIED_SINCE", "IfModifiedSince"},
   {"HTTP_REFERER", "Referer"},
+  /* SOAP */
+  {"HTTP_SOAPACTION", "Soap.Action"},
   {NULL, NULL}
 };
 
diff -Nru clearsilver-0.9.6/cgi/rfc2388.c clearsilver-0.9.7/cgi/rfc2388.c
--- clearsilver-0.9.6/cgi/rfc2388.c	Wed Apr  2 15:07:28 2003
+++ clearsilver-0.9.7/cgi/rfc2388.c	Mon Nov 10 13:36:53 2003
@@ -359,6 +359,7 @@
   {
     err = _read_header_line (cgi, &str, done);
     if (err) break;
+    if (*done) break;
     if (str.buf == NULL || str.buf[0] == '\0') break;
     p = strchr (str.buf, ':');
     if (p)
@@ -410,14 +411,14 @@
     }
 
     string_set(&str, "");
-    while (1)
+    while (!(*done))
     {
       char *s;
       int l, w;
 
       err = _read_line (cgi, &s, &l, done);
       if (err) break;
-      if (l == 0) break;
+      if (*done || (l == 0)) break;
       if (_is_boundary(boundary, s, l, done)) break;
       if (filename)
       {
diff -Nru clearsilver-0.9.6/java-jni/Makefile clearsilver-0.9.7/java-jni/Makefile
--- clearsilver-0.9.6/java-jni/Makefile	Wed Sep  3 15:38:47 2003
+++ clearsilver-0.9.7/java-jni/Makefile	Tue Nov  4 16:42:27 2003
@@ -51,7 +51,7 @@
 	LD_LIBRARY_PATH=$(NEOTONIC_ROOT)/java-jni; export LD_LIBRARY_PATH; \
 	CLASSPATH=$(NEO_UTIL_JAVA_JAR):.; export CLASSPATH; \
 	$(JAVA_PATH)/bin/java CSTest > javatest.out; \
-	diff -brief javatest.out javatest.gold  > /dev/null 2>&1; \
+	diff --brief javatest.out javatest.gold  > /dev/null 2>&1; \
 	return_code=$$?; \
 	if [ $$return_code -ne 0 ]; then \
 	  diff javatest.out javatest.gold > javatest.err; \
diff -Nru clearsilver-0.9.6/ports/freebsd/Makefile clearsilver-0.9.7/ports/freebsd/Makefile
--- clearsilver-0.9.6/ports/freebsd/Makefile	Tue Jun 17 14:29:27 2003
+++ clearsilver-0.9.7/ports/freebsd/Makefile	Tue Nov 18 18:07:56 2003
@@ -6,7 +6,7 @@
 #
 
 PORTNAME=      clearsilver
-PORTVERSION=   0.8.1
+PORTVERSION=   0.9.7
 CATEGORIES=    www python perl ruby
 DISTDIR=       /home/blong/ports/distfiles
 MASTER_SITES=  http://www.clearsilver.net/downloads/
diff -Nru clearsilver-0.9.6/ports/rpm/clearsilver.spec clearsilver-0.9.7/ports/rpm/clearsilver.spec
--- clearsilver-0.9.6/ports/rpm/clearsilver.spec	Mon Oct 20 14:19:30 2003
+++ clearsilver-0.9.7/ports/rpm/clearsilver.spec	Tue Nov 18 18:07:58 2003
@@ -23,7 +23,7 @@
 # manpage is probably wrong on some platforms.
 #
 # * The apache/java/ruby/csharp packages are not yet finished.  For one,
-# all of my machines are redhat 7.3 or later, and don't have rpms
+# all of my machines are redhat 7.3 or earlier, and don't have rpms
 # installed for java/ruby/csharp, and my apache installation is Neotonic
 # specific and therefore not much help to the rest of you.
 
@@ -53,11 +53,11 @@
 
 Summary: Neotonic ClearSilver
 Name: clearsilver
-Version: 0.9.6
+Version: 0.9.7
 Release: 1
 Copyright: Open Source - Neotonic ClearSilver License (Apache 1.1 based)
 Group: Development/Libraries
-Source: http://www.clearsilver.net/downloads/clearsilver-0.9.5.tar.gz
+Source: http://www.clearsilver.net/downloads/clearsilver-0.9.7.tar.gz
 URL: http://www.clearsilver.net/
 Vendor: Neotonic Software Corporation, Inc.
 Packager: Brandon Long <blong@neotonic.com>
diff -Nru clearsilver-0.9.6/util/neo_hdf.c clearsilver-0.9.7/util/neo_hdf.c
--- clearsilver-0.9.6/util/neo_hdf.c	Mon Oct 20 14:18:58 2003
+++ clearsilver-0.9.7/util/neo_hdf.c	Wed Oct 29 12:06:57 2003
@@ -880,6 +880,7 @@
       p->next = NULL;
       c = p;
     }
+    h->last_child = c;
   } while (0);
   uListDestroy(&level, 0);
   return nerr_pass(err);
diff -Nru clearsilver-0.9.6/util/neo_misc.h clearsilver-0.9.7/util/neo_misc.h
--- clearsilver-0.9.6/util/neo_misc.h	Fri Aug  8 23:54:17 2003
+++ clearsilver-0.9.7/util/neo_misc.h	Tue Nov 11 18:11:52 2003
@@ -13,7 +13,11 @@
 
 #include <stdlib.h>
 #include <time.h>
+
+/* In case they didn't start from ClearSilver.h... */
+#ifndef __CS_CONFIG_H_
 #include "cs_config.h"
+#endif
 
 /* Fix Up for systems that don't define these standard things... */
 #ifndef __BEGIN_DECLS
diff -Nru clearsilver-0.9.6/util/neo_net.c clearsilver-0.9.7/util/neo_net.c
--- clearsilver-0.9.6/util/neo_net.c	Thu May 22 19:32:19 2003
+++ clearsilver-0.9.7/util/neo_net.c	Wed Oct 29 12:07:23 2003
@@ -30,13 +30,13 @@
 
 static int ShutdownAccept = 0;
 
-void net_shutdown()
+void ne_net_shutdown()
 {
   ShutdownAccept = 1;
 }
 
 /* Server side */
-NEOERR *net_listen(int port, int *fd)
+NEOERR *ne_net_listen(int port, int *fd)
 {
   int sfd = 0;
   int on = 1;
@@ -106,7 +106,7 @@
   return STATUS_OK;
 }
 
-NEOERR *net_accept(NSOCK **sock, int sfd, int data_timeout)
+NEOERR *ne_net_accept(NSOCK **sock, int sfd, int data_timeout)
 {
   NSOCK *my_sock;
   int fd;
@@ -145,7 +145,7 @@
 }
 
 /* Client side */
-NEOERR *net_connect(NSOCK **sock, char *host, int port, int conn_timeout, 
+NEOERR *ne_net_connect(NSOCK **sock, char *host, int port, int conn_timeout, 
     int data_timeout)
 {
   struct sockaddr_in serv_addr;
@@ -278,12 +278,12 @@
   return STATUS_OK;
 }
 
-NEOERR *net_close(NSOCK **sock)
+NEOERR *ne_net_close(NSOCK **sock)
 {
   NEOERR *err;
 
   if (sock == NULL || *sock == NULL) return STATUS_OK;
-  err = net_flush(*sock);
+  err = ne_net_flush(*sock);
   close((*sock)->fd);
   free((*sock));
   *sock = NULL;
@@ -302,7 +302,7 @@
  * calling this we have to check that case as well as standard errors.
  * We could raise an NERR_EOF or something, but that seems like
  * overkill.  We should probably have a ret arg for the case... */
-static NEOERR *net_fill(NSOCK *sock)
+static NEOERR *ne_net_fill(NSOCK *sock)
 {
   NEOERR *err;
   struct timeval tv;
@@ -314,7 +314,7 @@
    * flush the output buffer (if any) before we read */
   if (sock->ol)
   {
-    err = net_flush(sock);
+    err = ne_net_flush(sock);
     if (err) return nerr_pass(err);
   }
 
@@ -363,7 +363,7 @@
   return STATUS_OK;
 }
 
-NEOERR *net_flush(NSOCK *sock)
+NEOERR *ne_net_flush(NSOCK *sock)
 {
   fd_set fds;
   struct timeval tv;
@@ -408,7 +408,7 @@
 }
 
 /* hmm, we may need something to know how much we've read here... */
-NEOERR *net_read(NSOCK *sock, UINT8 *buf, int buflen)
+NEOERR *ne_net_read(NSOCK *sock, UINT8 *buf, int buflen)
 {
   NEOERR *err;
   int x = 0;
@@ -430,7 +430,7 @@
     }
     else
     {
-      err = net_fill(sock);
+      err = ne_net_fill(sock);
       if (err) return nerr_pass(err);
       if (sock->il == 0) return STATUS_OK;
     }
@@ -438,7 +438,7 @@
   return STATUS_OK;
 }
 
-NEOERR *net_read_line(NSOCK *sock, char **buf)
+NEOERR *ne_net_read_line(NSOCK *sock, char **buf)
 {
   NEOERR *err;
   STRING str;
@@ -472,7 +472,7 @@
     }
     else
     {
-      err = net_fill(sock);
+      err = ne_net_fill(sock);
       if (err) break;
       if (sock->il == 0) return STATUS_OK;
     }
@@ -481,7 +481,7 @@
   return nerr_pass(err);
 }
 
-static NEOERR *_net_read_int(NSOCK *sock, int *i, char end)
+static NEOERR *_ne_net_read_int(NSOCK *sock, int *i, char end)
 {
   NEOERR *err;
   int x = 0;
@@ -498,7 +498,7 @@
       if (x == sizeof(buf)) break;
     }
     if (buf[x] == end) break;
-    err = net_fill(sock);
+    err = ne_net_fill(sock);
     if (err) return nerr_pass(err);
     if (sock->il == 0) return STATUS_OK;
   }
@@ -516,14 +516,14 @@
   return STATUS_OK;
 }
 
-NEOERR *net_read_binary(NSOCK *sock, UINT8 **b, int *blen)
+NEOERR *ne_net_read_binary(NSOCK *sock, UINT8 **b, int *blen)
 {
   NEOERR *err;
   UINT8 *data;
   char buf[5];
   int l;
 
-  err = _net_read_int(sock, &l, ':');
+  err = _ne_net_read_int(sock, &l, ':');
   if (err) return nerr_pass(err);
 
   /* Special case to read a NULL */
@@ -542,14 +542,14 @@
 	"Unable to allocate memory for binary data %d" , l);
   }
 
-  err = net_read(sock, data, l);
+  err = ne_net_read(sock, data, l);
   if (err) 
   {
     free(data);
     return nerr_pass(err);
   }
   /* check for comma separator */
-  err = net_read(sock, buf, 1);
+  err = ne_net_read(sock, buf, 1);
   if (err) 
   {
     free(data);
@@ -566,13 +566,13 @@
   return STATUS_OK;
 }
 
-NEOERR *net_read_str_alloc(NSOCK *sock, char **s, int *len)
+NEOERR *ne_net_read_str_alloc(NSOCK *sock, char **s, int *len)
 {
   NEOERR *err;
   int l;
 
   /* just use the binary read and null terminate the string... */
-  err = net_read_binary(sock, (UINT8 **)s, &l);
+  err = ne_net_read_binary(sock, (UINT8 **)s, &l);
   if (err) return nerr_pass(err);
 
   if (*s != NULL)
@@ -583,12 +583,12 @@
   return STATUS_OK;
 }
 
-NEOERR *net_read_int(NSOCK *sock, int *i)
+NEOERR *ne_net_read_int(NSOCK *sock, int *i)
 {
-  return nerr_pass(_net_read_int(sock, i, ','));
+  return nerr_pass(_ne_net_read_int(sock, i, ','));
 }
 
-NEOERR *net_write(NSOCK *sock, UINT8 *b, int blen)
+NEOERR *ne_net_write(NSOCK *sock, UINT8 *b, int blen)
 {
   NEOERR *err;
   int x = 0;
@@ -614,25 +614,25 @@
     }
     else
     {
-      err = net_flush(sock);
+      err = ne_net_flush(sock);
       if (err) return nerr_pass(err);
     }
   }
   return STATUS_OK;
 }
 
-NEOERR *net_write_line(NSOCK *sock, char *s)
+NEOERR *ne_net_write_line(NSOCK *sock, char *s)
 {
   NEOERR *err;
 
-  err = net_write(sock, s, strlen(s));
+  err = ne_net_write(sock, s, strlen(s));
   if (err) return nerr_pass(err);
-  err = net_write(sock, "\n", 1);
+  err = ne_net_write(sock, "\n", 1);
   if (err) return nerr_pass(err);
   return STATUS_OK;
 }
 
-NEOERR *net_write_binary(NSOCK *sock, UINT8 *b, int blen)
+NEOERR *ne_net_write_binary(NSOCK *sock, UINT8 *b, int blen)
 {
   NEOERR *err;
   char buf[32];
@@ -640,36 +640,36 @@
   if (b == NULL) blen = -1;
 
   snprintf(buf, sizeof(buf), "%d:", blen);
-  err = net_write(sock, buf, strlen(buf));
+  err = ne_net_write(sock, buf, strlen(buf));
   if (err) return nerr_pass(err);
 
   if (blen > 0)
   {
-    err = net_write(sock, b, blen);
+    err = ne_net_write(sock, b, blen);
     if (err) return nerr_pass(err);
   }
 
-  err = net_write(sock, ",", 1);
+  err = ne_net_write(sock, ",", 1);
   if (err) return nerr_pass(err);
   return STATUS_OK;
 }
 
-NEOERR *net_write_str(NSOCK *sock, char *s)
+NEOERR *ne_net_write_str(NSOCK *sock, char *s)
 {
   NEOERR *err;
 
   if (s == NULL)
-    err = net_write_binary(sock, s, -1);
+    err = ne_net_write_binary(sock, s, -1);
   else
-    err = net_write_binary(sock, s, strlen(s));
+    err = ne_net_write_binary(sock, s, strlen(s));
   return nerr_pass(err);
 }
 
-NEOERR *net_write_int(NSOCK *sock, int i)
+NEOERR *ne_net_write_int(NSOCK *sock, int i)
 {
   char buf[32];
 
   snprintf(buf, sizeof(buf), "%d,", i);
-  return nerr_pass(net_write(sock, buf, strlen(buf)));
+  return nerr_pass(ne_net_write(sock, buf, strlen(buf)));
 }
 
diff -Nru clearsilver-0.9.6/util/neo_net.h clearsilver-0.9.7/util/neo_net.h
--- clearsilver-0.9.6/util/neo_net.h	Thu Jul 24 11:35:13 2003
+++ clearsilver-0.9.7/util/neo_net.h	Wed Oct 29 12:07:23 2003
@@ -33,22 +33,22 @@
   int ol;
 } NSOCK;
 
-NEOERR *net_listen(int port, int *fd);
-NEOERR *net_accept(NSOCK **sock, int fd, int data_timeout);
-NEOERR *net_connect(NSOCK **sock, char *host, int port, int conn_timeout, int data_timeout);
-NEOERR *net_close(NSOCK **sock);
-NEOERR *net_read(NSOCK *sock, UINT8 *buf, int buflen);
-NEOERR *net_read_line(NSOCK *sock, char **buf);
-NEOERR *net_read_binary(NSOCK *sock, UINT8 **b, int *blen);
-NEOERR *net_read_str_alloc(NSOCK *sock, char **s, int *len);
-NEOERR *net_read_int(NSOCK *sock, int *i);
-NEOERR *net_write(NSOCK *sock, UINT8 *b, int blen);
-NEOERR *net_write_line(NSOCK *sock, char *s);
-NEOERR *net_write_binary(NSOCK *sock, UINT8 *b, int blen);
-NEOERR *net_write_str(NSOCK *sock, char *s);
-NEOERR *net_write_int(NSOCK *sock, int i);
-NEOERR *net_flush(NSOCK *sock);
-void net_shutdown(void);
+NEOERR *ne_net_listen(int port, int *fd);
+NEOERR *ne_net_accept(NSOCK **sock, int fd, int data_timeout);
+NEOERR *ne_net_connect(NSOCK **sock, char *host, int port, int conn_timeout, int data_timeout);
+NEOERR *ne_net_close(NSOCK **sock);
+NEOERR *ne_net_read(NSOCK *sock, UINT8 *buf, int buflen);
+NEOERR *ne_net_read_line(NSOCK *sock, char **buf);
+NEOERR *ne_net_read_binary(NSOCK *sock, UINT8 **b, int *blen);
+NEOERR *ne_net_read_str_alloc(NSOCK *sock, char **s, int *len);
+NEOERR *ne_net_read_int(NSOCK *sock, int *i);
+NEOERR *ne_net_write(NSOCK *sock, UINT8 *b, int blen);
+NEOERR *ne_net_write_line(NSOCK *sock, char *s);
+NEOERR *ne_net_write_binary(NSOCK *sock, UINT8 *b, int blen);
+NEOERR *ne_net_write_str(NSOCK *sock, char *s);
+NEOERR *ne_net_write_int(NSOCK *sock, int i);
+NEOERR *ne_net_flush(NSOCK *sock);
+void ne_net_shutdown(void);
 
 __END_DECLS
 
diff -Nru clearsilver-0.9.6/util/neo_server.c clearsilver-0.9.7/util/neo_server.c
--- clearsilver-0.9.6/util/neo_server.c	Wed Apr  2 15:07:36 2003
+++ clearsilver-0.9.7/util/neo_server.c	Wed Oct 29 12:07:23 2003
@@ -55,17 +55,17 @@
   {
     err = fLock(server->accept_lock);
     if (err) break;
-    err = net_accept(&child_sock, server->server_fd, server->data_timeout);
+    err = ne_net_accept(&child_sock, server->server_fd, server->data_timeout);
     fUnlock(server->accept_lock);
     if (err) break;
     err = server->req_cb(server->data, num, child_sock);
     if (err)
     {
-      net_close(&child_sock);
+      ne_net_close(&child_sock);
     }
     else
     {
-      err = net_close(&child_sock);
+      err = ne_net_close(&child_sock);
     }
     nerr_log_error(err);
     nerr_ignore(&err);
@@ -105,7 +105,7 @@
 static void sig_term(int sig)
 {
   ShutdownPending = 1;
-  net_shutdown();
+  ne_net_shutdown();
 }
 
 static void setup_term(void)
@@ -143,7 +143,7 @@
 
   do
   {
-    err = net_listen(server->port, &(server->server_fd));
+    err = ne_net_listen(server->port, &(server->server_fd));
     if (err) break;
 
     if (debug == TRUE)
