diff --git a/framework/platform/CMakeLists.txt b/framework/platform/CMakeLists.txt
index 0bbc1f6..5716c23 100644
--- a/framework/platform/CMakeLists.txt
+++ b/framework/platform/CMakeLists.txt
@@ -3,25 +3,22 @@
 # Target file may define TCUTIL_PLATFORM_SRCS
 if (NOT DEFINED TCUTIL_PLATFORM_SRCS)
 	if (DE_OS_IS_WIN32)
-			set(TCUTIL_PLATFORM_SRCS
-				win32/tcuWin32Platform.hpp
-				win32/tcuWin32Platform.cpp
-				win32/tcuWGLContextFactory.hpp
-				win32/tcuWGLContextFactory.cpp
-				win32/tcuWGL.hpp
-				win32/tcuWGL.cpp
-				win32/tcuWin32API.h
-				win32/tcuWin32Window.cpp
-				win32/tcuWin32Window.hpp
+		set(TCUTIL_PLATFORM_SRCS
+			win32/tcuWin32Platform.hpp
+			win32/tcuWin32Platform.cpp
+			win32/tcuWGLContextFactory.hpp
+			win32/tcuWGLContextFactory.cpp
+			win32/tcuWGL.hpp
+			win32/tcuWGL.cpp
+			win32/tcuWin32API.h
+			win32/tcuWin32Window.cpp
+			win32/tcuWin32Window.hpp
+			win32/tcuWin32EGLNativeDisplayFactory.hpp
+			win32/tcuWin32EGLNativeDisplayFactory.cpp
+			win32/tcuWin32VulkanPlatform.hpp
+			win32/tcuWin32VulkanPlatform.cpp
 			)
 
-		if (DEQP_SUPPORT_EGL)
-			set(TCUTIL_PLATFORM_SRCS
-				${TCUTIL_PLATFORM_SRCS}
-				win32/tcuWin32EGLNativeDisplayFactory.hpp
-				win32/tcuWin32EGLNativeDisplayFactory.cpp
-				)
-		endif()
 	elseif ((DE_OS_IS_UNIX OR DE_OS_IS_OSX) AND DEQP_USE_X11)
 		set(TCUTIL_PLATFORM_SRCS
 			X11/tcuX11.cpp
@@ -107,10 +104,8 @@
 # Always link to glutil as some platforms such as Win32 always support GL
 target_link_libraries(tcutil-platform glutil)
 
-# Link to eglutil if platform supports EGL
-if (DEQP_SUPPORT_EGL)
-	target_link_libraries(tcutil-platform eglutil eglwrapper)
-endif ()
+# Always link to eglutil
+target_link_libraries(tcutil-platform eglutil)
 
 # X11 libraries
 if (DEQP_USE_X11)
diff --git a/framework/platform/win32/tcuWGL.cpp b/framework/platform/win32/tcuWGL.cpp
index d77cf78..740b430 100644
--- a/framework/platform/win32/tcuWGL.cpp
+++ b/framework/platform/win32/tcuWGL.cpp
@@ -186,7 +186,7 @@
 	: m_library("opengl32.dll")
 {
 	// Temporary 1x1 window for creating context
-	Win32Window tmpWindow(instance, 1, 1);
+	win32::Window tmpWindow(instance, 1, 1);
 
 	// Load WGL core.
 	m_functions.createContext		= (wglCreateContextFunc)		m_library.getFunction("wglCreateContext");
diff --git a/framework/platform/win32/tcuWGLContextFactory.cpp b/framework/platform/win32/tcuWGLContextFactory.cpp
index 253c632..145a55c 100644
--- a/framework/platform/win32/tcuWGLContextFactory.cpp
+++ b/framework/platform/win32/tcuWGLContextFactory.cpp
@@ -34,6 +34,8 @@
 
 namespace tcu
 {
+namespace wgl
+{
 namespace
 {
 
@@ -77,7 +79,7 @@
 
 	glu::ContextType				m_contextType;
 
-	Win32Window						m_window;
+	win32::Window					m_window;
 	wgl::Context*					m_context;
 
 	tcu::RenderTarget				m_renderTarget;
@@ -151,16 +153,17 @@
 
 } // anonymous
 
-WGLContextFactory::WGLContextFactory (HINSTANCE instance)
+ContextFactory::ContextFactory (HINSTANCE instance)
 	: glu::ContextFactory	("wgl", "Windows WGL OpenGL context")
 	, m_instance			(instance)
 	, m_wglCore				(instance)
 {
 }
 
-glu::RenderContext* WGLContextFactory::createContext (const glu::RenderConfig& config, const tcu::CommandLine&) const
+glu::RenderContext* ContextFactory::createContext (const glu::RenderConfig& config, const tcu::CommandLine&) const
 {
 	return new WGLContext(m_instance, m_wglCore, config);
 }
 
+} // wgl
 } // tcu
diff --git a/framework/platform/win32/tcuWGLContextFactory.hpp b/framework/platform/win32/tcuWGLContextFactory.hpp
index 804b74b..b3301e1 100644
--- a/framework/platform/win32/tcuWGLContextFactory.hpp
+++ b/framework/platform/win32/tcuWGLContextFactory.hpp
@@ -29,18 +29,21 @@
 
 namespace tcu
 {
+namespace wgl
+{
 
-class WGLContextFactory : public glu::ContextFactory
+class ContextFactory : public glu::ContextFactory
 {
 public:
-								WGLContextFactory	(HINSTANCE instance);
-	virtual glu::RenderContext*	createContext		(const glu::RenderConfig& config, const tcu::CommandLine& cmdLine) const;
+								ContextFactory	(HINSTANCE instance);
+	virtual glu::RenderContext*	createContext	(const glu::RenderConfig& config, const tcu::CommandLine& cmdLine) const;
 
 private:
-	HINSTANCE					m_instance;
-	wgl::Core					m_wglCore;
+	const HINSTANCE				m_instance;
+	Core						m_wglCore;
 };
 
+} // wgl
 } // tcu
 
 #endif // _TCUWGLCONTEXTFACTORY_HPP
diff --git a/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp b/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp
index 5cd61e8..9c55196 100644
--- a/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp
+++ b/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp
@@ -40,6 +40,8 @@
 
 namespace tcu
 {
+namespace win32
+{
 namespace
 {
 
@@ -127,7 +129,7 @@
 	virtual void					readScreenPixels		(tcu::TextureLevel* dst) const;
 
 private:
-	Win32Window						m_window;
+	win32::Window					m_window;
 	eglu::WindowParams::Visibility	m_curVisibility;
 	deUint64						m_setVisibleTime;		//!< Time window was set visible.
 };
@@ -378,7 +380,7 @@
 
 } // anonymous
 
-Win32EGLNativeDisplayFactory::Win32EGLNativeDisplayFactory (HINSTANCE instance)
+EGLNativeDisplayFactory::EGLNativeDisplayFactory (HINSTANCE instance)
 	: eglu::NativeDisplayFactory	("win32", "Native Win32 Display", DISPLAY_CAPABILITIES)
 	, m_instance					(instance)
 {
@@ -386,14 +388,15 @@
 	m_nativePixmapRegistry.registerFactory(new NativePixmapFactory());
 }
 
-Win32EGLNativeDisplayFactory::~Win32EGLNativeDisplayFactory (void)
+EGLNativeDisplayFactory::~EGLNativeDisplayFactory (void)
 {
 }
 
-eglu::NativeDisplay* Win32EGLNativeDisplayFactory::createDisplay (const EGLAttrib* attribList) const
+eglu::NativeDisplay* EGLNativeDisplayFactory::createDisplay (const EGLAttrib* attribList) const
 {
 	DE_UNREF(attribList);
 	return new NativeDisplay();
 }
 
+} // win32
 } // tcu
diff --git a/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.hpp b/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.hpp
index 78e1000..52b4550 100644
--- a/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.hpp
+++ b/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.hpp
@@ -30,19 +30,22 @@
 
 namespace tcu
 {
+namespace win32
+{
 
-class Win32EGLNativeDisplayFactory : public eglu::NativeDisplayFactory
+class EGLNativeDisplayFactory : public eglu::NativeDisplayFactory
 {
 public:
-									Win32EGLNativeDisplayFactory	(HINSTANCE instance);
-	virtual							~Win32EGLNativeDisplayFactory	(void);
+									EGLNativeDisplayFactory		(HINSTANCE instance);
+	virtual							~EGLNativeDisplayFactory	(void);
 
-	virtual eglu::NativeDisplay*	createDisplay					(const eglw::EGLAttrib* attribList) const;
+	virtual eglu::NativeDisplay*	createDisplay				(const eglw::EGLAttrib* attribList) const;
 
 private:
 	const HINSTANCE					m_instance;
 };
 
+} // win32
 } // tcu
 
 #endif // _TCUWIN32EGLNATIVEDISPLAYFACTORY_HPP
diff --git a/framework/platform/win32/tcuWin32Platform.cpp b/framework/platform/win32/tcuWin32Platform.cpp
index 60dd095..0517c60 100644
--- a/framework/platform/win32/tcuWin32Platform.cpp
+++ b/framework/platform/win32/tcuWin32Platform.cpp
@@ -2,7 +2,7 @@
  * drawElements Quality Program Tester Core
  * ----------------------------------------
  *
- * Copyright 2014 The Android Open Source Project
+ * Copyright 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,194 +21,17 @@
  * \brief Win32 platform port.
  *//*--------------------------------------------------------------------*/
 
-// \todo [2016-01-22 pyry] GetVersionEx() used by getOSInfo() is deprecated.
-//						   Find a way to get version info without using deprecated APIs.
-#pragma warning(disable : 4996)
-
 #include "tcuWin32Platform.hpp"
-#include "tcuWin32Window.hpp"
 #include "tcuWGLContextFactory.hpp"
-#include "tcuFunctionLibrary.hpp"
-#include "tcuFormatUtil.hpp"
-
-#include "vkWsiPlatform.hpp"
-#include "tcuVector.hpp"
-
-#include "deUniquePtr.hpp"
-#include "deMemory.h"
-
-#if defined(DEQP_SUPPORT_EGL)
-#	include "tcuWin32EGLNativeDisplayFactory.hpp"
-#	include "egluGLContextFactory.hpp"
-#endif
+#include "tcuWin32EGLNativeDisplayFactory.hpp"
+#include "egluGLContextFactory.hpp"
 
 namespace tcu
 {
-
-// \todo [2016-02-23 pyry] Move vulkan platform implementation out
-
-using de::MovePtr;
-using de::UniquePtr;
-
-DE_STATIC_ASSERT(sizeof(vk::pt::Win32InstanceHandle)	== sizeof(HINSTANCE));
-DE_STATIC_ASSERT(sizeof(vk::pt::Win32WindowHandle)		== sizeof(HWND));
-
-class VulkanWindow : public vk::wsi::Win32WindowInterface
+namespace win32
 {
-public:
-	VulkanWindow (MovePtr<Win32Window> window)
-		: vk::wsi::Win32WindowInterface	(vk::pt::Win32WindowHandle(window->getHandle()))
-		, m_window						(window)
-	{
-	}
 
-	void resize (const UVec2& newSize)
-	{
-		m_window->setSize((int)newSize.x(), (int)newSize.y());
-	}
-
-private:
-	UniquePtr<Win32Window>	m_window;
-};
-
-class VulkanDisplay : public vk::wsi::Win32DisplayInterface
-{
-public:
-	VulkanDisplay (HINSTANCE instance)
-		: vk::wsi::Win32DisplayInterface	(vk::pt::Win32InstanceHandle(instance))
-	{
-	}
-
-	vk::wsi::Window* createWindow (const Maybe<UVec2>& initialSize) const
-	{
-		const HINSTANCE	instance	= (HINSTANCE)m_native.internal;
-		const deUint32	width		= !initialSize ? 400 : initialSize->x();
-		const deUint32	height		= !initialSize ? 300 : initialSize->y();
-
-		return new VulkanWindow(MovePtr<Win32Window>(new Win32Window(instance, (int)width, (int)height)));
-	}
-};
-
-class VulkanLibrary : public vk::Library
-{
-public:
-	VulkanLibrary (void)
-		: m_library	("vulkan-1.dll")
-		, m_driver	(m_library)
-	{
-	}
-
-	const vk::PlatformInterface& getPlatformInterface (void) const
-	{
-		return m_driver;
-	}
-
-private:
-	const tcu::DynamicFunctionLibrary	m_library;
-	const vk::PlatformDriver			m_driver;
-};
-
-Win32VulkanPlatform::Win32VulkanPlatform (HINSTANCE instance)
-	: m_instance(instance)
-{
-}
-
-Win32VulkanPlatform::~Win32VulkanPlatform (void)
-{
-}
-
-vk::Library* Win32VulkanPlatform::createLibrary (void) const
-{
-	return new VulkanLibrary();
-}
-
-const char* getProductTypeName (WORD productType)
-{
-	switch (productType)
-	{
-		case VER_NT_DOMAIN_CONTROLLER:	return "Windows Server (domain controller)";
-		case VER_NT_SERVER:				return "Windows Server";
-		case VER_NT_WORKSTATION:		return "Windows NT";
-		default:						return DE_NULL;
-	}
-}
-
-static void getOSInfo (std::ostream& dst)
-{
-	OSVERSIONINFOEX	osInfo;
-
-	deMemset(&osInfo, 0, sizeof(osInfo));
-	osInfo.dwOSVersionInfoSize = (DWORD)sizeof(osInfo);
-
-	GetVersionEx((OSVERSIONINFO*)&osInfo);
-
-	{
-		const char* const	productName	= getProductTypeName(osInfo.wProductType);
-
-		if (productName)
-			dst << productName;
-		else
-			dst << "unknown product " << tcu::toHex(osInfo.wProductType);
-	}
-
-	dst << " " << osInfo.dwMajorVersion << "." << osInfo.dwMinorVersion
-		<< ", service pack " << osInfo.wServicePackMajor << "." << osInfo.wServicePackMinor
-		<< ", build " << osInfo.dwBuildNumber;
-}
-
-const char* getProcessorArchitectureName (WORD arch)
-{
-	switch (arch)
-	{
-		case PROCESSOR_ARCHITECTURE_AMD64:		return "AMD64";
-		case PROCESSOR_ARCHITECTURE_ARM:		return "ARM";
-		case PROCESSOR_ARCHITECTURE_IA64:		return "IA64";
-		case PROCESSOR_ARCHITECTURE_INTEL:		return "INTEL";
-		case PROCESSOR_ARCHITECTURE_UNKNOWN:	return "UNKNOWN";
-		default:								return DE_NULL;
-	}
-}
-
-static void getProcessorInfo (std::ostream& dst)
-{
-	SYSTEM_INFO	sysInfo;
-
-	deMemset(&sysInfo, 0, sizeof(sysInfo));
-	GetSystemInfo(&sysInfo);
-
-	dst << "arch ";
-	{
-		const char* const	archName	= getProcessorArchitectureName(sysInfo.wProcessorArchitecture);
-
-		if (archName)
-			dst << archName;
-		else
-			dst << tcu::toHex(sysInfo.wProcessorArchitecture);
-	}
-
-	dst << ", level " << tcu::toHex(sysInfo.wProcessorLevel) << ", revision " << tcu::toHex(sysInfo.wProcessorRevision);
-}
-
-void Win32VulkanPlatform::describePlatform (std::ostream& dst) const
-{
-	dst << "OS: ";
-	getOSInfo(dst);
-	dst << "\n";
-
-	dst << "CPU: ";
-	getProcessorInfo(dst);
-	dst << "\n";
-}
-
-vk::wsi::Display* Win32VulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
-{
-	if (wsiType != vk::wsi::TYPE_WIN32)
-		TCU_THROW(NotSupportedError, "WSI type not supported");
-
-	return new VulkanDisplay(m_instance);
-}
-
-Win32Platform::Win32Platform (void)
+Platform::Platform (void)
 	: m_instance		(GetModuleHandle(NULL))
 	, m_vulkanPlatform	(m_instance)
 {
@@ -216,11 +39,11 @@
 	SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);
 
 	{
-		WGLContextFactory* factory = DE_NULL;
+		wgl::ContextFactory* factory = DE_NULL;
 
 		try
 		{
-			factory = new WGLContextFactory(m_instance);
+			factory = new wgl::ContextFactory(m_instance);
 		}
 		catch (const std::exception& e)
 		{
@@ -241,17 +64,15 @@
 		}
 	}
 
-#if defined(DEQP_SUPPORT_EGL)
-	m_nativeDisplayFactoryRegistry.registerFactory(new Win32EGLNativeDisplayFactory(m_instance));
+	m_nativeDisplayFactoryRegistry.registerFactory(new win32::EGLNativeDisplayFactory(m_instance));
 	m_contextFactoryRegistry.registerFactory(new eglu::GLContextFactory(m_nativeDisplayFactoryRegistry));
-#endif
 }
 
-Win32Platform::~Win32Platform (void)
+Platform::~Platform (void)
 {
 }
 
-bool Win32Platform::processEvents (void)
+bool Platform::processEvents (void)
 {
 	MSG msg;
 	while (PeekMessage(&msg, (HWND)-1, 0, 0, PM_REMOVE))
@@ -263,10 +84,11 @@
 	return true;
 }
 
+} // win32
 } // tcu
 
 // Create platform
 tcu::Platform* createPlatform (void)
 {
-	return new tcu::Win32Platform();
+	return new tcu::win32::Platform();
 }
