diff --git a/.travis-deps.sh b/.travis-deps.sh
index 84bddb304d..b8e8417b26 100644
--- a/.travis-deps.sh
+++ b/.travis-deps.sh
@@ -8,10 +8,16 @@ if [ "$TRAVIS_OS_NAME" = linux -o -z "$TRAVIS_OS_NAME" ]; then
     sudo apt-get -qq update
     sudo apt-get -qq install g++-4.8 xorg-dev libglu1-mesa-dev libxcursor-dev
     sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90
-    git clone https://github.com/glfw/glfw.git
-    mkdir glfw/build && cd glfw/build
-    cmake .. && make && sudo make install 
-    cd -	
+    (
+        git clone https://github.com/glfw/glfw.git --branch 3.0.4 --depth 1
+        mkdir glfw/build && cd glfw/build
+        cmake .. && make -j2 && sudo make install
+    )
+
+    sudo apt-get install lib32stdc++6
+    sudo mkdir -p /usr/local
+    curl http://www.cmake.org/files/v2.8/cmake-2.8.11-Linux-i386.tar.gz \
+        | sudo tar -xz -C /usr/local --strip-components=1
 elif [ "$TRAVIS_OS_NAME" = osx ]; then
     brew tap homebrew/versions
     brew install qt5 glfw3 pkgconfig
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3461d1555e..e1614cd4a6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,78 +1,131 @@
-cmake_minimum_required(VERSION 2.8.7)
+# CMake 2.8.11 required for Qt5 settings to be applied automatically on
+# dependent libraries.
+cmake_minimum_required(VERSION 2.8.11)
 
 project(citra)
 
-SET(CXX_COMPILE_FLAGS "-std=c++11")
-
-# silence some spam
-add_definitions(-Wno-attributes)
+if (NOT MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wno-attributes")
+else()
+    # Silence deprecation warnings
+    add_definitions(/D_CRT_SECURE_NO_WARNINGS)
+endif()
 add_definitions(-DSINGLETHREADED)
-add_definitions(${CXX_COMPILE_FLAGS})
 
 find_package(PNG)
 if (PNG_FOUND)
     add_definitions(-DHAVE_PNG)
 endif ()
 
-# dependency checking
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules/")
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeTests)
-include(FindX11 REQUIRED)
-find_package(PkgConfig REQUIRED)
+# Include bundled CMake modules
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/externals/cmake-modules")
+
 find_package(OpenGL REQUIRED)
-pkg_search_module(GLFW REQUIRED glfw3)
-
-# corefoundation is required only on OSX
-IF (APPLE)
-    FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation)
-	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
-	SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
-ENDIF (APPLE)
-
-#external includes
-include_directories(${GLFW_INCLUDE_DIRS})
 include_directories(${OPENGL_INCLUDE_DIR})
 
-# workaround for GLFW linking on OSX
-link_directories(${GLFW_LIBRARY_DIRS})
+option(ENABLE_GLFW "Enable the GLFW frontend" ON)
+if (ENABLE_GLFW)
+    if (WIN32)
+        # Detect toolchain and platform
+        if (MSVC)
+            if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+                set(TMP_ARCH "x64")
+            else()
+                set(TMP_ARCH "Win32")
+            endif()
 
-option(DISABLE_QT "Disable Qt GUI" OFF)
-option(USE_QT5 "Use Qt5 when available" ON)
-if (NOT DISABLE_QT)
-    if(USE_QT5)
-        find_package(Qt5Gui)
-        find_package(Qt5Widgets)
-        find_package(Qt5OpenGL)
-        if(NOT Qt5Gui_FOUND OR NOT Qt5Widgets_FOUND OR NOT Qt5OpenGL_FOUND)
-            message("Qt5 libraries not found! Using Qt4 instead.")
-            set(USE_QT5 OFF)
-        endif()
-    endif()
-    if(NOT USE_QT5)
-        include(FindQt4)
-        find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL)
+            if (MSVC11) # Visual C++ 2012
+                set(TMP_TOOLSET "v110")
+            elseif (MSVC12) # Visual C++ 2013
+                set(TMP_TOOLSET "v120")
+            else()
+                set(TMP_TOOLSET "UNSUPPORTED")
+                message(SEND_ERROR "We don't supply GLFW binaries for your version of MSVC, you might have to provide them yourself.")
+            endif()
 
