diff --git a/tests/org.eclipse.wst.jsdt.core.tests.compiler/src/org/eclipse/wst/jsdt/core/tests/compiler/regression/InferTypesTests.java b/tests/org.eclipse.wst.jsdt.core.tests.compiler/src/org/eclipse/wst/jsdt/core/tests/compiler/regression/InferTypesTests.java
index 43d64e8..16957b4 100644
--- a/tests/org.eclipse.wst.jsdt.core.tests.compiler/src/org/eclipse/wst/jsdt/core/tests/compiler/regression/InferTypesTests.java
+++ b/tests/org.eclipse.wst.jsdt.core.tests.compiler/src/org/eclipse/wst/jsdt/core/tests/compiler/regression/InferTypesTests.java
@@ -37,7 +37,7 @@
 			"var myClassObj = new MyClass();\n"+
 			"\n",
 			"X.js",
-			"class MyClass extends Object{\n  String url;\n  MyClass()\n  void activate()\n}\n",
+			"class MyClass extends Object{\n  String url;\n  void activate()\n  MyClass()\n}\n",
 			getDefaultOptions()
 			
 		 );
@@ -50,11 +50,11 @@
 				"function Shape(){}"+
 				"function Shape_GetArea()"+
 				"{"+
-				" this.area=5;"+ 
-				"return this.area;"+ 
+				" var area = 5;"+ 
+				"return area;"+ 
 				"}",
 			"X.js",
-			"class Shape extends Object{\n  Number area;\n  Number GetArea()\n  Shape()\n}\n",
+			"class Shape extends Object{\n  Number GetArea()\n  Shape()\n}\n",
 			getDefaultOptions()
 			
 		 );
@@ -694,25 +694,6 @@
 				
 			 );
 		}
-		
-
-		
-		//		/*
-//		 * Dynamic extend built-in through prototype
-//		 */
-//		public void test077() {
-//			CompilationUnitDeclaration declaration = this.runInferTest(
-//				"Object.prototype.foo = \"\";" +
-//				"Object.prototype.bar = function(){" +
-//				"  return \"\";" +
-//				"}",
-//				"X.js",
-//				"",
-//				getDefaultOptions()
-//				
-//			 );
-//		}
-
 
 		public void test083() {
 			CompilationUnitDeclaration declaration = this.runInferTest(
@@ -724,12 +705,234 @@
 				"Car.engine = 'diesel';" +
 				"",
 				"X.js",
-				"class Car extends Object{\n  static String engine;\n  String color;\n  Car()\n  String Move()\n  static String Stop()\n}\n",
+				"class Car extends Object{\n  String color;\n  static String engine;\n  String Move()\n  static String Stop()\n  Car()\n}\n",
 				getDefaultOptions()
 				
 			 );
 		}
 		