diff --git a/framework/platform/win32/tcuWin32Platform.hpp b/framework/platform/win32/tcuWin32Platform.hpp
index 1abcc7c..e45b6cc 100644
--- a/framework/platform/win32/tcuWin32Platform.hpp
+++ b/framework/platform/win32/tcuWin32Platform.hpp
@@ -4,7 +4,7 @@
  * drawElements Quality Program Tester Core
  * ----------------------------------------
  *
- * Copyright 2014 The Android Open Source Project
+ * Copyright 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,54 +26,35 @@
 #include "tcuDefs.hpp"
 #include "tcuPlatform.hpp"
 #include "gluPlatform.hpp"
-#include "vkPlatform.hpp"
+#include "egluPlatform.hpp"
+#include "tcuWin32VulkanPlatform.hpp"
 #include "tcuWin32API.h"
 
-#if defined(DEQP_SUPPORT_EGL)
-#	include "egluPlatform.hpp"
-#endif
-
 namespace tcu
 {
+namespace win32
+{
 
-class Win32VulkanPlatform : public vk::Platform
+class Platform : public tcu::Platform, private glu::Platform, private eglu::Platform
 {
 public:
-						Win32VulkanPlatform		(HINSTANCE instance);
-						~Win32VulkanPlatform	(void);
-
-	vk::Library*		createLibrary			(void) const;
-	void				describePlatform		(std::ostream& dst) const;
-	vk::wsi::Display*	createWsiDisplay		(vk::wsi::Type wsiType) const;
-
-private:
-	const HINSTANCE		m_instance;
-};
-
-class Win32Platform : public tcu::Platform, private glu::Platform
-#if defined(DEQP_SUPPORT_EGL)
-	, private eglu::Platform
-#endif
-{
-public:
-								Win32Platform		(void);
-								~Win32Platform		(void);
+								Platform			(void);
+								~Platform			(void);
 
 	bool						processEvents		(void);
 
 	const glu::Platform&		getGLPlatform		(void) const { return static_cast<const glu::Platform&>(*this);	}
 
-#if defined(DEQP_SUPPORT_EGL)
 	const eglu::Platform&		getEGLPlatform		(void) const { return static_cast<const eglu::Platform&>(*this);}
-#endif
 
 	const vk::Platform&			getVulkanPlatform	(void) const { return m_vulkanPlatform;							}
 
 private:
 	const HINSTANCE				m_instance;
-	const Win32VulkanPlatform	m_vulkanPlatform;
+	const VulkanPlatform		m_vulkanPlatform;
 };
 
+} // win32
 } // tcu
 
 #endif // _TCUWIN32PLATFORM_HPP