-        if(QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND AND QT_QTOPENGL_FOUND)
-            include(${QT_USE_FILE})
-            include_directories(${QT_INCLUDES})
+            set(TMP_TOOLSET "msvc_${TMP_TOOLSET}-${TMP_ARCH}")
         else()
-            message("Qt4 libraries not found! Disabling Qt GUI")
-            set(DISABLE_QT ON)
+            # Assume mingw
+            if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+                set(TMP_ARCH "x86_64")
+            else()
+                set(TMP_ARCH "i686")
+            endif()
+
+            set(TMP_TOOLSET "mingw-${TMP_ARCH}")
         endif()
+
+        set(GLFW_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/glfw-3.0.4.bin")
+        set(GLFW_INCLUDE_DIRS "${GLFW_PREFIX}/include" CACHE PATH "Path to GLFW3 headers")
+        set(GLFW_LIBRARY_DIRS "${GLFW_PREFIX}/lib-${TMP_TOOLSET}" CACHE PATH "Path to GLFW3 libraries")
+
+        # Clean up after ourselves
+        unset(TMP_TOOLSET)
+        unset(TMP_ARCH)
+
+        set(GLFW_LIBRARIES glfw3)
+    else()
+        find_package(X11 REQUIRED)
+        find_package(PkgConfig REQUIRED)
+        pkg_search_module(GLFW REQUIRED glfw3)
+    endif()
+
+    include_directories(${GLFW_INCLUDE_DIRS})
+    link_directories(${GLFW_LIBRARY_DIRS})
+endif()
+
+IF (APPLE)
+    # CoreFoundation is required only on OSX
+    FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
+ENDIF (APPLE)
+
+option(ENABLE_QT "Enable the Qt frontend" ON)
+option(CITRA_FORCE_QT4 "Use Qt4 even if Qt5 is available." OFF)
+if (ENABLE_QT)
+    # Set CMAKE_PREFIX_PATH if QTDIR is defined in the environment This allows CMake to
+    # automatically find the Qt packages on Windows
+    if (DEFINED ENV{QTDIR})
+        list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}")
+    endif()
+
+    if (NOT CITRA_FORCE_QT4)
+        find_package(Qt5 COMPONENTS Widgets OpenGL)
+        set(CITRA_QT_LIBS Qt5::Widgets Qt5::OpenGL)
+    endif()
+
+    if (CITRA_FORCE_QT4 OR NOT Qt5_FOUND)
+        # Try to fallback to Qt4
+        find_package(Qt4 REQUIRED COMPONENTS QtGui QtOpenGL)
+        set(CITRA_QT_LIBS Qt4::QtGui Qt4::QtOpenGL)
     endif()
 endif()
 
+# This function should be passed a list of all files in a target. It will automatically generate
+# file groups following the directory hierarchy, so that the layout of the files in IDEs matches the
+# one in the filesystem.
+function(create_directory_groups)
+    # Place any files that aren't in the source list in a separate group so that they don't get in
+    # the way.
+    source_group("Other Files" REGULAR_EXPRESSION ".")
+
+    foreach(file_name ${ARGV})
+        get_filename_component(dir_name "${file_name}" PATH)
+        # Group names use '\' as a separator even though the entire rest of CMake uses '/'...
+        string(REPLACE "/" "\\" group_name "${dir_name}")
+        source_group("${group_name}" FILES "${file_name}")
+    endforeach()
+endfunction()
+
 # generate git revision information
 include(GetGitRevisionDescription)
 get_git_head_revision(GIT_REF_SPEC GIT_REV)
 git_describe(GIT_DESC --always --long --dirty)
 git_branch_name(GIT_BRANCH)
-    
-# internal includes
-include_directories(src)
 
 # process subdirectories
