diff --git apitests/win32nt/CMakeLists.txt apitests/win32nt/CMakeLists.txt
index 43a3113..68dcdec 100644
--- apitests/win32nt/CMakeLists.txt
+++ apitests/win32nt/CMakeLists.txt
@@ -44,6 +44,7 @@ list(APPEND SOURCE
 #    ntuser/NtUserCallNoParam.c
 #    ntuser/NtUserCallOneParam.c
     ntuser/NtUserCountClipboardFormats.c
+	ntuser/NtUserCreateWindowEx.c
 #    ntuser/NtUserEnumDisplayMonitors.c
     ntuser/NtUserEnumDisplaySettings.c
     ntuser/NtUserFindExistingCursorIcon.c
diff --git apitests/win32nt/ntuser/NtUserCreateWindowEx.c apitests/win32nt/ntuser/NtUserCreateWindowEx.c
new file mode 100644
index 0000000..377b0ba
--- /dev/null
+++ apitests/win32nt/ntuser/NtUserCreateWindowEx.c
@@ -0,0 +1,125 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * PURPOSE:         Test for NtUserCreateWindowEx
+ * PROGRAMMERS:
+ */
+
+#include <win32nt.h>
+
+#define WNDCREATOR(clsName, clsVer, wndName)    \
+    NtUserCreateWindowEx(                       \
+            WS_EX_OVERLAPPEDWINDOW,             \
+            clsName,                            \
+            clsVer,                             \
+            wndName,                            \
+            WS_CAPTION,                         \
+            CW_USEDEFAULT,                      \
+            CW_USEDEFAULT,                      \
+            100,                                \
+            100,                                \
+            NULL,                               \
+            NULL,                               \
+            hinst,                              \
+            0,                                  \
+            0,                                  \
+            NULL)
+
+
+/* WndProc for class1 */
+
+LRESULT CALLBACK wndProc1(HWND hwnd, UINT msg, WPARAM wPrm, LPARAM lPrm)
+{
+    return DefWindowProc(hwnd, msg, wPrm, lPrm);
+}
+
+/* WndProc for class2 */
+LRESULT CALLBACK wndProc2(HWND hwnd, UINT msg, WPARAM wPrm, LPARAM lPrm)
+{
+    return DefWindowProc(hwnd, msg, wPrm, lPrm);
+}
+
+
+START_TEST(NtUserCreateWindowEx)
+{
+    HINSTANCE hinst = GetModuleHandle(NULL);
+    WNDCLASSEXW wclex = {0};
+    /* Unicode strings for NtRegisterClassExWOW */
+    UNICODE_STRING cls = {8, 8, L"MyClass"};
+    UNICODE_STRING ver_cls = {8, 8, L"v2test"};
+    UNICODE_STRING menu = {8, 8, NULL};
+
+    /* LARGE_STRING for NtUserCreateWindowEx */
+    LARGE_STRING l_dummy = {8, 8, 0, L"DummyMe"};
+    LARGE_STRING l_wndName = {8, 8, 0, L""};
+    LARGE_STRING l_cls = {8, 8, 0, cls.Buffer};
+    LARGE_STRING l_ver_cls = {8, 8, 0, ver_cls.Buffer};
+    
+    CLSMENUNAME clsMenuName;
+    ATOM atom, atom2;
+    HWND hwnd;
+    
+    clsMenuName.pszClientAnsiMenuName = NULL;
+    clsMenuName.pwszClientUnicodeMenuName = NULL;
+    clsMenuName.pusMenuName = &menu;
+
+    wclex.cbSize = sizeof(WNDCLASSEXW);
+    wclex.style = 0;
+    wclex.lpfnWndProc = wndProc1;
+    wclex.cbClsExtra = 2;
+    wclex.cbWndExtra = 4;
+    wclex.hInstance = hinst;
+    wclex.hIcon = NULL;
+    wclex.hCursor = NULL;
+    wclex.hbrBackground = CreateSolidBrush(RGB(4,7,5));
+    wclex.lpszMenuName = menu.Buffer;
+    wclex.lpszClassName = cls.Buffer;
+    wclex.hIconSm = NULL;
+
+    /* Register our first version */ 
+    atom = NtUserRegisterClassExWOW(
+            &wclex,  /* wndClass */
+            &cls,     /* ClassName */
+            &cls,     /* Version */
+            &clsMenuName,  /* MenuName */
+            0,
+            0,
+            NULL);
+    TEST(atom != 0);
+
+    /* Register second version */
+    wclex.lpfnWndProc = wndProc2;
+    atom2 = NtUserRegisterClassExWOW(
+            &wclex,  /* wndClass */
+            &cls,     /* ClassName */
+            &ver_cls, /* Version */
+            &clsMenuName,  /* MenuName */
+            0,
+            0,
+            NULL);
+    TEST(atom2 != 0);
+    TEST(atom == atom2 && (atom | atom2) != 0);
+
+    /* Now, create our first window */
+    hwnd = WNDCREATOR(&l_cls, &l_cls, &l_wndName);
+    TEST(hwnd != 0);
+    if(hwnd)
+    {
+        TEST((WNDPROC)GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == wndProc1);
+        DestroyWindow(hwnd);
+    }
+    
+    /* Create our second version */
+    hwnd = WNDCREATOR(&l_cls, &l_ver_cls, &l_wndName);
+    TEST(hwnd != 0);
+    if(hwnd)
+    {
+        TEST((WNDPROC)GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == wndProc2);
+        DestroyWindow(hwnd);
+    }
+
+    /* Create a nonexistent window */
+    hwnd = WNDCREATOR(&l_cls, &l_dummy, &l_wndName);
+    TEST(hwnd == 0);
+    if(hwnd) DestroyWindow(hwnd);
+}
diff --git apitests/win32nt/testlist.c apitests/win32nt/testlist.c
index 23f6b69..b262191 100644
--- apitests/win32nt/testlist.c
+++ apitests/win32nt/testlist.c
@@ -44,6 +44,7 @@ extern void func_NtGdiSetDIBitsToDeviceInternal(void);
 //extern void func_NtUserCallNoParam(void);
 //extern void func_NtUserCallOneParam(void);
 extern void func_NtUserCountClipboardFormats(void);
+extern void func_NtUserCreateWindowEx(void);
 //extern void func_NtUserEnumDisplayMonitors(void);
 extern void func_NtUserEnumDisplaySettings(void);
 extern void func_NtUserFindExistingCursorIcon(void);
@@ -105,6 +106,7 @@ const struct test winetest_testlist[] =
     //{ "NtUserCallNoParam", func_NtUserCallNoParam },
     //{ "NtUserCallOneParam", func_NtUserCallOneParam },
     { "NtUserCountClipboardFormats", func_NtUserCountClipboardFormats },
+    { "NtUserCreateWindowEx", func_NtUserCreateWindowEx },
     //{ "NtUserEnumDisplayMonitors", func_NtUserEnumDisplayMonitors },
     { "NtUserEnumDisplaySettings", func_NtUserEnumDisplaySettings },
     { "NtUserFindExistingCursorIcon", func_NtUserFindExistingCursorIcon },
