1.0d3

diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..d5e30cd
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+Michael Link, mlink@fractal.net
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..6c32803
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,7 @@
+% tar -zxf mod_tcl.tar.gz
+% mv mod_tcl apache_2.0a9/modules/.
+% cd apache_2.0a9
+% autoconf
+% autoheader
+% ./configure
+% make
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..0486439
--- /dev/null
+++ b/NEWS
@@ -0,0 +1 @@
+1.0d3
diff --git a/README b/README
index 2a541a4..bad4c45 100644
--- a/README
+++ b/README
@@ -1,3 +1,3 @@
 mod_tcl for Apache 2.0
 
-Please see http://www.fractal.net/ for documentation.
+Please see www.fractal.net for documentation.
diff --git a/mod_tcl.h b/mod_tcl.h
index 7e1d3e6..fcd2718 100644
--- a/mod_tcl.h
+++ b/mod_tcl.h
@@ -93,6 +93,7 @@
 #include "http_protocol.h"
 #include "http_request.h"
 #include "util_script.h"
+#include "util_uri.h"
 
 #include "ap_config_auto.h"
 
@@ -109,23 +110,20 @@
 #endif /* HAVE_ASPRINTF */
 
 void run_script(Tcl_Interp *interp, char *fmt, ...);
-void set_var(Tcl_Interp *interp, const char *var1, const char *var2, const char *fmt, ...);
-void set_var2(Tcl_Interp *interp, const char *var1, const char *var2, const char *data, int len);
+void set_var(Tcl_Interp *interp, char *var1, char *var2, const char *fmt, ...);
+void set_vari(Tcl_Interp* interp, char *var1, char *var2, int var);
+void set_varb(Tcl_Interp *interp, char *var1, char *var2, char *data, int len);
 
