diff --git a/sources/zweic/Generator.scala b/sources/zweic/Generator.scala
index cffe82b..cacb257 100644
--- a/sources/zweic/Generator.scala
+++ b/sources/zweic/Generator.scala
@@ -108,26 +108,29 @@
 
     case method @ MethodDef(name, params, _, body) =>
 	val oldFrameSize = code.getFrameSize();
-	code.decFrameSize(oldFrameSize);
-	code.incFrameSize(params.length*4+4);
+	code.decFrameSize(oldFrameSize); // fs = 0
+	code.incFrameSize(params.length*4+4); // fs = params + this
 
 	code.emit(PSH, LNK, SP, 4);
-	code.incFrameSize(4);
+	code.incFrameSize(4); // fs = params + this + lnk
 
 	name.sym.asInstanceOf[MethodSymbol].address = code.pc();
 	
-	gen(body);
+	code.getRegister(RES);
+	genLoad(body, RES); // fs = params + this + lnk + ...
+	code.freeRegister(RES);
 
-	code.emit(SUBI, SP, SP, code.getFrameSize() - 4+4+4*params.length );
-	code.decFrameSize(code.getFrameSize() - 4+4+4*params.length);
+
+	code.emit(SUBI, SP, SP, code.getFrameSize() - (4+4+4*params.length) );
+	code.decFrameSize(code.getFrameSize()); // fs = 0
+ 	code.incFrameSize(4+4+4*params.length); // fs = params + this + lnk
 
 	code.emit(POP, LNK, SP, 4);
-	code.decFrameSize(4);
+	code.decFrameSize(4); // fs = params + this
 
 	code.emit(SUBI, SP, SP, params.length*4+4);
-	code.decFrameSize(code.getFrameSize());
-	code.incFrameSize(oldFrameSize);
-	code.decFrameSize(params.length*4+4);
+	code.decFrameSize(code.getFrameSize()); // fs = 0
+	code.incFrameSize(oldFrameSize); // fs = oldframesize
 
 	code.emit(RET, LNK);
 	
@@ -148,9 +151,9 @@
     case Var(varname, _, init) =>
 	genTmp { tmpReg =>
 		genLoad(init, tmpReg);
-		code.incFrameSize(4);
 		varname.sym.offset = code.getFrameSize();
 		code.emit(PSH, tmpReg, SP, 4);
+		code.incFrameSize(4);
 	}
 
     case Set(name, expr) =>
@@ -262,7 +265,8 @@
 		genLoad(main, targetReg);
 
 		code.emit(SUBI, SP, SP, code.getFrameSize()-fs);
-		code.decFrameSize(code.getFrameSize()-fs);
+		code.decFrameSize(code.getFrameSize());
+		code.incFrameSize(fs);
 
       case Ident(name) =>
 		if ( name.name == "this" ) {
@@ -299,10 +303,22 @@
 		
 		genTmp { thisReg =>
 
-			genLoad(receiver, thisReg);
-			code.emit(PSH, thisReg, SP, 4); // this TODO
-			code.incFrameSize(4);
+			// put all registers on stack
+			val used = code.usedRegisters();
 
+			for ( val i <- Iterator.range(0, used.length)) {
+				if ( used(i) && i != targetReg ) {
+					code.emit(PSH, i, SP, 4);
+					code.incFrameSize(4);
+				}
+			}
+			
+			// get 'this' and put it on stack
+			genLoad(receiver, thisReg);
+			code.emit(PSH, thisReg, SP, 4);
+			code.incFrameSize(4);
+			
+			// put args on stack
 			genTmp { tmpReg =>
 				for ( val a <- args ) {
 					genLoad(a, tmpReg);
@@ -314,10 +330,24 @@
 			//TODO check thisReg != null
 			code.emit(LDW, thisReg, thisReg, method.sym.offset);
 			//TODO check thisReg != null
+
 			code.emit(RET, thisReg);
+
+
+			code.emit(ADD, targetReg, ZERO, RES);
+
+			code.decFrameSize(args.length*4+4); // fs = oldframesize - params - this
+			
+			// retrieve all registers from stack
+			for ( val j <- Iterator.range(0, used.length)) {
+				if ( used(j) && j != targetReg ) {
+					code.emit(POP, j, SP, 4);
+					code.decFrameSize(4);
+				}
+			}
 		}
 
-		code.emit(ADDI, SP, SP, args.length*4);
+		//code.emit(ADDI, SP, SP, args.length*4);
 		
         // ... � compl�ter ...