diff --git a/framework/platform/win32/tcuWin32VulkanPlatform.cpp b/framework/platform/win32/tcuWin32VulkanPlatform.cpp
new file mode 100644
index 0000000..9d33be2
--- /dev/null
+++ b/framework/platform/win32/tcuWin32VulkanPlatform.cpp
@@ -0,0 +1,207 @@
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Tester Core
+ * ----------------------------------------
+ *
+ * Copyright 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Win32 Vulkan platform
+ *//*--------------------------------------------------------------------*/
+
+// \todo [2016-01-22 pyry] GetVersionEx() used by getOSInfo() is deprecated.
+//						   Find a way to get version info without using deprecated APIs.
+#pragma warning(disable : 4996)
+
+#include "tcuWin32VulkanPlatform.hpp"
+#include "tcuWin32Window.hpp"
+
+#include "tcuFormatUtil.hpp"
+#include "tcuFunctionLibrary.hpp"
+#include "tcuVector.hpp"
+
+#include "vkWsiPlatform.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deMemory.h"
+
+namespace tcu
+{
+namespace win32
+{
+
+using de::MovePtr;
+using de::UniquePtr;
+
+DE_STATIC_ASSERT(sizeof(vk::pt::Win32InstanceHandle)	== sizeof(HINSTANCE));
+DE_STATIC_ASSERT(sizeof(vk::pt::Win32WindowHandle)		== sizeof(HWND));
+
+class VulkanWindow : public vk::wsi::Win32WindowInterface
+{
+public:
+	VulkanWindow (MovePtr<win32::Window> window)
+		: vk::wsi::Win32WindowInterface	(vk::pt::Win32WindowHandle(window->getHandle()))
+		, m_window						(window)
+	{
+	}
+
+	void resize (const UVec2& newSize)
+	{
+		m_window->setSize((int)newSize.x(), (int)newSize.y());
+	}
+
+private:
+	UniquePtr<win32::Window>	m_window;
+};
+
+class VulkanDisplay : public vk::wsi::Win32DisplayInterface
+{
+public:
+	VulkanDisplay (HINSTANCE instance)
+		: vk::wsi::Win32DisplayInterface	(vk::pt::Win32InstanceHandle(instance))
+	{
+	}
+
+	vk::wsi::Window* createWindow (const Maybe<UVec2>& initialSize) const
+	{
+		const HINSTANCE	instance	= (HINSTANCE)m_native.internal;
+		const deUint32	width		= !initialSize ? 400 : initialSize->x();
+		const deUint32	height		= !initialSize ? 300 : initialSize->y();
+
+		return new VulkanWindow(MovePtr<win32::Window>(new win32::Window(instance, (int)width, (int)height)));
+	}
+};
+
+class VulkanLibrary : public vk::Library
+{
+public:
+	VulkanLibrary (void)
+		: m_library	("vulkan-1.dll")
+		, m_driver	(m_library)
+	{
+	}
+
+	const vk::PlatformInterface& getPlatformInterface (void) const
+	{
+		return m_driver;
+	}
+
+private:
+	const tcu::DynamicFunctionLibrary	m_library;
+	const vk::PlatformDriver			m_driver;
+};
+
+VulkanPlatform::VulkanPlatform (HINSTANCE instance)
+	: m_instance(instance)
+{
+}
+
+VulkanPlatform::~VulkanPlatform (void)
+{
+}
+
+vk::Library* VulkanPlatform::createLibrary (void) const
+{
+	return new VulkanLibrary();
+}
+
+const char* getProductTypeName (WORD productType)
+{
+	switch (productType)
+	{
+		case VER_NT_DOMAIN_CONTROLLER:	return "Windows Server (domain controller)";
+		case VER_NT_SERVER:				return "Windows Server";
+		case VER_NT_WORKSTATION:		return "Windows NT";
+		default:						return DE_NULL;
+	}
+}
+
+static void getOSInfo (std::ostream& dst)
+{
+	OSVERSIONINFOEX	osInfo;
+
+	deMemset(&osInfo, 0, sizeof(osInfo));
+	osInfo.dwOSVersionInfoSize = (DWORD)sizeof(osInfo);
+
+	GetVersionEx((OSVERSIONINFO*)&osInfo);
+
+	{
+		const char* const	productName	= getProductTypeName(osInfo.wProductType);
+
+		if (productName)
+			dst << productName;
+		else
+			dst << "unknown product " << tcu::toHex(osInfo.wProductType);
+	}
+
+	dst << " " << osInfo.dwMajorVersion << "." << osInfo.dwMinorVersion
+		<< ", service pack " << osInfo.wServicePackMajor << "." << osInfo.wServicePackMinor
+		<< ", build " << osInfo.dwBuildNumber;
+}
+
+const char* getProcessorArchitectureName (WORD arch)
+{
+	switch (arch)
+	{
+		case PROCESSOR_ARCHITECTURE_AMD64:		return "AMD64";
+		case PROCESSOR_ARCHITECTURE_ARM:		return "ARM";
+		case PROCESSOR_ARCHITECTURE_IA64:		return "IA64";
+		case PROCESSOR_ARCHITECTURE_INTEL:		return "INTEL";
+		case PROCESSOR_ARCHITECTURE_UNKNOWN:	return "UNKNOWN";
+		default:								return DE_NULL;
+	}
+}
+
+static void getProcessorInfo (std::ostream& dst)
+{
+	SYSTEM_INFO	sysInfo;
+
+	deMemset(&sysInfo, 0, sizeof(sysInfo));
+	GetSystemInfo(&sysInfo);
+
+	dst << "arch ";
+	{
+		const char* const	archName	= getProcessorArchitectureName(sysInfo.wProcessorArchitecture);
+
+		if (archName)
+			dst << archName;
+		else
+			dst << tcu::toHex(sysInfo.wProcessorArchitecture);
+	}
+
+	dst << ", level " << tcu::toHex(sysInfo.wProcessorLevel) << ", revision " << tcu::toHex(sysInfo.wProcessorRevision);
+}
+
+void VulkanPlatform::describePlatform (std::ostream& dst) const
+{
+	dst << "OS: ";
+	getOSInfo(dst);
+	dst << "\n";
+
+	dst << "CPU: ";
+	getProcessorInfo(dst);
+	dst << "\n";
+}
+
+vk::wsi::Display* VulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
+{
+	if (wsiType != vk::wsi::TYPE_WIN32)
+		TCU_THROW(NotSupportedError, "WSI type not supported");
+
+	return new VulkanDisplay(m_instance);
+}
+
+} // win32
+} // tcu
diff --git a/framework/platform/win32/tcuWin32VulkanPlatform.hpp b/framework/platform/win32/tcuWin32VulkanPlatform.hpp
new file mode 100644
index 0000000..d015abc
--- /dev/null
+++ b/framework/platform/win32/tcuWin32VulkanPlatform.hpp
@@ -0,0 +1,52 @@
+#ifndef _TCUWIN32VULKANPLATFORM_HPP
+#define _TCUWIN32VULKANPLATFORM_HPP
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Tester Core
+ * ----------------------------------------
+ *
+ * Copyright 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Win32 Vulkan platform
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vkPlatform.hpp"
+#include "tcuWin32API.h"
+
+namespace tcu
+{
+namespace win32
+{
+
+class VulkanPlatform : public vk::Platform
+{
+public:
+						VulkanPlatform		(HINSTANCE instance);
+						~VulkanPlatform		(void);
+
+	vk::Library*		createLibrary		(void) const;
+	void				describePlatform	(std::ostream& dst) const;
+	vk::wsi::Display*	createWsiDisplay	(vk::wsi::Type wsiType) const;
+
+private:
+	const HINSTANCE		m_instance;
+};
+
+} // win32
+} // tcu
+
+#endif // _TCUWIN32VULKANPLATFORM_HPP
diff --git a/framework/platform/win32/tcuWin32Window.cpp b/framework/platform/win32/tcuWin32Window.cpp
index 4e674e8..2ab4336 100644
--- a/framework/platform/win32/tcuWin32Window.cpp
+++ b/framework/platform/win32/tcuWin32Window.cpp
@@ -2,7 +2,7 @@
  * drawElements Quality Program Tester Core
  * ----------------------------------------
  *
