diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty1.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty1.tsx
new file mode 100644
index 00000000000..70b58c03f6a
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty1.tsx
@@ -0,0 +1,27 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface Prop {
+ a: number,
+ b: string,
+ children: string | JSX.Element
+}
+
+function Comp(p: Prop) {
+ return
{p.b}
;
+}
+
+// OK
+let k = ;
+let k1 =
+
+ hi hi hi!
+ ;
+let k2 =
+
+ hi hi hi!
+ ;
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty2.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty2.tsx
new file mode 100644
index 00000000000..0c78f8f4125
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty2.tsx
@@ -0,0 +1,49 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface Prop {
+ a: number,
+ b: string,
+ children: string | JSX.Element
+}
+
+function Comp(p: Prop) {
+ return {p.b}
;
+}
+
+// Error: missing children
+let k = ;
+
+let k1 =
+
+ hi hi hi!
+ ;
+
+// Error: incorrect type
+let k2 =
+
+ My Div
+ {(name: string) => My name {name}
}
+ ;
+
+let k3 =
+
+ My Div
+ {1000000}
+ ;
+
+let k4 =
+
+ My Div
+ hi hi hi!
+ ;
+
+let k5 =
+
+ My Div
+ My Div
+ ;
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty3.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty3.tsx
new file mode 100644
index 00000000000..c67c6d5440d
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty3.tsx
@@ -0,0 +1,44 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface IUser {
+ Name: string;
+}
+
+interface IFetchUserProps {
+ children: (user: IUser) => JSX.Element;
+}
+
+class FetchUser extends React.Component {
+ render() {
+ return this.state
+ ? this.props.children(this.state.result)
+ : null;
+ }
+}
+
+// Ok
+function UserName0() {
+ return (
+
+ { user => (
+ { user.Name }
+ ) }
+
+ );
+}
+
+function UserName1() {
+ return (
+
+
+ { user => (
+ { user.Name }
+ ) }
+
+ );
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty4.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty4.tsx
new file mode 100644
index 00000000000..34877f2000c
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty4.tsx
@@ -0,0 +1,49 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface IUser {
+ Name: string;
+}
+
+interface IFetchUserProps {
+ children: (user: IUser) => JSX.Element;
+}
+
+class FetchUser extends React.Component {
+ render() {
+ return this.state
+ ? this.props.children(this.state.result)
+ : null;
+ }
+}
+
+// Error
+function UserName() {
+ return (
+
+ { user => (
+ { user.NAme }
+ ) }
+
+ );
+}
+
+function UserName1() {
+ return (
+
+
+
+
+ { user => (
+ { user.Name }
+ ) }
+ { user => (
+ { user.Name }
+ ) }
+
+ );
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty5.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty5.tsx
new file mode 100644
index 00000000000..6143e4b0faf
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty5.tsx
@@ -0,0 +1,35 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface Prop {
+ a: number,
+ b: string,
+ children: Button;
+}
+
+class Button extends React.Component {
+ render() {
+ return (My Button
)
+ }
+}
+
+function Comp(p: Prop) {
+ return {p.b}
;
+}
+
+// Error: no children specified
+let k = ;
+
+// Error: JSX.element is not the same as JSX.ElementClass
+let k1 =
+
+
+ ;
+let k2 =
+
+ {Button}
+ ;
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty6.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty6.tsx
new file mode 100644
index 00000000000..c7c709dd369
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty6.tsx
@@ -0,0 +1,48 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface Prop {
+ a: number,
+ b: string,
+ children: JSX.Element | JSX.Element[];
+}
+
+class Button extends React.Component {
+ render() {
+ return (My Button
)
+ }
+}
+
+function AnotherButton(p: any) {
+ return Just Another Button
;
+}
+
+function Comp(p: Prop) {
+ return {p.b}
;
+}
+
+// Ok
+let k1 =
+
+
+
+ ;
+
+let k2 =
+
+
+
+
+
+
+ ;
+
+let k3 =
+
+;
+
+let k4 = ;
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty7.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty7.tsx
new file mode 100644
index 00000000000..82297737a11
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty7.tsx
@@ -0,0 +1,33 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface Prop {
+ a: number,
+ b: string,
+ children: JSX.Element | JSX.Element[];
+}
+
+class Button extends React.Component {
+ render() {
+ return (My Button
)
+ }
+}
+
+function AnotherButton(p: any) {
+ return Just Another Button
;
+}
+
+function Comp(p: Prop) {
+ return {p.b}
;
+}
+
+// Error: whitespaces matters
+let k1 = ;
+let k2 =
+ ;
+let k3 =
+ ;
\ No newline at end of file
diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty8.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty8.tsx
new file mode 100644
index 00000000000..eaba752b6a4
--- /dev/null
+++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty8.tsx
@@ -0,0 +1,34 @@
+// @filename: file.tsx
+// @jsx: preserve
+// @noLib: true
+// @libFiles: react.d.ts,lib.d.ts
+
+import React = require('react');
+
+interface Prop {
+ a: number,
+ b: string,
+ children: string | JSX.Element | (string | JSX.Element)[];
+}
+
+class Button extends React.Component {
+ render() {
+ return (My Button
)
+ }
+}
+
+function AnotherButton(p: any) {
+ return Just Another Button
;
+}
+
+function Comp(p: Prop) {
+ return {p.b}
;
+}
+
+// OK
+let k1 = ;
+let k2 =
+ ;
+let k3 =
+ ;
+let k4 = ;
diff --git a/tests/cases/conformance/jsx/tsxStatelessFunctionComponentOverload6.tsx b/tests/cases/conformance/jsx/tsxStatelessFunctionComponentOverload6.tsx
index ac0e9901427..f2e799c1c8f 100644
--- a/tests/cases/conformance/jsx/tsxStatelessFunctionComponentOverload6.tsx
+++ b/tests/cases/conformance/jsx/tsxStatelessFunctionComponentOverload6.tsx
@@ -55,7 +55,7 @@ const b6 = ;
const b7 = { console.log("hi") }}} />;
const b8 = ; // OK; method declaration get retained (See GitHub #13365)
const b9 = GO;
-const b10 = GO;
+const b10 = ;
const b11 = {}} className="hello" data-format>Hello world;
const b12 =
diff --git a/tests/cases/fourslash/tscCompletionInFunctionExpressionOfChildrenCallback.ts b/tests/cases/fourslash/tscCompletionInFunctionExpressionOfChildrenCallback.ts
new file mode 100644
index 00000000000..0a926e64ac0
--- /dev/null
+++ b/tests/cases/fourslash/tscCompletionInFunctionExpressionOfChildrenCallback.ts
@@ -0,0 +1,31 @@
+///
+//@module: commonjs
+//@jsx: preserve
+
+// @Filename: 1.tsx
+//// declare module JSX {
+//// interface Element { }
+//// interface IntrinsicElements {
+//// }
+//// interface ElementAttributesProperty { props; }
+//// }
+//// interface IUser {
+//// Name: string;
+//// }
+//// interface IFetchUserProps {
+//// children: (user: IUser) => any;
+//// }
+//// function FetchUser(props: IFetchUserProps) { return undefined; }
+//// function UserName() {
+//// return (
+////
+//// { user => (
+//// { user./**/ }
+//// )}
+////
+//// );
+//// }
+
+goTo.marker();
+debugger;
+verify.completionListContains('Name');
\ No newline at end of file