-if(NOT DISABLE_QT)
+if(ENABLE_QT)
     include_directories(externals/qhexedit)
     add_subdirectory(externals/qhexedit)
 endif()
diff --git a/externals/qhexedit/CMakeLists.txt b/externals/qhexedit/CMakeLists.txt
index b1f631f959..e7470dfe42 100644
--- a/externals/qhexedit/CMakeLists.txt
+++ b/externals/qhexedit/CMakeLists.txt
@@ -5,14 +5,17 @@ set(SRCS
             commands.cpp
             qhexedit.cpp
             qhexedit_p.cpp
-            xbytearray.cpp)
+            xbytearray.cpp
+            )
 
 set(HEADERS
+            commands.h
             qhexedit.h
-            qhexedit_p.h)
+            qhexedit_p.h
+            xbytearray.h
+            )
+
+create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(qhexedit STATIC ${SRCS} ${HEADERS})
-if(USE_QT5)
-    target_link_libraries(qhexedit Qt5::Core Qt5::Widgets)
-endif()
-
+target_link_libraries(qhexedit ${CITRA_QT_LIBS})
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e0227dc535..cb09f3cd1d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,9 +1,12 @@
+# Enable modules to include each other's files
+include_directories(.)
+
 add_subdirectory(common)
 add_subdirectory(core)
 add_subdirectory(video_core)
-add_subdirectory(citra)
-add_subdirectory(citra_qt)
-
-if(QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND AND QT_QTOPENGL_FOUND AND NOT DISABLE_QT4)
-    #add_subdirectory(citra_qt)
+if (ENABLE_GLFW)
+    add_subdirectory(citra)
+endif()
+if (ENABLE_QT)
+    add_subdirectory(citra_qt)
 endif()
diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt
index bd6c4a1a81..f10f3e603e 100644
--- a/src/citra/CMakeLists.txt
+++ b/src/citra/CMakeLists.txt
@@ -1,6 +1,13 @@
-set(SRCS    citra.cpp
-            emu_window/emu_window_glfw.cpp)
-set(HEADERS resource.h)
+set(SRCS
+            emu_window/emu_window_glfw.cpp
+            citra.cpp
+            )
+set(HEADERS
+            emu_window/emu_window_glfw.h
+            resource.h
+            )
+
+create_directory_groups(${SRCS} ${HEADERS})
 
 # NOTE: This is a workaround for CMake bug 0006976 (missing X11_xf86vmode_LIB variable)
 if (NOT X11_xf86vmode_LIB)
@@ -8,11 +15,16 @@ if (NOT X11_xf86vmode_LIB)
 endif()
 
 add_executable(citra ${SRCS} ${HEADERS})
+target_link_libraries(citra core common video_core)
+target_link_libraries(citra ${OPENGL_gl_LIBRARY} ${GLFW_LIBRARIES})
 
 if (APPLE)
