diff -Nur a/core/khronos/GL3/gl3w.c b/core/khronos/GL3/gl3w.c
--- a/core/khronos/GL3/gl3w.c	2015-10-06 21:43:53.040336386 -0300
+++ b/core/khronos/GL3/gl3w.c	2015-10-06 22:04:39.682388782 -0300
@@ -1,6 +1,25 @@
 #include <GL3/gl3w.h>
 
-#ifdef _WIN32
+#if defined(USE_SDL2)
+	#include <SDL2/SDL.h>
+	static void open_libgl(void)
+	{
+		SDL_GL_LoadLibrary(NULL);
+	}
+
+	static void close_libgl(void)
+	{
+		SDL_GL_UnloadLibrary();
+	}
+
+	static void *get_proc(const char *proc)
+	{
+		void *res = NULL;
+		res = (void*)SDL_GL_GetProcAddress(proc);
+		return res;
+	}
+
+#elif defined(_WIN32)
 #define WIN32_LEAN_AND_MEAN 1
 #include <windows.h>
 
diff -Nur a/core/sdl/sdl.cpp b/core/sdl/sdl.cpp
--- a/core/sdl/sdl.cpp	2015-10-06 21:43:53.048336444 -0300
+++ b/core/sdl/sdl.cpp	2015-10-06 22:04:39.683388790 -0300
@@ -5,6 +5,18 @@
 #include "sdl/sdl.h"
 #ifdef GLES
 	#include <EGL/egl.h>
+#else
+	#ifndef USE_SDL2
+		#error "Our SDL1.2 implementation only supports GLES. You need SDL2 for OpenGL 3 support!"
+	#endif
+	#include "khronos/GL3/gl3w.h"
+#endif
+
+#ifdef USE_SDL2
+	static SDL_Window* window = NULL;
+	static SDL_GLContext glcontext;
+#else
+	SDL_Surface *screen = NULL;
 #endif
 
 #ifdef TARGET_PANDORA
@@ -14,8 +26,6 @@
 #endif
 #define WINDOW_HEIGHT  480
 
-SDL_Surface *screen = NULL;
-
 static SDL_Joystick *JoySDL = 0;
 
 extern bool FrameSkipping;
@@ -80,11 +90,15 @@
 
 		AxisCount = SDL_JoystickNumAxes(JoySDL);
 		ButtonCount = SDL_JoystickNumButtons(JoySDL);
-		Name = SDL_JoystickName(0);
-		
+		#ifdef USE_SDL2
+			Name = SDL_JoystickName(JoySDL);
+		#else
+			Name = SDL_JoystickName(0);
+		#endif
+
 		printf("SDK: Found '%s' joystick with %d axes and %d buttons\n", Name, AxisCount, ButtonCount);
 
-		if (strcmp(Name,"Microsoft X-Box 360 pad")==0)
+		if (Name != NULL && strcmp(Name,"Microsoft X-Box 360 pad")==0)
 		{
 			sdl_map_btn  = sdl_map_btn_xbox360;
 			sdl_map_axis = sdl_map_axis_xbox360;
@@ -113,12 +127,16 @@
 		}
 	#endif
 	
-	SDL_ShowCursor(0);
+	#ifndef USE_SDL2
+		SDL_ShowCursor(0);
 
-	if (SDL_WM_GrabInput( SDL_GRAB_ON ) != SDL_GRAB_ON)
-	{
-		printf("SDK: Error while grabbing mouse\n");
-	}
+		if (SDL_WM_GrabInput( SDL_GRAB_ON ) != SDL_GRAB_ON)
+		{
+			printf("SDL: Error while grabbing mouse\n");
+		}
+	#else
+		SDL_SetRelativeMouseMode(SDL_TRUE);
+	#endif
 }
 
 void input_sdl_handle(u32 port)
@@ -397,7 +415,14 @@
 	#ifdef TARGET_PANDORA
 		strncpy(OSD_Counters, text, 256);
 	#else
-		SDL_WM_SetCaption(text, NULL);    // *TODO*  Set Icon also...
+		#ifdef USE_SDL2
+			if(window)
+			{
+				SDL_SetWindowTitle(window, text);    // *TODO*  Set Icon also...
+			}
+		#else
+			SDL_WM_SetCaption(text, NULL);
+		#endif
 	#endif
 }
 