-
-
+		// test type infered from function with 'this' assignments
+		public void test084() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Car() {" +
+				"	this.color = 'red';" +
+				"	this.Move = function() { return \"I'm moving\"; };" +
+				"};" +
+				"",
+				"X.js",
+				"class Car extends Object{\n  String color;\n  String Move()\n  Car()\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test085() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = l;" +
+				"	this.width = w;" +
+				"}",
+				"X.js",
+				"class Shape extends Object{\n  ?? length;\n  ?? width;\n  Shape(l, w)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test086() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = l;" +
+				"	this.width = w;" +
+				"	return this.length * this.width;" +
+				"}",
+				"X.js",
+				"class Shape extends Object{\n  ?? length;\n  ?? width;\n  Shape(l, w)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test087() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = l;" +
+				"	this.width = w;" +
+				"}" + 
+				"var s = new Shape(2, 3);" + 
+				"s.area = function() {return this.length * this.width;};",
+				"X.js",
+				"class Shape extends Object{\n  ?? length;\n  ?? width;\n  Shape(l, w)\n}\n" +
+				"class ___s0 extends Shape{\n  Number area()\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test088() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = l;" +
+				"	this.width = w;" +
+				"	this.area = function() {return this.length * this.width;};" +
+				"}",
+				"X.js",
+				"class Shape extends Object{\n  ?? length;\n  ?? width;\n  Number area()\n  Shape(l, w)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test089() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = l;" +
+				"	this.width = w;" +
+				"}" +
+				"Shape.prototype.area = function() {return this.length * this.width;};",
+				"X.js",
+				"class Shape extends Object{\n  ?? length;\n  ?? width;\n  Number area()\n  Shape(l, w)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test090() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = l;" +
+				"	this.width = w;" +
+				"}" +
+				"Shape.CONSTANT = 3;",
+				"X.js",
+				"class Shape extends Object{\n  ?? length;\n  ?? width;\n  static Number CONSTANT;\n  Shape(l, w)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test091() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Round(r){" +
+				"	this.rad = r;" +
+				"}" +
+				"Round.PI = 3.14;" +
+				"Round.prototype.area = function() {return Round.PI * this.rad * this.rad;};" +
+				"Round.equal = function(a, b) {" +
+				"if(a == b) return true;" +
+				"return false;" +
+				"};",
+				"X.js",
+				"class Round extends Object{\n  ?? rad;\n  static Number PI;\n  Number area()\n  static Boolean equal(a, b)\n  Round(r)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test092() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Com(r, i){" +
+				"	this.r1 = r;" +
+				"	this.i1 = i;" +
+				"}" +
+				"Com.prototype.meth1 = function() {return 1;};" +
+				"Com.prototype.meth2 = function() {return new Com(1, 2);};" +
+				"Com.prototype.meth3 = function(that) {return new Com(that+1, that-1);};" +
+				"Com.prototype.toString = function() {return \"hi\"};" +
+				"Com.classMeth1 = function(a, b) {return new Com(a, b);};" +
+				"Com.classMeth2 = function(a, b) {return new Com(a, b);};" +
+				"Com.ZERO = new Com(0,0);" +
+				"Com.ONE = new Com(1,0);",
+				"X.js",
+				"class Com extends Object{\n  ?? r1;\n  ?? i1;\n  static Com ZERO;\n  static Com ONE;\n" +
+				"  Number meth1()\n  Com meth2()\n  Com meth3(that)\n  String toString()\n  static Com classMeth1(a, b)\n  static Com classMeth2(a, b)\n  Com(r, i)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test093() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = function() {return l;};" +
+				"	this.width = function() {return w;};" +
+				"}" +
+				"Shape.prototype.perimeter = function() {return (this.length * 2) + (this.width * 2);};",
+				"X.js",
+				"class Shape extends Object{\n  ?? length()\n  ?? width()\n  Number perimeter()\n  Shape(l, w)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test094() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Shape(l, w){" +
+				"	this.length = l;" +
+				"	this.width = w;" +
+				"}" +
+				"Shape.prototype.area = function() {return this.length * this.width;};" +
+				"function SubShape(l, w, x) {" +
+				"Shape.call(this, l, w);" +
+				"this.x = y;" +
+				"}" +
+				"SubShape.prototype = new Shape();" +
+				"SubShape.prototype.meth = function() {return 1};",
+				"X.js",
+				"class Shape extends Object{\n  ?? length;\n  ?? width;\n  Number area()\n  Shape(l, w)\n}\n" +
+				"class SubShape extends Shape{\n  ?? x;\n  Number meth()\n  SubShape(l, w, x)\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test095() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Abc(){" +
+				"	this.mult = function(a, b){return a * b;};" +
+				"	this.div = function(a, b){return a / b;};" +
+				"	this.rem = function(a, b){return a % b;};" +
+				"	this.sub = function(a, b){return a - b;};" +
+				"}",
+				"X.js",
+				"class Abc extends Object{\n  Number mult(a, b)\n  Number div(a, b)\n  Number rem(a, b)\n  Number sub(a, b)\n  Abc()\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test096() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Plus(){" +
+				"	this.strings = function(){return \"a\" + \"b\";};" +
+				"	this.oneStringOneNumber = function(){return \"a\" + 1;};" +
+				"	this.oneStringOneNumber2 = function(){return \"3\" + 1;};" +
+				"	this.numbers = function(){return 1 + 2;};" +
+				"	this.unknownString = function(a){return a + \"b\";};" +
+				"	this.unknownNumber = function(a){return a + 3;};" +
+				"	this.unknownUnknown = function(a, b){return a + b;};" +
+				"}",
+				"X.js",
+				"class Plus extends Object{\n  String strings()\n  String oneStringOneNumber()\n  String oneStringOneNumber2()\n  " +
+				"Number numbers()\n  String unknownString(a)\n  ?? unknownNumber(a)\n  ?? unknownUnknown(a, b)\n  Plus()\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
+		public void test097() {
+			CompilationUnitDeclaration declaration = this.runInferTest(
+				"function Equality(){" +
+				"	this.equalsEquals = function(){return \"a\" == \"b\";};" +
+				"	this.equalsEqualsEquals = function(){return \"a\" === \"b\";};" +
+				"	this.notEquals = function(){return \"a\" != \"b\";};" +
+				"	this.notEqualsEquals = function(){return \"a\" !== \"b\";};" +
+				"}",
+				"X.js",
+				"class Equality extends Object{\n  Boolean equalsEquals()\n  Boolean equalsEqualsEquals()\n  Boolean notEquals()\n  Boolean notEqualsEquals()\n  Equality()\n}\n",
+				getDefaultOptions()
+				
+			 );
+		}
+		
 }
diff --git a/tests/org.eclipse.wst.jsdt.core.tests.model/src/org/eclipse/wst/jsdt/core/tests/dom/ASTConverterJavadocTest.java b/tests/org.eclipse.wst.jsdt.core.tests.model/src/org/eclipse/wst/jsdt/core/tests/dom/ASTConverterJavadocTest.java
index 3b71899..c7900f6 100644
--- a/tests/org.eclipse.wst.jsdt.core.tests.model/src/org/eclipse/wst/jsdt/core/tests/dom/ASTConverterJavadocTest.java
+++ b/tests/org.eclipse.wst.jsdt.core.tests.model/src/org/eclipse/wst/jsdt/core/tests/dom/ASTConverterJavadocTest.java
@@ -2451,8 +2451,6 @@
 			// Verify binding for simple name
 			IBinding binding = seeRef.resolveBinding();
 			assertTrue("Wrong kind of binding", binding instanceof ITypeBinding);
-			ITypeBinding typeBinding = (ITypeBinding)binding;
-			assertFalse(seeRef.toString()+" should NOT have a raw type binding", typeBinding.isRawType());
 			// Get inline tag simple name reference in second tag
 			assertEquals("Invalid number of fragments for inline tag element: "+inlineTag, 1, inlineTag.fragments().size());
 			node = (ASTNode) inlineTag.fragments().get(0);
@@ -2461,8 +2459,6 @@
 			// Verify binding for qualified name
 			binding = linkRef.resolveBinding();
 			assertTrue("Wrong kind of binding", binding instanceof ITypeBinding);
-			typeBinding = (ITypeBinding)binding;
-			assertFalse(linkRef.toString()+" should NOT have a raw type binding", typeBinding.isRawType());
 		}
 	}
 
