diff --git a/Usermode/Libraries/libspiderscript.so_src/ast.c b/Usermode/Libraries/libspiderscript.so_src/ast.c
index 9c26ae6c2d437b3c627da48db0f879fb3d064e07..7d644cdc2df9b0c6123ce6bf2400f5d9c97e1a70 100644
--- a/Usermode/Libraries/libspiderscript.so_src/ast.c
+++ b/Usermode/Libraries/libspiderscript.so_src/ast.c
@@ -65,6 +65,257 @@ void AST_SetFunctionCode(tAST_Function *Function, tAST_Node *Root)
  * \name Node Manipulation
  * \{
  */
+/**
+ * \brief Get the in-memory size of a node
+ */
+size_t AST_GetNodeSize(tAST_Node *Node)
+{
+	size_t	ret;
+	tAST_Node	*node;
+	
+	if(!Node)
+		return 0;
+	
+	ret = sizeof(tAST_Node*) + sizeof(tAST_NodeType)
+		+ sizeof(const char *) + sizeof(int);
+	
+	switch(Node->Type)
+	{
+	// Block of code
+	case NODETYPE_BLOCK:
+		ret += sizeof(Node->Block);
+		for( node = Node->Block.FirstChild; node; )
+		{
+			ret += AST_GetNodeSize(node);
+			node = node->NextSibling;
+		}
+		break;
+	
+	// Function Call
+	case NODETYPE_FUNCTIONCALL:
+		ret += sizeof(Node->FunctionCall) + strlen(Node->FunctionCall.Name) + 1;
+		for( node = Node->FunctionCall.FirstArg; node; )
+		{
+			ret += AST_GetNodeSize(node);
+			node = node->NextSibling;
+		}
+		break;
+	
+	// If node
+	case NODETYPE_IF:
+		ret += sizeof(Node->If);
+		ret += AST_GetNodeSize(Node->If.Condition);
+		ret += AST_GetNodeSize(Node->If.True);
+		ret += AST_GetNodeSize(Node->If.False);
+		break;
+	
+	// Looping Construct (For loop node)
+	case NODETYPE_LOOP:
+		ret += sizeof(Node->For);
+		ret += AST_GetNodeSize(Node->For.Init);
+		ret += AST_GetNodeSize(Node->For.Condition);
+		ret += AST_GetNodeSize(Node->For.Increment);
+		ret += AST_GetNodeSize(Node->For.Code);
+		break;
+	
+	// Asignment
+	case NODETYPE_ASSIGN:
+		ret += sizeof(Node->Assign);
+		ret += AST_GetNodeSize(Node->Assign.Dest);
+		ret += AST_GetNodeSize(Node->Assign.Value);
+		break;
+	
+	// Casting
+	case NODETYPE_CAST:
+		ret += sizeof(Node->Cast);
+		ret += AST_GetNodeSize(Node->Cast.Value);
+		break;
+	
+	// Define a variable
+	case NODETYPE_DEFVAR:
+		ret += sizeof(Node->DefVar) + strlen(Node->DefVar.Name) + 1;
+		for( node = Node->DefVar.LevelSizes; node; )
+		{
+			ret += AST_GetNodeSize(node);
+			node = node->NextSibling;
+		}
+		break;
+	
+	// Unary Operations
+	case NODETYPE_RETURN:
+		ret += sizeof(Node->UniOp);
+		ret += AST_GetNodeSize(Node->UniOp.Value);
+		break;
+	
+	// Binary Operations
+	case NODETYPE_INDEX:
+	case NODETYPE_ADD:
+	case NODETYPE_SUBTRACT:
+	case NODETYPE_MULTIPLY:
+	case NODETYPE_DIVIDE:
+	case NODETYPE_MODULO:
+	case NODETYPE_BITSHIFTLEFT:
+	case NODETYPE_BITSHIFTRIGHT:
+	case NODETYPE_BITROTATELEFT:
+	case NODETYPE_BWAND:	case NODETYPE_LOGICALAND:
+	case NODETYPE_BWOR: 	case NODETYPE_LOGICALOR:
+	case NODETYPE_BWXOR:	case NODETYPE_LOGICALXOR:
+	case NODETYPE_EQUALS:
+	case NODETYPE_LESSTHAN:
+	case NODETYPE_GREATERTHAN:
+		ret += sizeof(Node->BinOp);
+		ret += AST_GetNodeSize( Node->BinOp.Left );
+		ret += AST_GetNodeSize( Node->BinOp.Right );
+		break;
+	
+	// Node types with no children
+	case NODETYPE_NOP:
+		break;
+	case NODETYPE_VARIABLE:
+	case NODETYPE_CONSTANT:
+		ret += sizeof(Node->Variable) + strlen(Node->Variable.Name) + 1;
+		break;
+	case NODETYPE_STRING:
+		ret += sizeof(Node->String) + Node->String.Length;
+		break;
+	case NODETYPE_INTEGER:
+		ret += sizeof(Node->Integer);
+		break;
+	case NODETYPE_REAL:
+		ret += sizeof(Node->Real);
+		break;
+	}
+	return ret;
+}
+
+/**
+ * \brief Write a node to a file
+ */
+void AST_WriteNode(FILE *FP, tAST_Node *Node)
+{
+	tAST_Node	*node;
+	intptr_t	ptr;
+	
+	if(!Node)	return ;
+	
+	ptr = ftell(FP) + AST_GetNodeSize(Node);
+	fwrite(&ptr, sizeof(ptr), 1, FP);
+	fwrite(&Node->Type, sizeof(Node->Type), 1, FP);
+	ptr = 0;	fwrite(&ptr, sizeof(ptr), 1, FP);	// File
+	fwrite(&Node->Line, sizeof(Node->Line), 1, FP);
+	
+	ret = sizeof(tAST_Node*) + sizeof(tAST_NodeType)
+		+ sizeof(const char *) + sizeof(int);
+	
+	switch(Node->Type)
+	{
+	// Block of code
+	case NODETYPE_BLOCK:
+		ret += sizeof(Node->Block);
+		for( node = Node->Block.FirstChild; node; )
+		{
+			ret += AST_GetNodeSize(node);
+			node = node->NextSibling;
+		}
+		break;
+	
+	// Function Call
+	case NODETYPE_FUNCTIONCALL:
+		ret += sizeof(Node->FunctionCall) + strlen(Node->FunctionCall.Name) + 1;
+		for( node = Node->FunctionCall.FirstArg; node; )
+		{
+			ret += AST_GetNodeSize(node);
+			node = node->NextSibling;
+		}
+		break;
+	
+	// If node
+	case NODETYPE_IF:
+		ret += sizeof(Node->If);
+		ret += AST_GetNodeSize(Node->If.Condition);
+		ret += AST_GetNodeSize(Node->If.True);
+		ret += AST_GetNodeSize(Node->If.False);
+		break;
+	
+	// Looping Construct (For loop node)
+	case NODETYPE_LOOP:
+		ret += sizeof(Node->For);
+		ret += AST_GetNodeSize(Node->For.Init);
+		ret += AST_GetNodeSize(Node->For.Condition);
+		ret += AST_GetNodeSize(Node->For.Increment);
+		ret += AST_GetNodeSize(Node->For.Code);
+		break;
+	
+	// Asignment
+	case NODETYPE_ASSIGN:
+		ret += sizeof(Node->Assign);
+		ret += AST_GetNodeSize(Node->Assign.Dest);
+		ret += AST_GetNodeSize(Node->Assign.Value);
+		break;
+	
+	// Casting
+	case NODETYPE_CAST:
+		ret += sizeof(Node->Cast);
+		ret += AST_GetNodeSize(Node->Cast.Value);
+		break;
+	
+	// Define a variable
+	case NODETYPE_DEFVAR:
+		ret += sizeof(Node->DefVar) + strlen(Node->DefVar.Name) + 1;
+		for( node = Node->DefVar.LevelSizes; node; )
+		{
+			ret += AST_GetNodeSize(node);
+			node = node->NextSibling;
+		}
+		break;
+	
+	// Unary Operations
+	case NODETYPE_RETURN:
+		ret += sizeof(Node->UniOp);
+		ret += AST_GetNodeSize(Node->UniOp.Value);
+		break;
+	
+	// Binary Operations
+	case NODETYPE_INDEX:
+	case NODETYPE_ADD:
+	case NODETYPE_SUBTRACT:
+	case NODETYPE_MULTIPLY:
+	case NODETYPE_DIVIDE:
+	case NODETYPE_MODULO:
+	case NODETYPE_BITSHIFTLEFT:
+	case NODETYPE_BITSHIFTRIGHT:
+	case NODETYPE_BITROTATELEFT:
+	case NODETYPE_BWAND:	case NODETYPE_LOGICALAND:
+	case NODETYPE_BWOR: 	case NODETYPE_LOGICALOR:
+	case NODETYPE_BWXOR:	case NODETYPE_LOGICALXOR:
+	case NODETYPE_EQUALS:
+	case NODETYPE_LESSTHAN:
+	case NODETYPE_GREATERTHAN:
+		ret += sizeof(Node->BinOp);
+		ret += AST_GetNodeSize( Node->BinOp.Left );
+		ret += AST_GetNodeSize( Node->BinOp.Right );
+		break;
+	
+	// Node types with no children
+	case NODETYPE_NOP:
+		break;
+	case NODETYPE_VARIABLE:
+	case NODETYPE_CONSTANT:
+		ret += sizeof(Node->Variable) + strlen(Node->Variable.Name) + 1;
+		break;
+	case NODETYPE_STRING:
+		ret += sizeof(Node->String) + Node->String.Length;
+		break;
+	case NODETYPE_INTEGER:
+		ret += sizeof(Node->Integer);
+		break;
+	case NODETYPE_REAL:
+		ret += sizeof(Node->Real);
+		break;
+	}
+	return ret;
+}
+
 /**
  * \brief Free a node and all subnodes
  */
diff --git a/Usermode/Libraries/libspiderscript.so_src/ast.h b/Usermode/Libraries/libspiderscript.so_src/ast.h
index 7c0d3037186a186f27535eac71abbd27bcbe7823..1c4ab4b623df6eea10ed9adae3df72a4f1f26f94 100644
--- a/Usermode/Libraries/libspiderscript.so_src/ast.h
+++ b/Usermode/Libraries/libspiderscript.so_src/ast.h
@@ -115,11 +115,6 @@ struct sAST_Node
 			tAST_Node	*Right;
 		}	BinOp;
 		
-		struct {
-			 int	Length;
-			char	Data[];
-		}	String;
-		
 		struct {
 			tAST_Node	*FirstArg;
 			tAST_Node	*LastArg;
@@ -161,6 +156,11 @@ struct sAST_Node
 			 tAST_Node	*Value;
 		}	Cast;
 		
+		struct {
+			 int	Length;
+			char	Data[];
+		}	String;
+		
 		uint64_t	Integer;
 		double	Real;
 	};