-int cmd_rputs(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
-int cmd_rwrite(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
-int cmd_ap_send_http_header(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_r(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_r_set(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_read_post(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
-int cmd_ap_get_server_version(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
-int cmd_ap_create_environment(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_abort(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
-int cmd_ap_internal_redirect(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_random(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_srandom(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_base64_encode(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_base64_decode(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+
+/* http_core.h */
 int cmd_ap_allow_options(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_ap_allow_overrides(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_ap_default_type(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
@@ -144,4 +142,50 @@
 int cmd_ap_satisfies(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 int cmd_ap_requires(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
 
+/* http_log.h */
+int cmd_ap_log_error(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+
+/* http_protocol.h */
+int cmd_ap_send_http_header(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_send_http_trace(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_send_http_options(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_finalize_request_protocol(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_send_error_response(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_set_content_length(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_set_keepalive(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_rationalize_mtime(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_make_etag(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_set_etag(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_set_last_modified(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_meets_conditions(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_rputs(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_rwrite(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_rflush(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_get_status_line(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_setup_client_block(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_get_client_block(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_discard_request_body(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_note_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_note_basic_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_note_digest_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_get_basic_auth_pw(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_parse_uri(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_method_number_of(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_method_name_of(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+
+/* http_request.h */
+int cmd_ap_internal_redirect(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_internal_redirect_handler(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_some_auth_required(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_update_mtime(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_allow_methods(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+
+/* httpd.h */
+int cmd_ap_get_server_version(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_add_version_component(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+int cmd_ap_get_server_built(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+
+/* util_script.h */
+int cmd_ap_create_environment(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[]);
+
 #endif /* __MOD_TCL_H__ */
diff --git a/tcl_cmds.c b/tcl_cmds.c
index 43def46..ea5c6a9 100644
--- a/tcl_cmds.c
+++ b/tcl_cmds.c
@@ -61,9 +61,12 @@
 extern Tcl_Interp			*interp;
 extern apr_array_header_t	*fcache;
 extern request_rec			*_r;
+extern apr_pool_t			*_pconf;
 extern char					*current_namespace;
 extern int					read_post_ok;
 
+static int sorted = 0, r_size = 0, connection_size = 0, server_size = 0;
+
 const uint8_t base64[] = {
 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
 };
@@ -359,7 +362,7 @@
 					
 					file_key = apr_psprintf(r->pool, "%s_filename", key);
 					
-					set_var2(interp, "::pram", file_key, file_val, i);
+					set_varb(interp, "::pram", file_key, file_val, i);
 				}
 				
 				break;
@@ -385,7 +388,7 @@
 			val[vlen] = '\0';
 		}
 
-		set_var2(interp, "::pram", key, val, vlen);
+		set_varb(interp, "::pram", key, val, vlen);
 		
 		free(val);
 		
@@ -445,7 +448,7 @@
 			break;
 		}
 		
-		set_var(interp, "::pram", key, val);
+		set_var(interp, "::pram", (char*) key, (char*) val);
 	}
 	
 	return OK;
@@ -486,123 +489,1011 @@
 	}
 }
 
-int cmd_rputs(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+static Tcl_Obj* r_the_request(void)
 {
-	char *opt = NULL, *data;
+	return Tcl_NewStringObj(_r->the_request, -1);
+}
+
+static Tcl_Obj* r_assbackwards(void)
+{
+	return Tcl_NewIntObj(_r->assbackwards);
+}
+
+static Tcl_Obj* r_proxyreq(void)
+{
+	return Tcl_NewIntObj(_r->proxyreq);
+}
+
+static Tcl_Obj* r_header_only(void)
+{
+	return Tcl_NewIntObj(_r->header_only);
+}
+
+static Tcl_Obj* r_protocol(void)
+{
+	return Tcl_NewStringObj(_r->protocol, -1);
+}
+
+static Tcl_Obj* r_proto_num(void)
+{
+	return Tcl_NewIntObj(_r->proto_num);
+}
+
+static Tcl_Obj* r_hostname(void)
+{
+	return Tcl_NewStringObj(_r->hostname, -1);
+}
+
+static Tcl_Obj* r_request_time(void)
+{
+	return Tcl_NewLongObj(_r->request_time);
+}
+
+static Tcl_Obj* r_status_line(void)
+{
+	return Tcl_NewStringObj(_r->status_line, -1);
+}
+
+static Tcl_Obj* r_status(void)
+{
+	return Tcl_NewIntObj(_r->status);
+}
+
+static Tcl_Obj* r_method(void)
+{
+	return Tcl_NewStringObj(_r->method, -1);
+}
+
+static Tcl_Obj* r_method_number(void)
+{
+	return Tcl_NewIntObj(_r->method_number);
+}
+
+static Tcl_Obj* r_allowed(void)
+{
+	return Tcl_NewIntObj(_r->allowed);
+}
+
+/* hasn't been implemented ? */
+static Tcl_Obj* r_allowed_xmethods(void)
+{
+	return Tcl_NewStringObj("", -1);
+}
+
+static Tcl_Obj* r_allowed_methods(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	char **method_list = (char**) _r->allowed_methods->method_list->elts;
 	
-	switch (objc) {
-	  case 3:
-		opt = Tcl_GetString(objv[1]);
-		data = Tcl_GetString(objv[2]);
-		break;
-	  case 2:
-		data = Tcl_GetString(objv[1]);
-		break;
-	  default:
-		Tcl_WrongNumArgs(interp, 1, objv, "?-nonewline? string");
-		return TCL_ERROR;
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewIntObj(_r->allowed_methods->method_mask));
+	
+	for (i = 0; i < _r->allowed_methods->method_list->nelts; i++) {
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(method_list[i], -1));
 	}
 	
-	if (opt && strcmp(opt, "-nonewline")) {
-		Tcl_WrongNumArgs(interp, 1, objv, "?-nonewline? string");
-		return TCL_ERROR;
+	return obj;
+}
+
+static Tcl_Obj* r_sent_bodyct(void)
+{
+	return Tcl_NewIntObj(_r->sent_bodyct);
+}
+
+static Tcl_Obj* r_bytes_sent(void)
+{
+	return Tcl_NewIntObj(_r->bytes_sent);
+}
+
+static Tcl_Obj* r_mtime(void)
+{
+	return Tcl_NewLongObj(_r->mtime);
+}
+
+static Tcl_Obj* r_chunked(void)
+{
+	return Tcl_NewIntObj(_r->chunked);
+}
+
+static Tcl_Obj* r_boundary(void)
+{
+	return Tcl_NewStringObj(_r->boundary, -1);
+}
+
+static Tcl_Obj* r_range(void)
+{
+	return Tcl_NewStringObj(_r->range, -1);
+}
+
+static Tcl_Obj* r_clength(void)
+{
+	return Tcl_NewLongObj(_r->clength);
+}
+
+static Tcl_Obj* r_remaining(void)
+{
+	return Tcl_NewLongObj(_r->remaining);
+}
+
+static Tcl_Obj* r_read_length(void)
+{
+	return Tcl_NewLongObj(_r->read_length);
+}
+
+static Tcl_Obj* r_read_body(void)
+{
+	return Tcl_NewIntObj(_r->read_body);
+}
+
+static Tcl_Obj* r_read_chunked(void)
+{
+	return Tcl_NewIntObj(_r->read_chunked);
+}
+
+static Tcl_Obj* r_expecting_100(void)
+{
+	return Tcl_NewIntObj(_r->expecting_100);
+}
+
+static Tcl_Obj* r_headers_in(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	apr_array_header_t *ha = apr_table_elts(_r->headers_in);
+	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;
+
+	for (i = 0; i < ha->nelts; i++) {
+		Tcl_SetVar2Ex(interp, "headers_in", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
 	}
 	
-	ap_rprintf(_r, "%s%s", data, opt ? "" : "\n");
+	return obj;
+}
+
+static Tcl_Obj* r_headers_out(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	apr_array_header_t *ha = apr_table_elts(_r->headers_out);
+	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;
+
+	for (i = 0; i < ha->nelts; i++) {
+		Tcl_SetVar2Ex(interp, "headers_out", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
+	}
+	
+	return obj;
+}
+
+static Tcl_Obj* r_err_headers_out(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	apr_array_header_t *ha = apr_table_elts(_r->err_headers_out);
+	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;
+
+	for (i = 0; i < ha->nelts; i++) {
+		Tcl_SetVar2Ex(interp, "err_headers_out", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
+	}
+	
+	return obj;
+}
+
+/* ap_create_environment() sets ::env */
+static Tcl_Obj* r_subprocess_env(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	apr_array_header_t *ha = apr_table_elts(_r->subprocess_env);
+	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;
+
+	for (i = 0; i < ha->nelts; i++) {
+		Tcl_SetVar2Ex(interp, "subprocess_env", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
+	}
+	
+	return obj;
+}
+
+static Tcl_Obj* r_notes(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	apr_array_header_t *ha = apr_table_elts(_r->notes);
+	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;
+
+	for (i = 0; i < ha->nelts; i++) {
+		Tcl_SetVar2Ex(interp, "notes", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
+	}
+	
+	return obj;
+}
+
+static Tcl_Obj* r_content_type(void)
+{
+	return Tcl_NewStringObj(_r->content_type, -1);
+}
+
+static Tcl_Obj* r_handler(void)
+{
+	return Tcl_NewStringObj(_r->handler, -1);
+}
+
+static Tcl_Obj* r_content_encoding(void)
+{
+	return Tcl_NewStringObj(_r->content_encoding, -1);
+}
+
+static Tcl_Obj* r_content_languages(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	char **content_languages = (char**) _r->content_languages->elts;
+
+	for (i = 0; i < _r->content_languages->nelts; i++) {
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(content_languages[i], -1));
+	}
+	
+	return obj;
+}
+
+static Tcl_Obj* r_vlist_validator(void)
+{
+	return Tcl_NewStringObj(_r->vlist_validator, -1);
+}
+
+static Tcl_Obj* r_user(void)
+{
+	return Tcl_NewStringObj(_r->user, -1);
+}
+
+static Tcl_Obj* r_ap_auth_type(void)
+{
+	return Tcl_NewStringObj(_r->ap_auth_type, -1);
+}
+
+static Tcl_Obj* r_no_cache(void)
+{
+	return Tcl_NewIntObj(_r->no_cache);
+}
+
+static Tcl_Obj* r_no_local_copy(void)
+{
+	return Tcl_NewIntObj(_r->no_local_copy);
+}
+
+static Tcl_Obj* r_unparsed_uri(void)
+{
+	return Tcl_NewStringObj(_r->unparsed_uri, -1);
+}
+
+static Tcl_Obj* r_uri(void)
+{
+	return Tcl_NewStringObj(_r->uri, -1);
+}
+
+static Tcl_Obj* r_filename(void)
+{
+	return Tcl_NewStringObj(_r->filename, -1);
+}
+
+static Tcl_Obj* r_path_info(void)
+{
+	return Tcl_NewStringObj(_r->path_info, -1);
+}
+
+static Tcl_Obj* r_args(void)
+{
+	return Tcl_NewStringObj(_r->args, -1);
+}
+
+static Tcl_Obj* r_parsed_uri(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.scheme, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.hostinfo, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.user, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.password, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.hostname, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.port_str, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.path, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.query, -1));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.fragment, -1));
+	
+	/* is the rest important? */
+	
+	return obj;
+}
+
+/* variables in r->connection */
+
+static Tcl_Obj* r_connection_remote_ip(void)
+{
+	return Tcl_NewStringObj(_r->connection->remote_ip, -1);
+}
+
+static Tcl_Obj* r_connection_remote_host(void)
+{
+	return Tcl_NewStringObj(_r->connection->remote_host, -1);
+}
+
+static Tcl_Obj* r_connection_remote_logname(void)
+{
+	return Tcl_NewStringObj(_r->connection->remote_logname, -1);
+}
+
+static Tcl_Obj* r_connection_aborted(void)
+{
+	return Tcl_NewIntObj(_r->connection->aborted);
+}
+
+static Tcl_Obj* r_connection_keepalive(void)
+{
+	return Tcl_NewIntObj(_r->connection->keepalive);
+}
+
+static Tcl_Obj* r_connection_keptalive(void)
+{
+	return Tcl_NewIntObj(_r->connection->keptalive);
+}
+
+static Tcl_Obj* r_connection_double_reverse(void)
+{
+	return Tcl_NewIntObj(_r->connection->double_reverse);
+}
+
+static Tcl_Obj* r_connection_keepalives(void)
+{
+	return Tcl_NewIntObj(_r->connection->keepalives);
+}
+
+static Tcl_Obj* r_connection_local_ip(void)
+{
+	return Tcl_NewStringObj(_r->connection->local_ip, -1);
+}
+
+static Tcl_Obj* r_connection_local_host(void)
+{
+	return Tcl_NewStringObj(_r->connection->local_host, -1);
+}
+
+static Tcl_Obj* r_connection_id(void)
+{
+	return Tcl_NewLongObj(_r->connection->id);
+}
+
+static Tcl_Obj* r_connection_notes(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	apr_array_header_t *ha = apr_table_elts(_r->connection->notes);
+	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;
+
+	for (i = 0; i < ha->nelts; i++) {
+		Tcl_SetVar2Ex(interp, "connection_notes", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
+	}
+	
+	return obj;
+}
+
+static Tcl_Obj* r_connection_remain(void)
+{
+	return Tcl_NewLongObj(_r->connection->remain);
+}
+
+static Tcl_Obj* r_server_defn_name(void)
+{
+	return Tcl_NewStringObj(_r->server->defn_name, -1);
+}
+
+static Tcl_Obj* r_server_defn_line_number(void)
+{
+	return Tcl_NewIntObj(_r->server->defn_line_number);
+}
+
+static Tcl_Obj* r_server_server_admin(void)
+{
+	return Tcl_NewStringObj(_r->server->server_admin, -1);
+}
+
+static Tcl_Obj* r_server_server_hostname(void)
+{
+	return Tcl_NewStringObj(_r->server->server_hostname, -1);
+}
+
+static Tcl_Obj* r_server_port(void)
+{
+	return Tcl_NewIntObj(_r->server->port);
+}
+
+static Tcl_Obj* r_server_error_fname(void)
+{
+	return Tcl_NewStringObj(_r->server->error_fname, -1);
+}
+
+static Tcl_Obj* r_server_loglevel(void)
+{
+	return Tcl_NewIntObj(_r->server->loglevel);
+}
+
+static Tcl_Obj* r_server_is_virtual(void)
+{
+	return Tcl_NewIntObj(_r->server->is_virtual);
+}
+
+static Tcl_Obj* r_server_addrs(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewIntObj(_r->server->addrs->host_port));
+	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->server->addrs->virthost, -1));
+	
+	return obj;
+}
+
+static Tcl_Obj* r_server_timeout(void)
+{
+	return Tcl_NewIntObj(_r->server->timeout);
+}
+
+static Tcl_Obj* r_server_keep_alive_timeout(void)
+{
+	return Tcl_NewIntObj(_r->server->keep_alive_timeout);
+}
+
+static Tcl_Obj* r_server_keep_alive_max(void)
+{
+	return Tcl_NewIntObj(_r->server->keep_alive_max);
+}
+
+static Tcl_Obj* r_server_keep_alive(void)
+{
+	return Tcl_NewIntObj(_r->server->keep_alive);
+}
+
+static Tcl_Obj* r_server_path(void)
+{
+	return Tcl_NewStringObj(_r->server->path, -1);
+}
+
+static Tcl_Obj* r_server_names(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	char **a = (char**) _r->server->names->elts;
+	
+	for (i = 0; i < _r->server->names->nelts; i++) {
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(a[i], -1));
+	}
+	
+	return obj;
+}
+
+static Tcl_Obj* r_server_wild_names(void)
+{
+	Tcl_Obj *obj = Tcl_NewObj();
+	int i;
+	char **a = (char**) _r->server->wild_names->elts;
+	
+	for (i = 0; i < _r->server->wild_names->nelts; i++) {
+		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(a[i], -1));
+	}
+	
+	return obj;
+}
+
+static Tcl_Obj* r_server_limit_req_line(void)
+{
+	return Tcl_NewIntObj(_r->server->limit_req_line);
+}
+
+static Tcl_Obj* r_server_limit_req_fieldsize(void)
+{
+	return Tcl_NewIntObj(_r->server->limit_req_fieldsize);
+}
+
+static Tcl_Obj* r_server_limit_req_fields(void)
+{
+	return Tcl_NewIntObj(_r->server->limit_req_fields);
+}
+
+/* sets */
+static int r_set_the_request(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->the_request = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
 	
 	return TCL_OK;
 }
 
-int cmd_rwrite(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+static int r_set_assbackwards(int objc, Tcl_Obj *CONST objv[])
 {
-	char *data = NULL;
-	int length;
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->assbackwards));
 	
-	switch (objc) {
-	  case 2:
-		data = (char*) Tcl_GetByteArrayFromObj(objv[1], &length);
-		break;
-	  default:
-		Tcl_WrongNumArgs(interp, 1, objv, "data");
+	return TCL_OK;
+}
+
+static int r_set_proxyreq(int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->proxyreq));
+	
+	return TCL_OK;
+}
+
+static int r_set_header_only(int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->header_only));
+	
+	return TCL_OK;
+}
+
+static int r_set_protocol(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->protocol = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_proto_num(int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->proto_num));
+	
+	return TCL_OK;
+}
+
+static int r_set_allowed(int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->allowed));
+	
+	return TCL_OK;
+}
+
+/* ? */
+static int r_set_allowed_xmethods(int objc, Tcl_Obj *CONST objv[])
+{	
+	return TCL_OK;
+}
+
+static int r_set_allowed_methods(int objc, Tcl_Obj *CONST objv[])
+{
+	int xxobjc;
+	Tcl_Obj **xxobjv;
+	int i;
+	
+	if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "method_mask method_list");
 		return TCL_ERROR;
 	}
 	
-	ap_rwrite(data, length, _r);
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->allowed_methods->method_mask));
 	
-	return TCL_OK;
-}
-
-int cmd_ap_send_http_header(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
-{
-	Tcl_Obj *obj;
-	
-	obj = Tcl_GetVar2Ex(ixx, "content_type", NULL, 0);
-	
-	if (obj) {
-		_r->content_type = Tcl_GetString(obj);
+	if (Tcl_ListObjGetElements(interp, objv[3], &xxobjc, &xxobjv) == TCL_ERROR) {
+		return TCL_ERROR;
 	}
 	
-	ap_send_http_header(_r);
+	_r->allowed_methods->method_list = apr_make_array(_r->allowed_methods->method_list->cont, xxobjc, sizeof(char*));
+	
+	for (i = 0; i < xxobjc; i++) {
+		char *xx = apr_push_array(_r->allowed_methods->method_list);
+		
+		xx = apr_pstrdup(_r->allowed_methods->method_list->cont, Tcl_GetString(xxobjv[i]));
+	}
 	
 	return TCL_OK;
 }
 
-static int set_headers_in(void *data, const char *key, const char *val)
+static int r_set_headers_out(int objc, Tcl_Obj *CONST objv[])
 {
-	Tcl_Interp *interp = (Tcl_Interp*) data;
+	if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "header_name header");
+		return TCL_ERROR;
+	}
 	
-	set_var(interp, "headers_in", key, val);
+	apr_table_set(_r->headers_out, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
 	
-	return 1;
+	return TCL_OK;
 }
 
+static int r_set_err_headers_out(int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "header_name header");
+		return TCL_ERROR;
+	}
+	
+	apr_table_set(_r->err_headers_out, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
+	
+	return TCL_OK;
+}
+
+static int r_set_subprocess_env(int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "variable_name variable");
+		return TCL_ERROR;
+	}
+	
+	apr_table_set(_r->subprocess_env, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
+	
+	return TCL_OK;
+}
+
+static int r_set_notes(int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "note_name note");
+		return TCL_ERROR;
+	}
+	
+	apr_table_set(_r->notes, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
+	
+	return TCL_OK;
+}
+
+static int r_set_content_type(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->content_type = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_content_encoding(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->content_encoding = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_content_languages(int objc, Tcl_Obj *CONST objv[])
+{
+	int xxobjc;
+	Tcl_Obj **xxobjv;
+	int i;
+	
+	if (Tcl_ListObjGetElements(interp, objv[2], &xxobjc, &xxobjv) == TCL_ERROR) {
+		return TCL_ERROR;
+	}
+	
+	_r->content_languages = apr_make_array(_r->content_languages->cont, xxobjc, sizeof(char*));
+	
+	for (i = 0; i < xxobjc; i++) {
+		char *xx = apr_push_array(_r->content_languages);
+		
+		xx = apr_pstrdup(_r->content_languages->cont, Tcl_GetString(xxobjv[i]));
+	}
+	
+	return TCL_OK;
+}
+
+static int r_set_vlist_validator(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->vlist_validator = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_user(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->user = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_ap_auth_type(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->ap_auth_type = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_no_cache(int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->no_cache));
+	
+	return TCL_OK;
+}
+
+static int r_set_no_local_copy(int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_GetIntFromObj(interp, objv[2], &(_r->no_local_copy));
+	
+	return TCL_OK;
+}
+
+static int r_set_unparsed_uri(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->unparsed_uri = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_uri(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->uri = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_path_info(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->path_info = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_args(int objc, Tcl_Obj *CONST objv[])
+{
+	_r->args = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+static int r_set_parsed_uri(int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_SetObjResult(interp, Tcl_NewIntObj(ap_parse_uri_components(_r->pool, Tcl_GetString(objv[2]), &(_r->parsed_uri))));
+		
+	return TCL_OK;
+}
+
+static int r_set_connection_notes(int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "note_name note");
+		return TCL_ERROR;
+	}
+	
+	apr_table_set(_r->connection->notes, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
+	
+	return TCL_OK;
+}
+
+
+typedef Tcl_Obj* (*fy_t)(void);
+typedef int (*fx_t)(int objc, Tcl_Obj *CONST objv[]);
+
+typedef struct {
+	char	*var;
+	fy_t	rd_func;
+	fx_t	wr_func;
+} r_table;
+
+static int r_find(const void *x, const void *y)
+{
+	return strcmp(((r_table*) x)->var, ((r_table*) y)->var);
+}
+
+r_table r_tbl[] = {
+	{ "allowed",			r_allowed,			r_set_allowed			},
+	{ "allowed_methods",	r_allowed_methods,	r_set_allowed_methods	},
+	{ "allowed_xmethods",	r_allowed_xmethods,	r_set_allowed_xmethods	},
+	{ "ap_auth_type",		r_ap_auth_type,		r_set_ap_auth_type		},
+	{ "args",				r_args,				r_set_args				},
+	{ "assbackwards",		r_assbackwards,		r_set_assbackwards		},
+	{ "boundary",			r_boundary,			NULL					},
+	{ "bytes_sent",			r_bytes_sent,		NULL					},
+	{ "chunked",			r_chunked,			NULL					},
+	{ "clength",			r_clength,			NULL					},
+	{ "content_encoding",	r_content_encoding,	r_set_content_encoding	},
+/*	{ "content_languages",	r_content_languages,r_set_content_languages	}, this is fuct up, and I have no idea why */
+	{ "content_type",		r_content_type,		r_set_content_type		},
+	{ "err_headers_out",	r_err_headers_out,	r_set_err_headers_out	},
+	{ "expecting_100",		r_expecting_100,	NULL					},
+	{ "filename",			r_filename,			NULL					},
+	{ "handler",			r_handler,			NULL					},
+	{ "headers_in",			r_headers_in,		NULL					},
+	{ "headers_out",		r_headers_out,		r_set_headers_out		},
+	{ "header_only",		r_header_only,		r_set_header_only		},
+	{ "hostname",			r_hostname,			NULL					},
+	{ "method",				r_method,			NULL					},
+	{ "method_number",		r_method_number,	NULL					},
+	{ "mtime",				r_mtime,			NULL					},
+	{ "notes",				r_notes,			r_set_notes				},
+	{ "no_cache",			r_no_cache,			r_set_no_cache			},
+	{ "no_local_copy",		r_no_local_copy,	r_set_no_local_copy		},
+	{ "parsed_uri",			r_parsed_uri,		r_set_parsed_uri		},
+	{ "path_info",			r_path_info,		r_set_path_info			},
+	{ "protocol",			r_protocol,			r_set_protocol			},
+	{ "proto_num",			r_proto_num,		r_set_proto_num			},
+	{ "proxyreq",			r_proxyreq,			r_set_proxyreq			},
+	{ "range",				r_range,			NULL					},
+	{ "read_body",			r_read_body,		NULL					},
+	{ "read_chunked",		r_read_chunked,		NULL					},
+	{ "read_length",		r_read_length,		NULL					},
+	{ "remaining",			r_remaining,		NULL					},
+	{ "request_time",		r_request_time,		NULL					},
+	{ "sent_bodyct",		r_sent_bodyct,		NULL					},
+	{ "status",				r_status,			NULL					},
+	{ "status_line",		r_status_line,		NULL					},
+	{ "subprocess_env",		r_subprocess_env,	r_set_subprocess_env	},
+	{ "the_request",		r_the_request,		r_set_the_request		},
+	{ "unparsed_uri",		r_unparsed_uri,		r_set_unparsed_uri		},
+	{ "uri",				r_uri,				r_set_uri				},
+	{ "user",				r_user,				r_set_user				},
+	{ "vlist_validator",	r_vlist_validator,	r_set_vlist_validator	},
+	{ NULL,					NULL,				NULL					}
+};
+
+r_table r_connection_tbl[] = {
+	{ "remote_ip",			r_connection_remote_ip,			NULL					},
+	{ "remote_host",		r_connection_remote_host,		NULL					},
+	{ "remote_logname",		r_connection_remote_logname,	NULL					},
+	{ "aborted",			r_connection_aborted,			NULL					},
+	{ "keepalive",			r_connection_keepalive,			NULL					},
+	{ "keptalive",			r_connection_keptalive,			NULL					},
+	{ "doublereverse",		r_connection_double_reverse,	NULL					},
+	{ "keepalives",			r_connection_keepalives,		NULL					},
+	{ "local_ip",			r_connection_local_ip,			NULL					},
+	{ "local_host",			r_connection_local_host,		NULL					},
+	{ "id",					r_connection_id,				NULL					},
+	{ "notes",				r_connection_notes,				r_set_connection_notes	},
+	{ "remain",				r_connection_remain,			NULL					},
+	{ NULL,					NULL,							NULL					}
+};
+
+r_table r_server_tbl[] = {
+	{ "defn_name",				r_server_defn_name,				NULL	},
+	{ "defn_line_number",		r_server_defn_line_number,		NULL	},
+	{ "server_admin",			r_server_server_admin,			NULL	},
+	{ "server_hostname",		r_server_server_hostname,		NULL	},
+	{ "port",					r_server_port,					NULL	},
+	{ "error_fname",			r_server_error_fname,			NULL	},
+	{ "loglevel",				r_server_loglevel,				NULL	},
+	{ "is_virtual",				r_server_is_virtual,			NULL	},
+	{ "addrs",					r_server_addrs,					NULL	},
+	{ "timeout",				r_server_timeout,				NULL	},
+	{ "keep_alive_timeout",		r_server_keep_alive_timeout,	NULL	},
+	{ "keep_alive_max",			r_server_keep_alive_max,		NULL	},
+	{ "keep_alive",				r_server_keep_alive,			NULL	},
+	{ "path",					r_server_path,					NULL	},
+	{ "names",					r_server_names,					NULL	},
+	{ "wild_names",				r_server_wild_names,			NULL	},
+	{ "limit_req_line",			r_server_limit_req_line,		NULL	},
+	{ "limit_req_fieldsize",	r_server_limit_req_fieldsize,	NULL	},
+	{ "limit_req_fields",		r_server_limit_req_fields,		NULL	},
+	{ NULL,						NULL,							NULL	}
+};
+
 int cmd_r(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
 {
-	if (objc != 2) {
+	char *xx = NULL, *yy = NULL;
+	r_table *r_table_ptr, key;
+	
+	switch (objc) {
+	  case 3: yy = Tcl_GetString(objv[2]);
+	  case 2: xx = Tcl_GetString(objv[1]);	break;
+	  default:
 		Tcl_WrongNumArgs(interp, 1, objv, "variable");
 		return TCL_ERROR;
 	}
 
-	if (!strcmp("method_number", Tcl_GetString(objv[1]))) {
-		Tcl_SetObjResult(ixx, Tcl_NewIntObj(_r->method_number));
+	if (!sorted) {
+		for (; r_tbl[r_size].var != NULL; r_size++);
+		for (; r_connection_tbl[connection_size].var != NULL; connection_size++);
+		for (; r_server_tbl[server_size].var != NULL; server_size++);
+		
+		qsort(r_tbl, r_size, sizeof(r_table), r_find);
+		qsort(r_connection_tbl, connection_size, sizeof(r_table), r_find);
+		qsort(r_server_tbl, server_size, sizeof(r_table), r_find);
+		
+		sorted = 1;
 	}
-	else if (!strcmp("uri", Tcl_GetString(objv[1]))) {
-		Tcl_SetObjResult(ixx, Tcl_NewStringObj(_r->uri, -1));
+	
+	if (!strcmp(xx, "server")) {
+		if (!yy) {
+			Tcl_WrongNumArgs(interp, 2, objv, "variable");
+			return TCL_ERROR;
+		}
+		
+		key.var = yy;
+		r_table_ptr = (r_table*) bsearch(&key, r_server_tbl, server_size, sizeof(r_table), r_find);
 	}
-	else if (!strcmp("headers_in", Tcl_GetString(objv[1]))) {
-		apr_table_do(set_headers_in, ixx, _r->headers_in, NULL);
-		run_script(ixx, "array names headers_in");
-	}	
+	else if (!strcmp(xx, "connection")) {
+		if (!yy) {
+			Tcl_WrongNumArgs(interp, 2, objv, "variable");
+			return TCL_ERROR;
+		}
+		
+		key.var = yy;
+		r_table_ptr = (r_table*) bsearch(&key, r_connection_tbl, connection_size, sizeof(r_table), r_find);
+	}
+	else {
+		key.var = xx;
+		r_table_ptr = (r_table*) bsearch(&key, r_tbl, r_size, sizeof(r_table), r_find);
+	}
+	
+	if (!r_table_ptr) {
+		char *p;
+		
+		asprintf(&p, "%s is not known in structure.", xx);
+		Tcl_AddObjErrorInfo(interp, p, -1);
+		
+		free(p);
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_SetObjResult(interp, r_table_ptr->rd_func());
 	
 	return TCL_OK;
 }
 
 int cmd_r_set(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
 {
-	if (objc < 3) {
-		Tcl_WrongNumArgs(interp, 1, objv, "variable ?variables?");
+	char *xx, *yy;
+	r_table *r_table_ptr, key;
+	
+	switch (objc) {
+	  default:
+	  case 3: yy = Tcl_GetString(objv[2]);
+	  case 2: xx = Tcl_GetString(objv[1]);	break;
+	  case 1:
+		Tcl_WrongNumArgs(interp, 1, objv, "variable");
 		return TCL_ERROR;
 	}
 	
-	if (!strcmp("content_type", Tcl_GetString(objv[1]))) {
-		_r->content_type = Tcl_GetString(objv[2]);
+	if (!sorted) {
+		for (; r_tbl[r_size].var != NULL; r_size++);
+		for (; r_connection_tbl[connection_size].var != NULL; connection_size++);
+		for (; r_server_tbl[server_size].var != NULL; server_size++);
+		
+		qsort(r_tbl, r_size, sizeof(r_table), r_find);
+		qsort(r_connection_tbl, connection_size, sizeof(r_table), r_find);
+		qsort(r_server_tbl, server_size, sizeof(r_table), r_find);
+		
+		sorted = 1;
 	}
-	else if (!strcmp("headers_out", Tcl_GetString(objv[1]))) {
-		if (objc != 4) {
+	
+	if (!strcmp(xx, "server")) {
+		if (!yy) {
+			Tcl_WrongNumArgs(interp, 2, objv, "variable ?variables?");
 			return TCL_ERROR;
 		}
 		
-		apr_table_set(_r->headers_out, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
+		key.var = yy;
+		r_table_ptr = (r_table*) bsearch(&key, r_server_tbl, server_size, sizeof(r_table), r_find);
+	}
+	else if (!strcmp(xx, "connection")) {
+		if (!yy) {
+			Tcl_WrongNumArgs(interp, 2, objv, "variable ?variables?");
+			return TCL_ERROR;
+		}
+		
+		key.var = yy;
+		r_table_ptr = (r_table*) bsearch(&key, r_connection_tbl, connection_size, sizeof(r_table), r_find);
+	}
+	else {
+		key.var = xx;
+		r_table_ptr = (r_table*) bsearch(&key, r_tbl, r_size, sizeof(r_table), r_find);
 	}
 	
-	return TCL_OK;
+	if (!r_table_ptr) {
+		char *p;
+		
+		asprintf(&p, "%s is not known in structure.", xx);
+		Tcl_AddObjErrorInfo(interp, p, -1);
+		
+		free(p);
+		
+		return TCL_ERROR;
+	}
+	
+	if (r_table_ptr->wr_func) {
+		return r_table_ptr->wr_func(objc, objv);
+	}
+	else {
+		Tcl_AddObjErrorInfo(interp, "this variable is not writable", -1);
+		return TCL_ERROR;
+	}
 }
 
 int cmd_read_post(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
 {
-	if (read_post_init(_r, ixx) != OK) {
+	if (read_post_init(_r, interp) != OK) {
 		ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, _r->server, "cmd_read_post(...): read failed");
-		Tcl_AddErrorInfo(ixx, "read failed");
+		Tcl_AddErrorInfo(interp, "read failed");
 		
 		return TCL_ERROR;
 	}
@@ -610,56 +1501,15 @@
 	return TCL_OK;
 }
 
-int cmd_ap_get_server_version(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
-{
-	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_server_version(), -1));
-	
-	return TCL_OK;
-}
-
-int cmd_ap_create_environment(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
-{
-	char **env;
-	int i;
-	
-	ap_add_cgi_vars(_r);
-	ap_add_common_vars(_r);
-	
-	env = ap_create_environment(_r->pool, _r->subprocess_env);
-	
-	for (i = 0; env[i]; i++) {
-		char *sptr = strchr(env[i], '=');
-		
-		*sptr = '\0';
-		set_var(ixx, "::env", env[i], sptr + 1);
-		*sptr = '=';
-	}
-	
-	return TCL_OK;
-}
-
 int cmd_abort(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
 {
 	if (objc == 2) {
-		Tcl_AddObjErrorInfo(ixx, Tcl_GetString(objv[1]), -1);
+		Tcl_AddObjErrorInfo(interp, Tcl_GetString(objv[1]), -1);
 	}
 	
 	return TCL_ERROR;
 }
 
-int cmd_ap_internal_redirect(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
-{
-	if (objc != 2) {
-		Tcl_WrongNumArgs(interp, 1, objv, "uri");
-		
-		return TCL_ERROR;
-	}
-	
-	ap_internal_redirect(Tcl_GetString(objv[1]), _r);
-	
-	return TCL_OK;
-}
-
 int cmd_random(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
 {
 	Tcl_SetObjResult(interp, Tcl_NewLongObj(random()));
@@ -728,6 +1578,8 @@
 	return TCL_OK;
 }
 
+/* http_core.h */
+
 int cmd_ap_allow_options(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
 {
 	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_allow_options(_r)));
@@ -895,3 +1747,490 @@
 	
 	return TCL_OK;
 }
+
+/* http_log.h */
+
+int cmd_ap_log_error(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int i, j;
+	
+	if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 1, objv, "level status string");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &i);
+	Tcl_GetIntFromObj(interp, objv[2], &j);
+	
+	ap_log_error(APLOG_MARK, i, j, _r->server, Tcl_GetString(objv[3]));
+	
+	return TCL_OK;
+}
+
+/* http_protocol.h */
+
+int cmd_ap_send_http_header(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_Obj *obj;
+	
+	obj = Tcl_GetVar2Ex(ixx, "content_type", NULL, 0);
+	
+	if (obj) {
+		_r->content_type = Tcl_GetString(obj);
+	}
+	
+	ap_send_http_header(_r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_send_http_trace(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_send_http_trace(_r)));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_send_http_options(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_send_http_options(_r)));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_finalize_request_protocol(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	ap_finalize_request_protocol(_r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_send_error_response(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int recursive_error;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "recursive_error");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &recursive_error);
+	
+	ap_send_error_response(_r, recursive_error);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_set_content_length(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	apr_off_t length;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "length");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], (int*) &length);
+	
+	ap_set_content_length(_r, length);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_set_keepalive(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_set_keepalive(_r)));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_rationalize_mtime(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	apr_time_t mtime;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "mtime");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], (int*) &mtime);
+	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_rationalize_mtime(_r, mtime)));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_make_etag(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int i;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "force_weak");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &i);
+	
+	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_make_etag(_r, i), -1));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_set_etag(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	ap_set_etag(_r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_set_last_modified(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	ap_set_last_modified(_r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_meets_conditions(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_meets_conditions(_r)));
+	
+	return TCL_OK;
+}
+
+/* ... skipping method stuff ... */
+
+int cmd_rputs(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	char *opt = NULL, *data;
+	
+	switch (objc) {
+	  case 3:
+		opt = Tcl_GetString(objv[1]);
+		data = Tcl_GetString(objv[2]);
+		break;
+	  case 2:
+		data = Tcl_GetString(objv[1]);
+		break;
+	  default:
+		Tcl_WrongNumArgs(interp, 1, objv, "?-nonewline? string");
+		return TCL_ERROR;
+	}
+	
+	if (opt && strcmp(opt, "-nonewline")) {
+		Tcl_WrongNumArgs(interp, 1, objv, "?-nonewline? string");
+		return TCL_ERROR;
+	}
+	
+	ap_rprintf(_r, "%s%s", data, opt ? "" : "\n");
+	
+	return TCL_OK;
+}
+
+int cmd_rwrite(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	char *data = NULL;
+	int length;
+	
+	switch (objc) {
+	  case 2:
+		data = (char*) Tcl_GetByteArrayFromObj(objv[1], &length);
+		break;
+	  default:
+		Tcl_WrongNumArgs(interp, 1, objv, "data");
+		return TCL_ERROR;
+	}
+	
+	ap_rwrite(data, length, _r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_rflush(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	ap_rflush(_r);
+	
+	return TCL_OK;
+}
+
+/* skip ap_index_of_response() */
+
+int cmd_ap_get_status_line(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int status;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "status");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &status);
+	
+	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_status_line(status), -1));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_setup_client_block(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int read_policy;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "read_policy");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &read_policy);
+	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_setup_client_block(_r, read_policy)));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_get_client_block(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int bufsiz;
+	char *buffer;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "bufsiz");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &bufsiz);
+	
+	buffer = malloc(bufsiz);
+	
+	bufsiz = ap_get_client_block(_r, buffer, bufsiz);
+	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(bufsiz));
+	
+	if (bufsiz > 0) {
+		Tcl_SetVar2Ex(interp, "R", NULL, Tcl_NewByteArrayObj(buffer, bufsiz), TCL_LEAVE_ERR_MSG);
+	}
+	
+	return TCL_OK;
+}
+
+int cmd_ap_discard_request_body(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_discard_request_body(_r)));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_note_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	ap_note_auth_failure(_r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_note_basic_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	ap_note_basic_auth_failure(_r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_note_digest_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{	
+	ap_note_digest_auth_failure(_r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_get_basic_auth_pw(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	const char *pw;
+	int xx;
+	
+	xx = ap_get_basic_auth_pw(_r, &pw);
+	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(xx));
+
+	if (xx != 0) {
+		Tcl_SetVar2Ex(interp, "R", NULL, Tcl_NewStringObj(pw, -1), TCL_LEAVE_ERR_MSG);
+	}
+	
+	return TCL_OK;
+}
+
+/* skip ap_set_sub_req_protocol() and ap_finalize_sub_req_protocol() */
+
+int cmd_ap_parse_uri(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "uri");
+		
+		return TCL_ERROR;
+	}
+	
+	ap_parse_uri(_r, Tcl_GetString(objv[1]));
+	
+	return TCL_OK;
+}
+
+/* skip ap_getline(), not sure what it does yet */
+
+int cmd_ap_method_number_of(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "method");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_method_number_of(Tcl_GetString(objv[1]))));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_method_name_of(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int methnum;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "method");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &methnum);
+	
+	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_method_name_of(methnum), -1));
+	
+	return TCL_OK;
+}
+
+/* http_request.h */
+ 
+/* skip sub requests ... */
+
+int cmd_ap_internal_redirect(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "uri");
+		
+		return TCL_ERROR;
+	}
+	
+	ap_internal_redirect(Tcl_GetString(objv[1]), _r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_internal_redirect_handler(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "uri");
+		
+		return TCL_ERROR;
+	}
+	
+	ap_internal_redirect_handler(Tcl_GetString(objv[1]), _r);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_some_auth_required(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_some_auth_required(_r)));
+	
+	return TCL_OK;
+}
+
+/* skip ap_is_initial_req() */
+
+int cmd_ap_update_mtime(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int dependency_mtime;
+	
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "dependency_mtime");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &dependency_mtime);
+	
+	ap_update_mtime(_r, dependency_mtime);
+	
+	return TCL_OK;
+}
+
+int cmd_ap_allow_methods(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	int reset;
+	
+	if (objc != 3) {
+		Tcl_WrongNumArgs(interp, 1, objv, "reset methods");
+		
+		return TCL_ERROR;
+	}
+	
+	Tcl_GetIntFromObj(interp, objv[1], &reset);
+	
+	ap_allow_methods(_r, reset, Tcl_GetString(objv[2]));
+	
+	return TCL_OK;
+}
+
+/* httpd.h */
+
+int cmd_ap_get_server_version(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_server_version(), -1));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_add_version_component(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 1, objv, "component");
+		
+		return TCL_ERROR;
+	}
+	
+	ap_add_version_component(_pconf, Tcl_GetString(objv[1]));
+	
+	return TCL_OK;
+}
+
+int cmd_ap_get_server_built(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_server_built(), -1));
+	
+	return TCL_OK;
+}
+
+/* util_script.h */
+
+int cmd_ap_create_environment(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
+{
+	char **env;
+	int i;
+	
+	ap_add_cgi_vars(_r);
+	ap_add_common_vars(_r);
+	
+	env = ap_create_environment(_r->pool, _r->subprocess_env);
+	
+	for (i = 0; env[i]; i++) {
+		char *sptr = strchr(env[i], '=');
+		
+		*sptr = '\0';
+		set_var(ixx, "::env", env[i], sptr + 1);
+		*sptr = '=';
+	}
+	
+	return TCL_OK;
+}
diff --git a/tcl_core.c b/tcl_core.c
index e9575e3..03d509a 100644
--- a/tcl_core.c
+++ b/tcl_core.c
@@ -74,14 +74,18 @@
 /* 8  */ static int tcl_fixups(request_rec *r);
 /* 9  */ static int tcl_log_transaction(request_rec *r);
 
+/* 10 */ static int tcl_http_method(const request_rec *r);
+
 static const char* add_hand(cmd_parms *parms, void *mconfig, const char *arg);
 static const char* sfl(cmd_parms *parms, void *mconfig, int flag);
 static const char* tcl_set(cmd_parms *parms, void *mconfig, const char *one, const char *two, const char *three);
 static const char* tcl_setlist(cmd_parms *parms, void *mconfig, const char *one, const char *two);
+static const char* tcl_raw_args(cmd_parms *parms, void *mconfig, char *arg);
+static const char *tcl_no_args(cmd_parms *parms, void *mconfig);
 
 typedef const char* (*fz_t)(void);
 
-#define NUM_HANDLERS 10
+#define NUM_HANDLERS 11
 
 static const command_rec tcl_commands[] = {
 	AP_INIT_FLAG(		"Tcl",							(fz_t) sfl,				(void*) 1,	OR_AUTHCFG,		"turn mod_tcl on or off." ),
@@ -97,6 +101,9 @@
 	AP_INIT_TAKE1(		"Tcl_Hook_Type_Checker",		(fz_t) add_hand,		(void*) 7,	OR_AUTHCFG,		"add type_checker handlers." ),
 	AP_INIT_TAKE1(		"Tcl_Hook_Fixups",				(fz_t) add_hand,		(void*) 8,	OR_AUTHCFG,		"add fixups handlers." ),
 	AP_INIT_TAKE1(		"Tcl_Hook_Log_Transaction",		(fz_t) add_hand,		(void*) 9,	OR_AUTHCFG,		"add log_transaction handlers." ),
+	AP_INIT_TAKE1(		"Tcl_Hook_HTTP_Method",			(fz_t) add_hand,		(void*) 10,	OR_AUTHCFG,		"add http_method handlers." ),
+	AP_INIT_RAW_ARGS(	"<Tcl>",						(fz_t) tcl_raw_args,	NULL,		OR_AUTHCFG,		"add raw tcl to the interpreter." ),
+	AP_INIT_NO_ARGS(	"</Tcl>",						(fz_t) tcl_no_args,		NULL,		OR_AUTHCFG,		"end of tcl section." ),
 	{ NULL }
 };
 
@@ -120,6 +127,10 @@
 	ap_hook_fixups(tcl_fixups, NULL, NULL, AP_HOOK_MIDDLE);
 	ap_hook_log_transaction(tcl_log_transaction, NULL, NULL, AP_HOOK_MIDDLE);
 */
+
+/*
+	ap_hook_http_method(tcl_http_method, NULL, NULL, AP_HOOK_MIDDLE);
+*/
 }
 
 AP_DECLARE_DATA module tcl_module = {
@@ -142,6 +153,7 @@
 	int					fl;
 	char				*handlers[NUM_HANDLERS];
 	apr_array_header_t	*var_list;
+	apr_array_header_t	*raw_list;
 } tcl_config_rec;
 
 static void* tcl_create_dir_config(apr_pool_t *p, char *d)
@@ -151,10 +163,9 @@
 	
 	tclr->fl		= 0;
 	tclr->var_list	= apr_make_array(p, 0, sizeof(var_cache));
+	tclr->raw_list	= apr_make_array(p, 0, sizeof(char*));
 	
-	for (i = 0; i < NUM_HANDLERS; i++) {
-		tclr->handlers[i] = NULL;
-	}
+	memset(tclr->handlers, 0, NUM_HANDLERS * sizeof(char*));
 	
 	return tclr;
 }
@@ -221,6 +232,53 @@
 	return NULL;
 }
 
+static const char *tcl_raw_args(cmd_parms *parms, void *mconfig, char *arg)
+{
+	tcl_config_rec *tclr = (tcl_config_rec*) mconfig;
+	char l[MAX_STRING_LEN];
+	char **line, *script, **xx;
+	int i, j = 0, k = 0;
+	apr_array_header_t *temp = apr_make_array(parms->pool, 0, sizeof(char*));
+	char **temp_elts = (char**) temp->elts;
+
+	while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) {
+		if (!strncasecmp(l, "</Tcl>", 6)) {
+			goto cleanup;
+		}
+
+		line = (char**) apr_push_array(temp);
+		j += asprintf(line, l);
+		k++;
+	}
+	
+  cleanup:
+  
+	script = (char*) malloc(j + k + 1);
+	j = 0;
+	
+	for (i = 0; i < temp->nelts; i++) {
+		memcpy(&(script[j]), temp_elts[i], j += strlen(temp_elts[i]));
+		script[j] = '\n';
+		j++;
+		
+		free(temp_elts[i]);
+	}
+	
+	script[j] = '\0';
+	
+	xx = (char**) apr_push_array(tclr->raw_list);
+	*xx = apr_pstrdup(parms->pool, script);
+	
+	free(script);
+
+	return NULL;
+}
+
+static const char *tcl_no_args(cmd_parms *parms, void *dummy)
+{
+	return NULL;
+}
+
 void run_script(Tcl_Interp* interp, char *fmt, ...)
 {
 	char *bptr = NULL;
@@ -240,7 +298,7 @@
 	free(bptr);
 }
 
-void set_var(Tcl_Interp* interp, const char *var1, const char *var2, const char *fmt, ...)
+void set_var(Tcl_Interp* interp, char *var1, char *var2, const char *fmt, ...)
 {
 	char *bptr;
 	va_list va;
@@ -252,20 +310,27 @@
 	
 	obj = Tcl_NewStringObj(bptr, -1);
 	
-	if (Tcl_SetVar2Ex(interp, (char*) var1, (char*) var2, obj, TCL_LEAVE_ERR_MSG) == NULL) {
+	if (Tcl_SetVar2Ex(interp, var1, var2, obj, TCL_LEAVE_ERR_MSG) == NULL) {
 		ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, NULL, "Tcl_SetVarEx2(%s, %s, %s): %s", var1, var2 ? var2 : "NULL", bptr, Tcl_GetStringResult(interp));
 	}
 	
 	free(bptr);
 }
 
-void set_var2(Tcl_Interp* interp, const char *var1, const char *var2, const char *data, int len)
+void set_vari(Tcl_Interp* interp, char *var1, char *var2, int var)
+{	
+	if (Tcl_SetVar2Ex(interp, var1, var2, Tcl_NewIntObj(var), TCL_LEAVE_ERR_MSG) == NULL) {
+		ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, NULL, "Tcl_SetVarEx2(%s, %s, %d): %s", var1, var2 ? var2 : "NULL", var, Tcl_GetStringResult(interp));
+	}
+}
+
+void set_varb(Tcl_Interp* interp, char *var1, char *var2, char *data, int len)
 {
 	Tcl_Obj *obj;
 	
-	obj = Tcl_NewByteArrayObj((unsigned char*) data, len);
+	obj = Tcl_NewByteArrayObj(data, len);
 	
-	if (Tcl_SetVar2Ex(interp, (char*) var1, (char*) var2, obj, TCL_LEAVE_ERR_MSG) == NULL) {
+	if (Tcl_SetVar2Ex(interp, var1, var2, obj, TCL_LEAVE_ERR_MSG) == NULL) {
 		ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, NULL, "Tcl_SetVarEx2(%s, %s, %s): %s", var1, var2 ? var2 : "NULL", "*data*", Tcl_GetStringResult(interp));
 	}
 }
@@ -277,12 +342,14 @@
 
 Tcl_Interp			*interp = NULL;
 apr_array_header_t	*fcache = NULL;
+apr_pool_t			*_pconf = NULL;
 request_rec			*_r = NULL;
 char				*current_namespace = NULL;
 int					read_post_ok;
 
 static void tcl_init(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
 {
+	_pconf = pconf;
 	fcache = apr_make_array(pconf, 0, sizeof(file_cache));
 	
 	interp = Tcl_CreateInterp();
@@ -294,80 +361,116 @@
 	
 	apr_register_cleanup(pconf, NULL, tcl_cleanup, apr_null_cleanup);
 
-	set_var(interp, "BAD_REQUEST", NULL, "%d", HTTP_BAD_REQUEST);
-	set_var(interp, "DECLINED", NULL, "%d", DECLINED);
-	set_var(interp, "DONE", NULL, "%d", DONE);
-	set_var(interp, "NOT_FOUND", NULL, "%d", HTTP_NOT_FOUND);
-	set_var(interp, "OK", NULL, "%d", OK);
-	set_var(interp, "REDIRECT", NULL, "%d", HTTP_MOVED_TEMPORARILY);
-	set_var(interp, "SERVER_ERROR", NULL, "%d", HTTP_INTERNAL_SERVER_ERROR);
+	set_vari(interp, "DECLINED", NULL, DECLINED);
+	set_vari(interp, "DONE", NULL, DONE);
+	set_vari(interp, "OK", NULL, OK);
 	
-	set_var(interp, "M_POST", NULL, "%d", M_POST);
-	set_var(interp, "M_GET", NULL, "%d", M_GET);
-	set_var(interp, "M_PUT", NULL, "%d", M_PUT);
-	set_var(interp, "M_DELETE", NULL, "%d", M_DELETE);
-	set_var(interp, "M_CONNECT", NULL, "%d", M_CONNECT);
-	set_var(interp, "M_OPTIONS", NULL, "%d", M_OPTIONS);
-	set_var(interp, "M_TRACE", NULL, "%d", M_TRACE);
-	set_var(interp, "M_PATCH", NULL, "%d", M_PATCH);
-	set_var(interp, "M_PROPFIND", NULL, "%d", M_PROPFIND);
-	set_var(interp, "M_PROPPATCH", NULL, "%d", M_PROPPATCH);
-	set_var(interp, "M_MKCOL", NULL, "%d", M_MKCOL);
-	set_var(interp, "M_COPY", NULL, "%d", M_COPY);
-	set_var(interp, "M_MOVE", NULL, "%d", M_MOVE);
-	set_var(interp, "M_LOCK", NULL, "%d", M_LOCK);
-	set_var(interp, "M_UNLOCK", NULL, "%d", M_UNLOCK);
-	set_var(interp, "M_INVALID", NULL, "%d", M_INVALID);
+	/* legacy */
+	set_vari(interp, "BAD_REQUEST", NULL, HTTP_BAD_REQUEST);
+	set_vari(interp, "REDIRECT", NULL, HTTP_MOVED_TEMPORARILY);
+	set_vari(interp, "SERVER_ERROR", NULL, HTTP_INTERNAL_SERVER_ERROR);
+	set_vari(interp, "NOT_FOUND", NULL, HTTP_NOT_FOUND);
 	
-	set_var(interp, "HTTP_OK", NULL, "%d", HTTP_OK);
-	set_var(interp, "HTTP_CREATED", NULL, "%d", HTTP_CREATED);
-	set_var(interp, "HTTP_ACCEPTED", NULL, "%d", HTTP_ACCEPTED);
-	set_var(interp, "HTTP_NON_AUTHORITATIVE", NULL, "%d", HTTP_NON_AUTHORITATIVE);
-	set_var(interp, "HTTP_NO_CONTENT", NULL, "%d", HTTP_NO_CONTENT);
-	set_var(interp, "HTTP_PARTIAL_CONTENT", NULL, "%d", HTTP_PARTIAL_CONTENT);
-	set_var(interp, "HTTP_MULTIPLE_CHOICES", NULL, "%d", HTTP_MULTIPLE_CHOICES);
-	set_var(interp, "HTTP_MOVED_PERMANENTLY", NULL, "%d", HTTP_MOVED_PERMANENTLY);
-	set_var(interp, "HTTP_MOVED_TEMPORARILY", NULL, "%d", HTTP_MOVED_TEMPORARILY);
-	set_var(interp, "HTTP_NOT_MODIFIED", NULL, "%d", HTTP_NOT_MODIFIED);
-	set_var(interp, "HTTP_BAD_REQUEST", NULL, "%d", HTTP_BAD_REQUEST);
-	set_var(interp, "HTTP_UNAUTHORIZED", NULL, "%d", HTTP_UNAUTHORIZED);
-	set_var(interp, "HTTP_PAYMENT_REQUIRED", NULL, "%d", HTTP_PAYMENT_REQUIRED);
-	set_var(interp, "HTTP_FORBIDDEN", NULL, "%d", HTTP_FORBIDDEN);
-	set_var(interp, "HTTP_NOT_FOUND", NULL, "%d", HTTP_NOT_FOUND);
-	set_var(interp, "HTTP_METHOD_NOT_ALLOWED", NULL, "%d", HTTP_METHOD_NOT_ALLOWED);
-	set_var(interp, "HTTP_NOT_ACCEPTABLE", NULL, "%d", HTTP_NOT_ACCEPTABLE);
-	set_var(interp, "HTTP_PROXY_AUTHENTICATION_REQUIRED", NULL, "%d", HTTP_PROXY_AUTHENTICATION_REQUIRED);
-	set_var(interp, "HTTP_REQUEST_TIME_OUT", NULL, "%d", HTTP_REQUEST_TIME_OUT);
-	set_var(interp, "HTTP_GONE", NULL, "%d", HTTP_GONE);
-	set_var(interp, "HTTP_PRECONDITION_FAILED", NULL, "%d", HTTP_PRECONDITION_FAILED);
-	set_var(interp, "HTTP_REQUEST_ENTITY_TOO_LARGE", NULL, "%d", HTTP_REQUEST_ENTITY_TOO_LARGE);
-	set_var(interp, "HTTP_REQUEST_URI_TOO_LARGE", NULL, "%d", HTTP_REQUEST_URI_TOO_LARGE);
-	set_var(interp, "HTTP_UNSUPPORTED_MEDIA_TYPE", NULL, "%d", HTTP_UNSUPPORTED_MEDIA_TYPE);
-	set_var(interp, "HTTP_INTERNAL_SERVER_ERROR", NULL, "%d", HTTP_INTERNAL_SERVER_ERROR);
-	set_var(interp, "HTTP_NOT_IMPLEMENTED", NULL, "%d", HTTP_NOT_IMPLEMENTED);
-	set_var(interp, "HTTP_BAD_GATEWAY", NULL, "%d", HTTP_BAD_GATEWAY);
-	set_var(interp, "HTTP_SERVICE_UNAVAILABLE", NULL, "%d", HTTP_SERVICE_UNAVAILABLE);
-	set_var(interp, "HTTP_GATEWAY_TIME_OUT", NULL, "%d", HTTP_GATEWAY_TIME_OUT);
-	set_var(interp, "HTTP_VERSION_NOT_SUPPORTED", NULL, "%d", HTTP_VERSION_NOT_SUPPORTED);
-	set_var(interp, "HTTP_VARIANT_ALSO_VARIES", NULL, "%d", HTTP_VARIANT_ALSO_VARIES);
+	set_vari(interp, "M_POST", NULL, M_POST);
+	set_vari(interp, "M_GET", NULL, M_GET);
+	set_vari(interp, "M_PUT", NULL, M_PUT);
+	set_vari(interp, "M_DELETE", NULL, M_DELETE);
+	set_vari(interp, "M_CONNECT", NULL, M_CONNECT);
+	set_vari(interp, "M_OPTIONS", NULL, M_OPTIONS);
+	set_vari(interp, "M_TRACE", NULL, M_TRACE);
+	set_vari(interp, "M_PATCH", NULL, M_PATCH);
+	set_vari(interp, "M_PROPFIND", NULL, M_PROPFIND);
+	set_vari(interp, "M_PROPPATCH", NULL, M_PROPPATCH);
+	set_vari(interp, "M_MKCOL", NULL, M_MKCOL);
+	set_vari(interp, "M_COPY", NULL, M_COPY);
+	set_vari(interp, "M_MOVE", NULL, M_MOVE);
+	set_vari(interp, "M_LOCK", NULL, M_LOCK);
+	set_vari(interp, "M_UNLOCK", NULL, M_UNLOCK);
+	set_vari(interp, "M_INVALID", NULL, M_INVALID);
 	
-	set_var(interp, "REMOTE_HOST", NULL, "%d", REMOTE_HOST);
-	set_var(interp, "REMOTE_NAME", NULL, "%d", REMOTE_NAME);
-	set_var(interp, "REMOTE_NOLOOKUP", NULL, "%d", REMOTE_NOLOOKUP);
-	set_var(interp, "REMOTE_DOUBLE_REV", NULL, "%d", REMOTE_DOUBLE_REV);
+	set_vari(interp, "HTTP_CONTINUE", NULL, HTTP_CONTINUE);
+	set_vari(interp, "HTTP_SWITCHING_PROTOCOLS", NULL, HTTP_SWITCHING_PROTOCOLS);
+	set_vari(interp, "HTTP_PROCESSING", NULL, HTTP_PROCESSING);
+	set_vari(interp, "HTTP_OK", NULL, HTTP_OK);
+	set_vari(interp, "HTTP_CREATED", NULL, HTTP_CREATED);
+	set_vari(interp, "HTTP_ACCEPTED", NULL, HTTP_ACCEPTED);
+	set_vari(interp, "HTTP_NON_AUTHORITATIVE", NULL, HTTP_NON_AUTHORITATIVE);
+	set_vari(interp, "HTTP_NO_CONTENT", NULL, HTTP_NO_CONTENT);
+	set_vari(interp, "HTTP_RESET_CONTENT", NULL, HTTP_RESET_CONTENT);
+	set_vari(interp, "HTTP_PARTIAL_CONTENT", NULL, HTTP_PARTIAL_CONTENT);
+	set_vari(interp, "HTTP_MULTI_STATUS", NULL, HTTP_MULTI_STATUS);
+	set_vari(interp, "HTTP_MULTIPLE_CHOICES", NULL, HTTP_MULTIPLE_CHOICES);
+	set_vari(interp, "HTTP_MOVED_PERMANENTLY", NULL, HTTP_MOVED_PERMANENTLY);
+	set_vari(interp, "HTTP_MOVED_TEMPORARILY", NULL, HTTP_MOVED_TEMPORARILY);
+	set_vari(interp, "HTTP_SEE_OTHER", NULL, HTTP_SEE_OTHER);
+	set_vari(interp, "HTTP_NOT_MODIFIED", NULL, HTTP_NOT_MODIFIED);
+	set_vari(interp, "HTTP_USE_PROXY", NULL, HTTP_USE_PROXY);
+	set_vari(interp, "HTTP_TEMPORARY_REDIRECT", NULL, HTTP_TEMPORARY_REDIRECT);
+	set_vari(interp, "HTTP_BAD_REQUEST", NULL, HTTP_BAD_REQUEST);
+	set_vari(interp, "HTTP_UNAUTHORIZED", NULL, HTTP_UNAUTHORIZED);
+	set_vari(interp, "HTTP_PAYMENT_REQUIRED", NULL, HTTP_PAYMENT_REQUIRED);
+	set_vari(interp, "HTTP_FORBIDDEN", NULL, HTTP_FORBIDDEN);
+	set_vari(interp, "HTTP_NOT_FOUND", NULL, HTTP_NOT_FOUND);
+	set_vari(interp, "HTTP_METHOD_NOT_ALLOWED", NULL, HTTP_METHOD_NOT_ALLOWED);
+	set_vari(interp, "HTTP_NOT_ACCEPTABLE", NULL, HTTP_NOT_ACCEPTABLE);
+	set_vari(interp, "HTTP_PROXY_AUTHENTICATION_REQUIRED", NULL, HTTP_PROXY_AUTHENTICATION_REQUIRED);
+	set_vari(interp, "HTTP_REQUEST_TIME_OUT", NULL, HTTP_REQUEST_TIME_OUT);
+	set_vari(interp, "HTTP_CONFLICT", NULL, HTTP_CONFLICT);
+	set_vari(interp, "HTTP_GONE", NULL, HTTP_GONE);
+	set_vari(interp, "HTTP_LENGTH_REQUIRED", NULL, HTTP_LENGTH_REQUIRED);
+	set_vari(interp, "HTTP_PRECONDITION_FAILED", NULL, HTTP_PRECONDITION_FAILED);
+	set_vari(interp, "HTTP_REQUEST_ENTITY_TOO_LARGE", NULL, HTTP_REQUEST_ENTITY_TOO_LARGE);
+	set_vari(interp, "HTTP_REQUEST_URI_TOO_LARGE", NULL, HTTP_REQUEST_URI_TOO_LARGE);
+	set_vari(interp, "HTTP_UNSUPPORTED_MEDIA_TYPE", NULL, HTTP_UNSUPPORTED_MEDIA_TYPE);
+	set_vari(interp, "HTTP_RANGE_NOT_SATISFIABLE", NULL, HTTP_RANGE_NOT_SATISFIABLE);
+	set_vari(interp, "HTTP_EXPECTATION_FAILED", NULL, HTTP_EXPECTATION_FAILED);
+	set_vari(interp, "HTTP_UNPROCESSABLE_ENTITY", NULL, HTTP_UNPROCESSABLE_ENTITY);
+	set_vari(interp, "HTTP_LOCKED", NULL, HTTP_LOCKED);
+	set_vari(interp, "HTTP_FAILED_DEPENDENCY", NULL, HTTP_FAILED_DEPENDENCY);
+	set_vari(interp, "HTTP_INTERNAL_SERVER_ERROR", NULL, HTTP_INTERNAL_SERVER_ERROR);
+	set_vari(interp, "HTTP_NOT_IMPLEMENTED", NULL, HTTP_NOT_IMPLEMENTED);
+	set_vari(interp, "HTTP_BAD_GATEWAY", NULL, HTTP_BAD_GATEWAY);
+	set_vari(interp, "HTTP_SERVICE_UNAVAILABLE", NULL, HTTP_SERVICE_UNAVAILABLE);
+	set_vari(interp, "HTTP_GATEWAY_TIME_OUT", NULL, HTTP_GATEWAY_TIME_OUT);
+	set_vari(interp, "HTTP_VERSION_NOT_SUPPORTED", NULL, HTTP_VERSION_NOT_SUPPORTED);
+	set_vari(interp, "HTTP_VARIANT_ALSO_VARIES", NULL, HTTP_VARIANT_ALSO_VARIES);
+	set_vari(interp, "HTTP_INSUFFICIENT_STORAGE", NULL, HTTP_INSUFFICIENT_STORAGE);
+	set_vari(interp, "HTTP_NOT_EXTENDED", NULL, HTTP_NOT_EXTENDED);
 	
+	set_vari(interp, "REMOTE_HOST", NULL, REMOTE_HOST);
+	set_vari(interp, "REMOTE_NAME", NULL, REMOTE_NAME);
+	set_vari(interp, "REMOTE_NOLOOKUP", NULL, REMOTE_NOLOOKUP);
+	set_vari(interp, "REMOTE_DOUBLE_REV", NULL, REMOTE_DOUBLE_REV);
+	
+	set_vari(interp, "APLOG_EMERG", NULL, APLOG_EMERG);
+	set_vari(interp, "APLOG_ALERT", NULL, APLOG_ALERT);
+	set_vari(interp, "APLOG_CRIT", NULL, APLOG_CRIT);
+	set_vari(interp, "APLOG_ERR", NULL, APLOG_ERR);
+	set_vari(interp, "APLOG_WARNING", NULL, APLOG_WARNING);
+	set_vari(interp, "APLOG_NOTICE", NULL, APLOG_NOTICE);
+	set_vari(interp, "APLOG_INFO", NULL, APLOG_INFO);
+	set_vari(interp, "APLOG_DEBUG", NULL, APLOG_DEBUG);
+	set_vari(interp, "APLOG_NOERRNO", NULL, APLOG_NOERRNO);
+
+	set_vari(interp, "REQUEST_NO_BODY", NULL, REQUEST_NO_BODY);
+	set_vari(interp, "REQUEST_CHUNKED_ERROR", NULL, REQUEST_CHUNKED_ERROR);
+	set_vari(interp, "REQUEST_CHUNKED_DECHUNK", NULL, REQUEST_CHUNKED_DECHUNK);
+	
+	/* misc util */
+	Tcl_CreateObjCommand(interp, "abort", cmd_abort, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "read_post", cmd_read_post, NULL, NULL);
+	
+	Tcl_CreateObjCommand(interp, "random", cmd_random, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "srandom", cmd_srandom, NULL, NULL);
+	
+	Tcl_CreateObjCommand(interp, "base64_encode", cmd_base64_encode, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "base64_decode", cmd_base64_decode, NULL, NULL);
+	
+	/* read and set stuff from request_rec */
 	Tcl_CreateObjCommand(interp, "r", cmd_r, NULL, NULL);
 	Tcl_CreateObjCommand(interp, "r_set", cmd_r_set, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "rputs", cmd_rputs, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "rwrite", cmd_rwrite, NULL, NULL);
 	
-	/* sort this out later */
-	Tcl_CreateObjCommand(interp, "ap_internal_redirect", cmd_ap_internal_redirect, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "ap_send_http_header", cmd_ap_send_http_header, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "ap_get_server_version", cmd_ap_get_server_version, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "ap_create_environment", cmd_ap_create_environment, NULL, NULL);
-	
-	/* stuff from http_core.h */
+	/* http_core.h */
 	Tcl_CreateObjCommand(interp, "ap_allow_options", cmd_ap_allow_options, NULL, NULL);
 	Tcl_CreateObjCommand(interp, "ap_allow_overrides", cmd_ap_allow_overrides, NULL, NULL);
 	Tcl_CreateObjCommand(interp, "ap_default_type", cmd_ap_default_type, NULL, NULL);
@@ -386,14 +489,56 @@
 	Tcl_CreateObjCommand(interp, "ap_satisfies", cmd_ap_satisfies, NULL, NULL);
 	Tcl_CreateObjCommand(interp, "ap_requires", cmd_ap_requires, NULL, NULL);
 	
-	Tcl_CreateObjCommand(interp, "abort", cmd_abort, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "read_post", cmd_read_post, NULL, NULL);
+	/* http_log.h */
+	Tcl_CreateObjCommand(interp, "ap_log_error", cmd_ap_log_error, NULL, NULL);
 	
-	Tcl_CreateObjCommand(interp, "random", cmd_random, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "srandom", cmd_srandom, NULL, NULL);
+	/* http_protocol.h */
+	Tcl_CreateObjCommand(interp, "ap_send_http_header", cmd_ap_send_http_header, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_send_http_trace", cmd_ap_send_http_trace, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_send_http_options", cmd_ap_send_http_options, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_finalize_request_protocol", cmd_ap_finalize_request_protocol, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_send_error_response", cmd_ap_send_error_response, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_set_content_length", cmd_ap_set_content_length, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_set_keepalive", cmd_ap_set_keepalive, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_rationalize_mtime", cmd_ap_rationalize_mtime, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_make_etag", cmd_ap_make_etag, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_set_etag", cmd_ap_set_etag, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_set_last_modified", cmd_ap_set_last_modified, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_meets_conditions", cmd_ap_meets_conditions, NULL, NULL);
+	/**/
+	Tcl_CreateObjCommand(interp, "rputs", cmd_rputs, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "rwrite", cmd_rwrite, NULL, NULL);
+	/**/
+	Tcl_CreateObjCommand(interp, "ap_rputs", cmd_rputs, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_rwrite", cmd_rwrite, NULL, NULL);
+	/**/
+	Tcl_CreateObjCommand(interp, "ap_rflush", cmd_ap_rflush, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_get_status_line", cmd_ap_get_status_line, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_setup_client_block", cmd_ap_setup_client_block, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_get_client_block", cmd_ap_get_client_block, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_discard_request_body", cmd_ap_discard_request_body, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_note_auth_failure", cmd_ap_note_auth_failure, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_note_basic_auth_failure", cmd_ap_note_basic_auth_failure, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_note_digest_auth_failure", cmd_ap_note_digest_auth_failure, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_get_basic_auth_pw", cmd_ap_get_basic_auth_pw, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_parse_uri", cmd_ap_parse_uri, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_method_number_of", cmd_ap_method_number_of, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_method_name_of", cmd_ap_method_name_of, NULL, NULL);
+
+	/* http_request.h */
+	Tcl_CreateObjCommand(interp, "ap_internal_redirect", cmd_ap_internal_redirect, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_internal_redirect_handler", cmd_ap_internal_redirect_handler, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_some_auth_required", cmd_ap_some_auth_required, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_update_mtime", cmd_ap_update_mtime, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_allow_methods", cmd_ap_allow_methods, NULL, NULL);
+
+	/* httpd.h */
+	Tcl_CreateObjCommand(interp, "ap_get_server_version", cmd_ap_get_server_version, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_add_version_component", cmd_ap_add_version_component, NULL, NULL);
+	Tcl_CreateObjCommand(interp, "ap_get_server_built", cmd_ap_get_server_built, NULL, NULL);
 	
-	Tcl_CreateObjCommand(interp, "base64_encode", cmd_base64_encode, NULL, NULL);
-	Tcl_CreateObjCommand(interp, "base64_decode", cmd_base64_decode, NULL, NULL);
+	/* util_script.h */
+	Tcl_CreateObjCommand(interp, "ap_create_environment", cmd_ap_create_environment, NULL, NULL);
 	
 	// provided
 	{
@@ -425,7 +570,7 @@
 
 static void tcl_init_handler(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
 {
-	ap_add_version_component(pconf, "mod_tcl/1.0d1");
+	ap_add_version_component(pconf, "mod_tcl/1.0d3");
 }
 
 static int run_handler(request_rec *r, int hh)
@@ -435,6 +580,7 @@
 	size_t flen = strlen(r->filename);
 	file_cache *fptr = NULL, *fa = (file_cache*) fcache->elts;
 	var_cache *vl = (var_cache*) tclr->var_list->elts;
+	char **rl = (char**) tclr->raw_list->elts;
 	struct stat st;
 	
 	if (!(tclr->fl & 1) || !interp) {
@@ -510,6 +656,27 @@
 				free(namespc);
 			}
 		}
+		
+		for (i = 0, pos = 0; i < tclr->raw_list->nelts; i++) {
+			int rl_len = strlen(rl[i]);
+			
+			bptr = (char*) malloc(rl_len + flen + 21);
+			
+			memcpy(bptr, "namespace eval ", 15);		pos += 15;
+			memcpy(bptr + pos, r->filename, flen);		pos += flen;
+			memcpy(bptr + pos, " {\n", 3);				pos += 3;
+			memcpy(bptr + pos, rl[i], rl_len);			pos += rl_len;
+			memcpy(bptr + pos, "\n}\0", 3);
+			
+			obj = Tcl_NewStringObj(bptr, -1);
+			
+			free(bptr);
+			
+			if (Tcl_EvalObjEx(interp, obj, 0) == TCL_ERROR) {
+				ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r->server, "Tcl_EvalObjEx(...): %s\n%s", Tcl_GetStringResult(interp), Tcl_GetVar(interp, "errorInfo", 0));
+				return HTTP_INTERNAL_SERVER_ERROR;
+			}
+		}
 	}
 	else if (st.st_mtime > fptr->st.st_mtime) {
 		int fd;
@@ -631,3 +798,8 @@
 	return run_handler(r, 9);
 }
 
+static int tcl_http_method(const request_rec *r)
+{
+	/* this isn't nice at all!!! */
+	return run_handler((request_rec*) r, 10);
+}