- * Copyright 2014 The Android Open Source Project
+ * Copyright 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,18 +25,20 @@
 
 namespace tcu
 {
-
-static LRESULT CALLBACK win32WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+namespace win32
 {
-	Win32Window* window = reinterpret_cast<Win32Window*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
+
+static LRESULT CALLBACK windowProcCallback (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	Window* window = reinterpret_cast<Window*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
 	if (window)
 		return window->windowProc(uMsg, wParam, lParam);
 	else
 		return DefWindowProc(hWnd, uMsg, wParam, lParam);
 }
 
-Win32Window::Win32Window (HINSTANCE instance, int width, int height)
-	: m_window		(DE_NULL)
+Window::Window (HINSTANCE instance, int width, int height)
+	: m_window	(DE_NULL)
 {
 	try
 	{
@@ -47,7 +49,7 @@
 			WNDCLASS wndClass;
 			memset(&wndClass, 0, sizeof(wndClass));
 			wndClass.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
-			wndClass.lpfnWndProc	= win32WindowProc;
+			wndClass.lpfnWndProc	= windowProcCallback;
 			wndClass.cbClsExtra		= 0;
 			wndClass.cbWndExtra		= 0;
 			wndClass.hInstance		= instance;
@@ -83,7 +85,7 @@
 	}
 }
 
-Win32Window::~Win32Window (void)
+Window::~Window (void)
 {
 	if (m_window)
 	{
@@ -94,12 +96,12 @@
 	DestroyWindow(m_window);
 }
 
-void Win32Window::setVisible (bool visible)
+void Window::setVisible (bool visible)
 {
 	ShowWindow(m_window, visible ? SW_SHOW : SW_HIDE);
 }
 
-void Win32Window::setSize (int width, int height)
+void Window::setSize (int width, int height)
 {
 	RECT rc;
 
@@ -117,7 +119,7 @@
 		TCU_THROW(TestError, "SetWindowPos() failed");
 }
 
-IVec2 Win32Window::getSize (void) const
+IVec2 Window::getSize (void) const
 {
 	RECT rc;
 	if (!GetClientRect(m_window, &rc))
@@ -127,14 +129,14 @@
 				 rc.bottom - rc.top);
 }
 
-void Win32Window::processEvents (void)
+void Window::processEvents (void)
 {
 	MSG msg;
 	while (PeekMessage(&msg, m_window, 0, 0, PM_REMOVE))
 		DispatchMessage(&msg);
 }
 
-LRESULT Win32Window::windowProc (UINT uMsg, WPARAM wParam, LPARAM lParam)
+LRESULT Window::windowProc (UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
 	switch (uMsg)
 	{
@@ -157,4 +159,5 @@
 	}
 }
 
+} // win32
 } // tcu
