prototype.create properties creating with direct typing (@type) 
(better) support for @depercation and @protected
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
index 13673e2..1f0c063 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
@@ -617,7 +617,7 @@
 									if (valueMember != null) {
 										newMembers.add(new RRecordMember(member
 												.getName(), valueMember
-												.getType(), valueMember
+														.getType(), member
 												.getSource()));
 									}
 									valueMember = ((IRRecordType) member
@@ -633,6 +633,8 @@
 												.getName(), valueType,
 												valueMember.getSource()));
 									}
+								} else {
+									newMembers.add(member);
 								}
 							}
 							if (newMembers.size() > 0) {
@@ -1453,6 +1455,8 @@
 									getTypeChecker());
 							jsdocSupport.parseDeprecation(source, tags,
 									reporter);
+							jsdocSupport.parseAccessModifiers(source, tags,
+									reporter);
 						}
 					}
 				} else {
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
index 04d7dbc..da6297d 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
@@ -1391,6 +1391,15 @@
 			}
 		}
 
+		private void reportDeprecatedRecordMember(ASTNode node,
+				IValueReference reference, IRRecordMember method) {
+			IRType type = JavaScriptValidations.typeOf(reference.getParent());
+			final String msg = NLS.bind(ValidationMessages.DeprecatedProperty,
+					method.getName(), type != null ? type.getName() : null);
+			reporter.reportProblem(JavaScriptProblems.DEPRECATED_PROPERTY, msg,
+					node.sourceStart(), node.sourceEnd());
+		}
+
 		private void reportMethodParameterError(ASTNode methodNode,
 				IValueReference[] arguments, IRMethod method) {
 			if (method.getDeclaringType() != null) {
@@ -2003,6 +2012,9 @@
 						else if (member instanceof IRMethod)
 							reportDeprecatedMethod(propName, result,
 									(IRMethod) member);
+						else if (member instanceof IRRecordMember)
+							reportDeprecatedRecordMember(propName, result,
+									(IRRecordMember) member);
 					}
 				} else if (!member.isVisible()) {
 					final IRProperty parentProperty = ValueReferenceUtil
@@ -2043,7 +2055,7 @@
 					// result.getName(), type.getName()), propName
 					// .sourceStart(), propName.sourceEnd());
 				} else if (member.getVisibility() != Visibility.PUBLIC) {
-					validateAccessibility(propName, member);
+					validateAccessibility(propName, result, member);
 				}
 			} else if ((!exists && !result.exists())
 					&& !isDynamicArrayAccess(result)) {
diff --git a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
index 7943781..c47997f 100644
--- a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
+++ b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
@@ -1140,5 +1140,79 @@
 		
 //		assertFalse(names.contains("protectedMethod"));
 	}
