diff --git a/Usermode/Libraries/libspiderscript.so_src/ast.c b/Usermode/Libraries/libspiderscript.so_src/ast.c
index 7d644cdc2df9b0c6123ce6bf2400f5d9c97e1a70..b662e320ffbcfd7155bf739d17f121dfb4add4b2 100644
--- a/Usermode/Libraries/libspiderscript.so_src/ast.c
+++ b/Usermode/Libraries/libspiderscript.so_src/ast.c
@@ -188,6 +188,7 @@ size_t AST_GetNodeSize(tAST_Node *Node)
 	return ret;
 }
 
+#if 0
 /**
  * \brief Write a node to a file
  */
@@ -195,6 +196,7 @@ void AST_WriteNode(FILE *FP, tAST_Node *Node)
 {
 	tAST_Node	*node;
 	intptr_t	ptr;
+	 int	ret;
 	
 	if(!Node)	return ;
 	
@@ -315,6 +317,7 @@ void AST_WriteNode(FILE *FP, tAST_Node *Node)
 	}
 	return ret;
 }
+#endif
 
 /**
  * \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 1c4ab4b623df6eea10ed9adae3df72a4f1f26f94..565c94aabdd09736d00948246ed7fa6ef8501d3c 100644
--- a/Usermode/Libraries/libspiderscript.so_src/ast.h
+++ b/Usermode/Libraries/libspiderscript.so_src/ast.h
@@ -203,6 +203,7 @@ extern tAST_Node	*AST_NewCodeBlock(void);
 extern void	AST_AppendNode(tAST_Node *Parent, tAST_Node *Child);
 
 extern tAST_Node	*AST_NewIf(tParser *Parser, tAST_Node *Condition, tAST_Node *True, tAST_Node *False);
+extern tAST_Node	*AST_NewLoop(tParser *Parser, tAST_Node *Init, int bPostCheck, tAST_Node *Condition, tAST_Node *Increment, tAST_Node *Code);
 
 extern tAST_Node	*AST_NewAssign(tParser *Parser, int Operation, tAST_Node *Dest, tAST_Node *Value);
 extern tAST_Node	*AST_NewCast(tParser *Parser, int Target, tAST_Node *Value);
diff --git a/Usermode/Libraries/libspiderscript.so_src/parse.c b/Usermode/Libraries/libspiderscript.so_src/parse.c
index 3ac6fa8432309da1428f761d813b4b2d5a8576c8..3ad4081c8e94ddd252842dcf2ecc5e452fb7b81b 100644
--- a/Usermode/Libraries/libspiderscript.so_src/parse.c
+++ b/Usermode/Libraries/libspiderscript.so_src/parse.c
@@ -48,7 +48,7 @@ void	SyntaxAssert(tParser *Parser, int Have, int Want);
 tAST_Script	*Parse_Buffer(tSpiderVariant *Variant, char *Buffer)
 {
 	tParser	parser = {0};
-	tParser *Parser = &parser;	//< Keeps code consitent
+	tParser *Parser = &parser;	//< Keeps code consistent
 	tAST_Script	*ret;
 	tAST_Node	*mainCode;
 	char	*name;
@@ -194,6 +194,10 @@ tAST_Node *Parse_DoBlockLine(tParser *Parser)
 	
 	switch(LookAhead(Parser))
 	{
+	// Empty statement
+	case TOK_SEMICOLON:
+		GetToken(Parser);
+		return NULL;
 	
 	// Return from a method
 	case TOK_RWD_RETURN:
@@ -219,9 +223,31 @@ tAST_Node *Parse_DoBlockLine(tParser *Parser)
 		}
 		return ret;
 	case TOK_RWD_FOR:
+		{
+		tAST_Node	*init=NULL, *cond=NULL, *inc=NULL, *code;
+		GetToken(Parser);	// Eat 'for'
+		SyntaxAssert(Parser, GetToken(Parser), TOK_PAREN_OPEN);
+		
+		if(LookAhead(Parser) != TOK_SEMICOLON)
+			init = Parse_DoExpr0(Parser);
+		
+		SyntaxAssert(Parser, GetToken(Parser), TOK_SEMICOLON);
+		if(LookAhead(Parser) != TOK_SEMICOLON)
+			cond = Parse_DoExpr0(Parser);
+		
+		SyntaxAssert(Parser, GetToken(Parser), TOK_SEMICOLON);
+		if(LookAhead(Parser) != TOK_SEMICOLON)
+			inc = Parse_DoExpr0(Parser);
+		
+		SyntaxAssert(Parser, GetToken(Parser), TOK_PAREN_CLOSE);
+		
+		code = Parse_DoCodeBlock(Parser);
+		ret = AST_NewLoop(Parser, init, 0, cond, inc, code);
+		}
+		return ret;
 	case TOK_RWD_DO:
 	case TOK_RWD_WHILE:
-		TODO(Parser, "Implement if, for, do and while\n");
+		TODO(Parser, "Implement do and while\n");
 		break;
 	
 	// Define Variables