-    target_link_libraries(citra core common video_core iconv pthread ${COREFOUNDATION_LIBRARY} ${OPENGL_LIBRARIES} ${GLFW_LIBRARIES})
-else()
-    target_link_libraries(citra core common video_core pthread X11 Xxf86vm Xi Xcursor ${OPENGL_LIBRARIES} ${GLFW_LIBRARIES} rt ${X11_Xrandr_LIB} ${X11_xv86vmode_LIB} ${PNG_LIBRARIES})
+    target_link_libraries(citra iconv pthread ${COREFOUNDATION_LIBRARY})
+elseif (WIN32)
+    target_link_libraries(citra winmm)
+else() # Unix
+    target_link_libraries(citra pthread rt)
+    target_link_libraries(citra ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_Xcursor_LIB} ${X11_Xrandr_LIB} ${X11_xv86vmode_LIB})
 endif()
 
 #install(TARGETS citra RUNTIME DESTINATION ${bindir})
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index 055a585a01..426e4ef993 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -2,54 +2,61 @@ set(CMAKE_AUTOMOC ON)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 set(SRCS
-            bootmanager.cpp
+            config/controller_config.cpp
+            config/controller_config_util.cpp
             debugger/callstack.cpp
             debugger/disassembler.cpp
             debugger/graphics.cpp
             debugger/graphics_cmdlists.cpp
             debugger/ramview.cpp
             debugger/registers.cpp
+            bootmanager.cpp
             hotkeys.cpp
             main.cpp
-            config/controller_config.cpp
-            config/controller_config_util.cpp)
+            )
 
 set(HEADERS
-            bootmanager.hxx
+            config/controller_config.hxx
+            config/controller_config_util.hxx
             debugger/callstack.hxx
             debugger/disassembler.hxx
+            debugger/graphics.hxx
+            debugger/graphics_cmdlists.hxx
             debugger/ramview.hxx
             debugger/registers.hxx
+            bootmanager.hxx
             hotkeys.hxx
             main.hxx
             version.h
-            config/controller_config.hxx
-            config/controller_config_util.hxx)
+            )
 
 set(UIS
+            config/controller_config.ui
             debugger/callstack.ui
             debugger/disassembler.ui
             debugger/registers.ui
             hotkeys.ui
             main.ui
-            config/controller_config.ui)
+            )
 
-if(USE_QT5)
+create_directory_groups(${SRCS} ${HEADERS} ${UIS})
+
+if (Qt5_FOUND)
     qt5_wrap_ui(UI_HDRS ${UIS})
 else()
     qt4_wrap_ui(UI_HDRS ${UIS})
 endif()
 
 add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS})
-if(APPLE)
-	set(ICONV_LIBRARY iconv)
-else()
-	set(RT_LIBRARY rt)
-endif()
+target_link_libraries(citra-qt core common video_core qhexedit)
+target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS})
 
-target_link_libraries(citra-qt core common video_core qhexedit ${ICONV_LIBRARY} ${COREFOUNDATION_LIBRARY} ${QT_LIBRARIES} ${OPENGL_LIBRARIES} ${RT_LIBRARY} ${PNG_LIBRARIES})
-if(USE_QT5)
-    target_link_libraries(citra-qt Qt5::Gui Qt5::Widgets Qt5::OpenGL)
+if (APPLE)
+    target_link_libraries(citra-qt iconv ${COREFOUNDATION_LIBRARY})
+elseif (WIN32)
+    target_link_libraries(citra-qt winmm)
+else() # Unix
+    target_link_libraries(citra-qt rt)
 endif()
 
 #install(TARGETS citra-qt RUNTIME DESTINATION ${bindir})
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index aae1833939..f8a55c2a7f 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -1,6 +1,8 @@
+# Generate cpp with Git revision from template
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scm_rev.cpp.in" "${CMAKE_CURRENT_SOURCE_DIR}/scm_rev.cpp" @ONLY)
 