diff --git a/framework/platform/win32/tcuWin32Window.hpp b/framework/platform/win32/tcuWin32Window.hpp
index 65aec4e..93a90fe 100644
--- a/framework/platform/win32/tcuWin32Window.hpp
+++ b/framework/platform/win32/tcuWin32Window.hpp
@@ -4,7 +4,7 @@
  * drawElements Quality Program Tester Core
  * ----------------------------------------
  *
- * Copyright 2014 The Android Open Source Project
+ * Copyright 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,27 +29,33 @@
 
 namespace tcu
 {
+namespace win32
+{
 
-class Win32Window
+class Window
 {
 public:
-							Win32Window				(HINSTANCE instance, int width, int height);
-							~Win32Window			(void);
+				Window				(HINSTANCE instance, int width, int height);
+				~Window				(void);
 
-	void					setVisible				(bool visible);
-	void					setSize					(int width, int height);
+	void		setVisible			(bool visible);
+	void		setSize				(int width, int height);
 
-	LRESULT					windowProc				(UINT uMsg, WPARAM wParam, LPARAM lParam);
-	void					processEvents			(void);
+	LRESULT		windowProc			(UINT uMsg, WPARAM wParam, LPARAM lParam);
+	void		processEvents		(void);
 
-	IVec2					getSize					(void) const;
-	HWND					getHandle				(void) const { return m_window;			}
-	HDC						getDeviceContext		(void) const { return GetDC(m_window);	}
+	IVec2		getSize				(void) const;
+	HWND		getHandle			(void) const { return m_window;			}
+	HDC			getDeviceContext	(void) const { return GetDC(m_window);	}
 
 private:
-	HWND					m_window;
+				Window				(const Window&);
+	Window		operator=			(const Window&);
+
+	HWND		m_window;
 };
 
+} // win32
 } // tcu
 
 #endif // _TCUWIN32WINDOW_HPP
