diff --git a/include/polarssl/aesni.h b/include/polarssl/aesni.h
new file mode 100644
index 000000000..9aaeff196
--- /dev/null
+++ b/include/polarssl/aesni.h
@@ -0,0 +1,49 @@
+/**
+ * \file aesni.h
+ *
+ * \brief AES-NI for hardware AES acceleration on some Intel processors
+ *
+ *  Copyright (C) 2013, Brainspark B.V.
+ *
+ *  This file is part of PolarSSL (http://www.polarssl.org)
+ *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
+ *
+ *  All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#ifndef POLARSSL_AESNI_H
+#define POLARSSL_AESNI_H
+
+#include "aes.h"
+
+#if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) &&  \
+    ( defined(__amd64__) || defined(__x86_64__) )   &&  \
+    ! defined(POLARSSL_HAVE_X86_64)
+#define POLARSSL_HAVE_X86_64
+#endif
+
+#if defined(POLARSSL_HAVE_X86_64)
+
+/**
+ * \brief          AES_NI detection routine
+ *
+ * \return         1 if CPU supports AES-NI, 0 otherwise
+ */
+int aesni_supported( void );
+
+#endif /* POLARSSL_HAVE_X86_64 */
+
+#endif /* POLARSSL_AESNI_H */
diff --git a/include/polarssl/config.h b/include/polarssl/config.h
index d98bdb34f..283e294a7 100644
--- a/include/polarssl/config.h
+++ b/include/polarssl/config.h
@@ -874,6 +874,20 @@
  * \{
  */
 
+/**
+ * \def POLARSSL_AESNI_C
+ *
+ * Enable AES-NI support on x86-64.
+ *
+ * Module:  library/aesni.c
+ * Caller:  library/aes.c
+ *
+ * Requires: POLARSSL_HAVE_ASM
+ *
+ * This modules adds support for the AES-NI instructions on x86-64
+ */
+#define POLARSSL_AESNI_C
+
 /**
  * \def POLARSSL_AES_C
  *
@@ -1414,6 +1428,8 @@
  * Module:  library/padlock.c
  * Caller:  library/aes.c
  *
+ * Requires: POLARSSL_HAVE_ASM
+ *
  * This modules adds support for the VIA PadLock on x86.
  */
 #define POLARSSL_PADLOCK_C
@@ -1902,6 +1918,10 @@
 /*
  * Sanity checks on defines and dependencies
  */
+#if defined(POLARSSL_AESNI_C) && !defined(POLARSSL_HAVE_ASM)
+#error "POLARSSL_AESNI_C defined, but not all prerequisites"
+#endif
+
 #if defined(POLARSSL_CERTS_C) && !defined(POLARSSL_PEM_PARSE_C)
 #error "POLARSSL_CERTS_C defined, but not all prerequisites"
 #endif
@@ -2012,6 +2032,10 @@
 #error "POLARSSL_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites"
 #endif
 
+#if defined(POLARSSL_PADLOCK_C) && !defined(POLARSSL_HAVE_ASM)
+#error "POLARSSL_PADLOCK_C defined, but not all prerequisites"
+#endif
+
 #if defined(POLARSSL_PBKDF2_C) && !defined(POLARSSL_MD_C)
 #error "POLARSSL_PBKDF2_C defined, but not all prerequisites"
 #endif
diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt
index 411c07d80..1a5efde1f 100644
--- a/library/CMakeLists.txt
+++ b/library/CMakeLists.txt
@@ -2,6 +2,7 @@ option(USE_SHARED_POLARSSL_LIBRARY "Build PolarSSL as a shared library." OFF)
 
 set(src
      aes.c
+     aesni.c
      arc4.c
      asn1parse.c
      asn1write.c
diff --git a/library/Makefile b/library/Makefile
index a9c86f84c..3f80162b5 100644
--- a/library/Makefile
+++ b/library/Makefile
@@ -34,7 +34,8 @@ DLEXT=dll
 LDFLAGS += -lws2_32
 endif
 
-OBJS=	aes.o		arc4.o		asn1parse.o		\
+OBJS=	aes.o		aesni.o		arc4.o			\
+		asn1parse.o								\
 		asn1write.o base64.o	bignum.o		\
 		blowfish.o	camellia.o					\
 		certs.o		cipher.o	cipher_wrap.o	\
diff --git a/library/aesni.c b/library/aesni.c
new file mode 100644
index 000000000..2882298e0
--- /dev/null
+++ b/library/aesni.c
@@ -0,0 +1,61 @@
+/*
+ *  AES-NI support functions
+ *
+ *  Copyright (C) 2013, Brainspark B.V.
+ *
+ *  This file is part of PolarSSL (http://www.polarssl.org)
+ *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
+ *
+ *  All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/*
+ * [AES-WP] http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set
+ */
+
+#include "polarssl/config.h"
+
+#if defined(POLARSSL_AESNI_C)
+
+#include "polarssl/aesni.h"
+
+#if defined(POLARSSL_HAVE_X86_64)
+
+/*
+ * AES-NI support detection routine, [AES-WP] figure 23
+ */
+int aesni_supported( void )
+{
+    static int supported = -1;
+    unsigned int c;
+
+    if( supported == -1 )
+    {
+        asm( "movl  $1, %%eax   \n"
+             "cpuid             \n"
+             : "=c" (c)
+             :
+             : "eax", "ebx", "edx" );
+        supported = ( ( c & 0x02000000 ) != 0 );
+    }
+
+    return( supported );
+}
+
+#endif /* POLARSSL_HAVE_X86_64 */
+
+#endif /* POLARSSL_AESNI_C */
diff --git a/visualc/VS2010/PolarSSL.vcxproj b/visualc/VS2010/PolarSSL.vcxproj
index 33f00312b..4c067beda 100644
--- a/visualc/VS2010/PolarSSL.vcxproj
+++ b/visualc/VS2010/PolarSSL.vcxproj
@@ -143,6 +143,7 @@
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClInclude Include="..\..\include\polarssl\aes.h" />
+    <ClInclude Include="..\..\include\polarssl\aesni.h" />
     <ClInclude Include="..\..\include\polarssl\arc4.h" />
     <ClInclude Include="..\..\include\polarssl\asn1.h" />
     <ClInclude Include="..\..\include\polarssl\asn1write.h" />
@@ -201,6 +202,7 @@
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\library\aes.c" />
+    <ClCompile Include="..\..\library\aesni.c" />
     <ClCompile Include="..\..\library\arc4.c" />
     <ClCompile Include="..\..\library\asn1parse.c" />
     <ClCompile Include="..\..\library\asn1write.c" />
diff --git a/visualc/VS6/polarssl.dsp b/visualc/VS6/polarssl.dsp
index c40b75b18..b6a82c0b9 100644
--- a/visualc/VS6/polarssl.dsp
+++ b/visualc/VS6/polarssl.dsp
@@ -89,6 +89,10 @@ SOURCE=..\..\library\aes.c
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\library\aesni.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\library\arc4.c
 # End Source File
 # Begin Source File
@@ -349,6 +353,10 @@ SOURCE=..\..\include\polarssl\aes.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\polarssl\aesni.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\polarssl\arc4.h
 # End Source File
 # Begin Source File