-set(SRCS    break_points.cpp
+set(SRCS
+            break_points.cpp
             console_listener.cpp
             extended_trace.cpp
             file_search.cpp
@@ -12,23 +14,25 @@ set(SRCS    break_points.cpp
             memory_util.cpp
             misc.cpp
             msg_handler.cpp
-            string_util.cpp
             scm_rev.cpp
+            string_util.cpp
             symbols.cpp
             thread.cpp
             timer.cpp
-            utf8.cpp)
+            utf8.cpp
+            )
 
-set(HEADERS atomic.h
+set(HEADERS
+            atomic.h
             atomic_gcc.h
             atomic_win32.h
             bit_field.h
             break_points.h
             chunk_file.h
+            common.h
             common_funcs.h
             common_paths.h
             common_types.h
-            common.h
             console_listener.h
             cpu_detect.h
             debug_interface.h
@@ -37,10 +41,11 @@ set(HEADERS atomic.h
             fifo_queue.h
             file_search.h
             file_util.h
+            fixed_size_queue.h
             hash.h
             linear_disk_cache.h
-            log_manager.h
             log.h
+            log_manager.h
             math_util.h
             mem_arena.h
             memory_util.h
@@ -54,8 +59,12 @@ set(HEADERS atomic.h
             swap.h
             symbols.h
             thread.h
+            thread_queue_list.h
             thunk.h
             timer.h
-            utf8.h)
+            utf8.h
+            )
+
+create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(common STATIC ${SRCS} ${HEADERS})
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 207f39707c..1f358ec8db 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -1,14 +1,18 @@
-set(SRCS    core.cpp
-            core_timing.cpp
-            loader/elf.cpp
-            loader/loader.cpp
-            loader/ncch.cpp
-            mem_map.cpp
-            mem_map_funcs.cpp
-            system.cpp
+set(SRCS
             arm/disassembler/arm_disasm.cpp
             arm/disassembler/load_symbol_map.cpp
-            file_sys/archive_romfs.cpp
+            arm/interpreter/mmu/arm1176jzf_s_mmu.cpp
+            arm/interpreter/mmu/cache.cpp
+            arm/interpreter/mmu/maverick.cpp
+            arm/interpreter/mmu/rb.cpp
+            arm/interpreter/mmu/sa_mmu.cpp
+            arm/interpreter/mmu/tlb.cpp
+            arm/interpreter/mmu/wb.cpp
+            arm/interpreter/mmu/xscale_copro.cpp
+            arm/interpreter/vfp/vfp.cpp
+            arm/interpreter/vfp/vfpdouble.cpp
+            arm/interpreter/vfp/vfpinstr.cpp
+            arm/interpreter/vfp/vfpsingle.cpp
             arm/interpreter/arm_interpreter.cpp
             arm/interpreter/armcopro.cpp
             arm/interpreter/armemu.cpp
@@ -18,22 +22,7 @@ set(SRCS    core.cpp
             arm/interpreter/armsupp.cpp
             arm/interpreter/armvirt.cpp
             arm/interpreter/thumbemu.cpp
-            arm/interpreter/vfp/vfp.cpp
-            arm/interpreter/vfp/vfpdouble.cpp
-            arm/interpreter/vfp/vfpinstr.cpp
-            arm/interpreter/vfp/vfpsingle.cpp
-            arm/interpreter/mmu/arm1176jzf_s_mmu.cpp
-            arm/interpreter/mmu/cache.cpp
-            arm/interpreter/mmu/maverick.cpp
-            arm/interpreter/mmu/rb.cpp
-            arm/interpreter/mmu/sa_mmu.cpp
-            arm/interpreter/mmu/tlb.cpp
-            arm/interpreter/mmu/wb.cpp
-            arm/interpreter/mmu/xscale_copro.cpp
-            hle/hle.cpp
-            hle/config_mem.cpp
-            hle/coprocessor.cpp
-            hle/svc.cpp
+            file_sys/archive_romfs.cpp
             hle/kernel/address_arbiter.cpp
             hle/kernel/archive.cpp
             hle/kernel/event.cpp
@@ -48,27 +37,26 @@ set(SRCS    core.cpp
             hle/service/ndm.cpp
             hle/service/service.cpp
             hle/service/srv.cpp
+            hle/config_mem.cpp
+            hle/coprocessor.cpp
+            hle/hle.cpp
+            hle/svc.cpp
             hw/gpu.cpp
             hw/hw.cpp
-            hw/ndma.cpp)
+            hw/ndma.cpp
+            loader/elf.cpp
+            loader/loader.cpp
+            loader/ncch.cpp
+            core.cpp
+            core_timing.cpp
+            mem_map.cpp
+            mem_map_funcs.cpp
+            system.cpp
+            )
 
-set(HEADERS core.h
-            core_timing.h
-            loader/elf.h
-            loader/loader.h
-            loader/ncch.h
-            mem_map.h
-            system.h
+set(HEADERS
             arm/disassembler/arm_disasm.h
             arm/disassembler/load_symbol_map.h
-            arm/interpreter/arm_interpreter.h
-            arm/interpreter/arm_regformat.h
-            arm/interpreter/armcpu.h
-            arm/interpreter/armdefs.h
-            arm/interpreter/armemu.h
-            arm/interpreter/armmmu.h
-            arm/interpreter/armos.h
-            arm/interpreter/skyeye_defs.h
             arm/interpreter/mmu/arm1176jzf_s_mmu.h
             arm/interpreter/mmu/cache.h
             arm/interpreter/mmu/rb.h
@@ -78,27 +66,48 @@ set(HEADERS core.h
             arm/interpreter/vfp/asm_vfp.h
             arm/interpreter/vfp/vfp.h
             arm/interpreter/vfp/vfp_helper.h
+            arm/interpreter/arm_interpreter.h
+            arm/interpreter/arm_regformat.h
+            arm/interpreter/armcpu.h
+            arm/interpreter/armdefs.h
+            arm/interpreter/armemu.h
+            arm/interpreter/armmmu.h
+            arm/interpreter/armos.h
+            arm/interpreter/skyeye_defs.h
+            arm/arm_interface.h
             file_sys/archive.h
             file_sys/archive_romfs.h
-            hle/config_mem.h
-            hle/coprocessor.h
-            hle/hle.h
-            hle/svc.h
             hle/kernel/address_arbiter.h
             hle/kernel/archive.h
+            hle/kernel/event.h
             hle/kernel/kernel.h
             hle/kernel/mutex.h
             hle/kernel/shared_memory.h
             hle/kernel/thread.h
-            hle/function_wrappers.h
             hle/service/apt.h
             hle/service/fs.h
             hle/service/gsp.h
             hle/service/hid.h
+            hle/service/ndm.h
             hle/service/service.h
             hle/service/srv.h
+            hle/config_mem.h
+            hle/coprocessor.h
+            hle/function_wrappers.h
+            hle/hle.h
+            hle/svc.h
             hw/gpu.h
             hw/hw.h
-            hw/ndma.h)
+            hw/ndma.h
+            loader/elf.h
+            loader/loader.h
+            loader/ncch.h
+            core.h
+            core_timing.h
+            mem_map.h
+            system.h
+            )
+
+create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(core STATIC ${SRCS} ${HEADERS})
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index 48c5d1424f..13c3f7b228 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -1,29 +1,42 @@
-set(SRCS    clipper.cpp
+set(SRCS
+            renderer_opengl/generated/gl_3_2_core.c
+            renderer_opengl/renderer_opengl.cpp
+            renderer_opengl/gl_shader_util.cpp
+            debug_utils/debug_utils.cpp
+            clipper.cpp
             command_processor.cpp
             primitive_assembly.cpp
             rasterizer.cpp
             utils.cpp
             vertex_shader.cpp
             video_core.cpp
-            renderer_opengl/generated/gl_3_2_core.c
-            renderer_opengl/renderer_opengl.cpp
-            renderer_opengl/gl_shader_util.cpp
-            debug_utils/debug_utils.cpp)
+            )
 
-set(HEADERS clipper.h
-            command_processor.h
-            math.h
-            primitive_assembly.h
-            rasterizer.h
-            utils.h
-            video_core.h
-            renderer_base.h
-            vertex_shader.h
-            video_core.h
+set(HEADERS
+            debug_utils/debug_utils.h
             renderer_opengl/generated/gl_3_2_core.h
-            renderer_opengl/renderer_opengl.h
             renderer_opengl/gl_shader_util.h
             renderer_opengl/gl_shaders.h
-            debug_utils/debug_utils.h)
+            renderer_opengl/renderer_opengl.h
+            clipper.h
+            command_processor.h
+            gpu_debugger.h
+            math.h
+            pica.h
+            primitive_assembly.h
+            rasterizer.h
+            renderer_base.h
+            utils.h
+            vertex_shader.h
+            video_core.h
+            )
+
+create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(video_core STATIC ${SRCS} ${HEADERS})
+
+if (PNG_FOUND)
+    target_link_libraries(video_core ${PNG_LIBRARIES})
+    include_directories(${PNG_INCLUDE_DIRS})
+    add_definitions(${PNG_DEFINITIONS})
+endif()