@@ -415,17 +440,79 @@
 
 	int window_width  = cfgLoadInt("x11","width", WINDOW_WIDTH);
 	int window_height = cfgLoadInt("x11","height", WINDOW_HEIGHT);
+
 	#ifdef TARGET_PANDORA
 		int flags = SDL_FULLSCREEN;
 	#else
 		int flags = SDL_SWSURFACE;
 	#endif
-	screen = SDL_SetVideoMode(window_width, window_height, 0, flags);
-	if (!screen)
-	{
-		die("error creating SDL screen");
-	}
-	x11_disp = EGL_DEFAULT_DISPLAY;
-	printf("Created SDL Windows (%ix%i) successfully\n", window_width, window_height);
+
+	#if !defined(GLES) && defined(USE_SDL2)
+		flags |= SDL_WINDOW_OPENGL;
+
+		SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
+		SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
+		SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
+		SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
+		SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
+		SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
+		SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
+		SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
+		SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
+		SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+
+		window = SDL_CreateWindow("Reicast Emulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,	window_width, window_height, flags);
+		if (!window)
+		{
+			die("error creating SDL window");
+		}
+
+		glcontext = SDL_GL_CreateContext(window);
+		if (!glcontext)
+		{
+			die("Error creating SDL GL context");
+		}
+		SDL_GL_MakeCurrent(window, NULL);
+	#else
+		screen = SDL_SetVideoMode(window_width, window_height, 0, flags);
+		if (!screen)
+		{
+			die("error creating SDL screen");
+		}
+
+		x11_disp = EGL_DEFAULT_DISPLAY;
+	#endif
+
+	printf("Created SDL Window (%ix%i) and GL Context successfully\n", window_width, window_height);
 }
 #endif
+
+#if !defined(GLES) && defined(USE_SDL2)
+	extern int screen_width, screen_height;
+
+	bool gl_init(void* wind, void* disp)
+	{
+		SDL_GL_MakeCurrent(window, glcontext);
+		return gl3wInit() != -1 && gl3wIsSupported(3, 1);
+	}
+
+	void gl_swap()
+	{
+		SDL_GL_SwapWindow(window);
+
+		/* Check if drawable has been resized */
+		int new_width, new_height;
+		SDL_GL_GetDrawableSize(window, &new_width, &new_height);
+
+		if (new_width != screen_width || new_height != screen_height)
+		{
+			screen_width = new_width;
+			screen_height = new_height;
+		}
+	}
+
+	void gl_term()
+	{
+		SDL_GL_DeleteContext(glcontext);
+	}
+#endif
\ No newline at end of file
diff -Nur a/core/sdl/sdl.h b/core/sdl/sdl.h
--- a/core/sdl/sdl.h	2015-10-06 21:43:53.048336444 -0300
+++ b/core/sdl/sdl.h	2015-10-06 22:04:39.683388790 -0300
@@ -1,5 +1,9 @@
 #pragma once
-#include <SDL/SDL.h>
+#ifdef USE_SDL2
+	#include <SDL2/SDL.h>
+#else
+	#include <SDL/SDL.h>
+#endif
 extern void* sdl_glc;
 extern void input_sdl_init();
 extern void input_sdl_handle(u32 port);
diff -Nur a/shell/linux/Makefile b/shell/linux/Makefile
--- a/shell/linux/Makefile	2015-10-06 21:43:53.161337253 -0300
+++ b/shell/linux/Makefile	2015-10-06 22:04:39.683388790 -0300
@@ -175,6 +175,10 @@
     $(error Unknown platform)
 endif
 
+ifdef USE_SDL2
+    USE_SDL := 1
+endif
+
 RZDCY_SRC_DIR = ../../core
 include $(RZDCY_SRC_DIR)/core.mk
 
@@ -202,8 +206,14 @@
 endif
 
 ifdef USE_SDL
-    CXXFLAGS += `sdl-config --cflags` -D USE_SDL
-    LIBS += `sdl-config --libs`
+    CXXFLAGS += -D USE_SDL
+    ifdef USE_SDL2
+        CXXFLAGS += `sdl2-config --cflags` -D USE_SDL2
+        LIBS += `sdl2-config --libs`
+    else
+        CXXFLAGS += `sdl-config --cflags`
+        LIBS += `sdl-config --libs`
+    endif
 endif
 
 ifdef PGO_MAKE