diff --git a/modules/gles2/functional/es2fNegativeShaderApiTests.cpp b/modules/gles2/functional/es2fNegativeShaderApiTests.cpp
index 51cffc6..fd2ca94 100644
--- a/modules/gles2/functional/es2fNegativeShaderApiTests.cpp
+++ b/modules/gles2/functional/es2fNegativeShaderApiTests.cpp
@@ -29,6 +29,8 @@
 #include "glwDefs.hpp"
 #include "glwEnums.hpp"
 
+#include "deStringUtil.hpp"
+
 using namespace glw; // GL types
 
 namespace deqp
@@ -986,24 +988,31 @@
 		});
 	ES2F_ADD_API_CASE(uniform_matrixfv_invalid_transpose, "Invalid glUniformMatrix{234}fv() usage",
 		{
-			glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
-			glUseProgram(program.getProgram());
+			if (de::beginsWith((const char*)glGetString(GL_VERSION), "OpenGL ES 2.0 "))
+			{
+				DE_ASSERT(m_context.getRenderContext().getType().getMajorVersion() < 3);
+				DE_ASSERT(m_context.getRenderContext().getType().getMinorVersion() == 0);
+				DE_ASSERT(m_context.getRenderContext().getType().getProfile() == glu::PROFILE_ES);
 
-			m_log << program;
+				glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+				glUseProgram(program.getProgram());
 
-			std::vector<GLfloat> data(16);
+				m_log << program;
 
-			m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if transpose is not GL_FALSE.");
-			glUseProgram(program.getProgram());
-			glUniformMatrix2fv(-1, 1, GL_TRUE, &data[0]);
-			expectError(GL_INVALID_VALUE);
-			glUniformMatrix3fv(-1, 1, GL_TRUE, &data[0]);
-			expectError(GL_INVALID_VALUE);
-			glUniformMatrix4fv(-1, 1, GL_TRUE, &data[0]);
-			expectError(GL_INVALID_VALUE);
-			m_log << tcu::TestLog::EndSection;
+				std::vector<GLfloat> data(16);
 
-			glUseProgram(0);
+				m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if transpose is not GL_FALSE.");
+				glUseProgram(program.getProgram());
+				glUniformMatrix2fv(0, 1, GL_TRUE, &data[0]);
+				expectError(GL_INVALID_VALUE);
+				glUniformMatrix3fv(0, 1, GL_TRUE, &data[0]);
+				expectError(GL_INVALID_VALUE);
+				glUniformMatrix4fv(0, 1, GL_TRUE, &data[0]);
+				expectError(GL_INVALID_VALUE);
+				m_log << tcu::TestLog::EndSection;
+
+				glUseProgram(0);
+			}
 		});
 }
 