+	
+	
+	public void testPrototypeChainWithPropetiesWithTypeDeclaration() {
+		final StringList code = new StringList();
+		code.add("function BaseEntity() {}");
+		code.add("/**");
+		code.add(" * @extends {BaseEntity}");
+		code.add(" */");
+		code.add("function ExtendedEntity() {}");
+		code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+		code.add("/**");
+		code.add(" * @type {String}");
+		code.add(" */");
+		code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+		code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+		code.add("function test() {");
+		code.add("	var x = new ExtendedEntity();");
+		code.add("	x.");
+		code.add("}");
+		
+		final IModuleSource module = new TestModule(code.toString());
+		final List<CompletionProposal> results = new ArrayList<CompletionProposal>();
+		final ICompletionEngine completionEngine = createEngine(results,
+				JSCompletionEngine.OPTION_KEYWORDS);
+		completionEngine.complete(module, lastPositionInFile("x.", module), 0);
+		assertEquals(9, results.size());
+		
+		HashSet<String> names = new HashSet<String>(16);
+		for (CompletionProposal cp : results) {
+			names.add(cp.getName());
+		}
+		
+		assertTrue(names.contains("foo"));
+		assertTrue(names.contains("bar"));
+	}
+	
+	public void testPrototypeChainWithPropetiesWithTypeDeclarationProtected() {
+		if (notYetImplemented(this)) return;
+		final StringList code = new StringList();
+		code.add("function BaseEntity() {}");
+		code.add("/**");
+		code.add(" * @extends {BaseEntity}");
+		code.add(" */");
+		code.add("function ExtendedEntity() {}");
+		code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+		code.add("/**");
+		code.add(" * @type {String}");
+		code.add(" * @protected");
+		code.add(" */");
+		code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+		code.add("/**");
+		code.add(" * @protected");  
+		code.add(" */");
+		code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+		code.add("function test() {");
+		code.add("	var x = new ExtendedEntity();");
+		code.add("	x.;");
+		code.add("}");
+		
+		final IModuleSource module = new TestModule(code.toString());
+		final List<CompletionProposal> results = new ArrayList<CompletionProposal>();
+		final ICompletionEngine completionEngine = createEngine(results,
+				JSCompletionEngine.OPTION_KEYWORDS);
+		completionEngine.complete(module, lastPositionInFile("x.", module), 0);
+		assertEquals(9, results.size());
+		
+		HashSet<String> names = new HashSet<String>(16);
+		for (CompletionProposal cp : results) {
+			names.add(cp.getName());
+		}
+		
+		assertFalse(names.contains("foo"));
+		assertFalse(names.contains("bar"));
+	}
 }
 
diff --git a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java
index 063726c..7577fd2 100644
--- a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java
+++ b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/CodeValidatorValidationTests.java
@@ -1,5 +1,7 @@
 package org.eclipse.dltk.javascript.core.tests.validation;
 
+import static org.eclipse.dltk.core.tests.TestSupport.notYetImplemented;
+
 import java.util.Set;
 
 import org.eclipse.dltk.compiler.problem.IProblemIdentifier;
@@ -263,4 +265,55 @@
 		assertEquals(problemIds.toString(), 0, problemIds.size());
 	}
 
+	public void testPrototypeChainWithPropetiesWithTypeDeclarationDeprected() {
+		final StringList code = new StringList();
+		code.add("function BaseEntity() {}");
+		code.add("/**");
+		code.add(" * @extends {BaseEntity}");
+		code.add(" */");
+		code.add("function ExtendedEntity() {}");
+		code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+		code.add("/**");
+		code.add(" * @type {String}");
+		code.add(" * @deprecated");
+		code.add(" */");
+		code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+		code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+		code.add("function test() {");
+		code.add("	var x = new ExtendedEntity();");
+		code.add("	x.foo;");
+		code.add("}");
+		final Set<IProblemIdentifier> problemIds = extractIds(validate(code
+				.toString()));
+		assertEquals(problemIds.toString(), 1, problemIds.size());
+		assertTrue(problemIds.toString(),
+				problemIds.contains(JavaScriptProblems.DEPRECATED_PROPERTY));
+	}
+	
+	public void testPrototypeChainWithPropetiesDeprected() {
+		final StringList code = new StringList();
+		code.add("function BaseEntity() {}");
+		code.add("/**");
+		code.add(" * @extends {BaseEntity}");
+		code.add(" */");
+		code.add("function ExtendedEntity() {}");
+		code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {");
+		code.add("/**");
+		code.add(" * @type {String}");
+		code.add(" */");
+		code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},");
+		code.add("/**");
+		code.add(" * @deprecated");  
+		code.add(" */");
+		code.add("bar:{ writable:true, configurable:true, value: 'hello' }});");
+		code.add("function test() {");
+		code.add("	var x = new ExtendedEntity();");
+		code.add("	x.bar;");
+		code.add("}");
+		final Set<IProblemIdentifier> problemIds = extractIds(validate(code
+				.toString()));
+		assertEquals(problemIds.toString(), 1, problemIds.size());
+		assertTrue(problemIds.toString(),
+				problemIds.contains(JavaScriptProblems.DEPRECATED_PROPERTY));
+	}
 }