diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt
index 4511e4358d..dca4bd76b5 100644
--- a/3rdparty/CMakeLists.txt
+++ b/3rdparty/CMakeLists.txt
@@ -1,6 +1,11 @@
+list (APPEND thirdparty_src)
+list (APPEND thirdparty_lib)
+list (APPEND thirdparty_inc)
+list (APPEND thirdparty_def)
+
 add_subdirectory(everest)
 
-set(src_thirdparty
-  ${src_everest}
-  PARENT_SCOPE
-)
+set(thirdparty_src ${thirdparty_src} PARENT_SCOPE)
+set(thirdparty_lib ${thirdparty_lib} PARENT_SCOPE)
+set(thirdparty_inc ${thirdparty_inc} PARENT_SCOPE)
+set(thirdparty_def ${thirdparty_def} PARENT_SCOPE)
diff --git a/3rdparty/everest/CMakeLists.txt b/3rdparty/everest/CMakeLists.txt
index 84e2763c8b..5b0a078dd1 100644
--- a/3rdparty/everest/CMakeLists.txt
+++ b/3rdparty/everest/CMakeLists.txt
@@ -1,10 +1,40 @@
-include_directories(include include/everest include/everest/kremlib)
+list (APPEND everest_src)
+list (APPEND everest_inc)
+list (APPEND everest_def)
 
-set(src_everest
-  ${CMAKE_CURRENT_SOURCE_DIR}/library/everest.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/library/Hacl_Curve25519.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/library/x25519.c
-  ${CMAKE_CURRENT_SOURCE_DIR}/library/kremlib/FStar_UInt64_FStar_UInt32_FStar_UInt16_FStar_UInt8.c
-  PARENT_SCOPE
-)
+execute_process(COMMAND ${PERL_EXECUTABLE} scripts/config.pl -f include/mbedtls/config.h get MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED RESULT_VARIABLE result)
 
+if(${result} EQUAL 0)
+  set(everest_src
+    ${CMAKE_CURRENT_SOURCE_DIR}/library/everest.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/library/x25519.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/library/kremlib/FStar_UInt64_FStar_UInt32_FStar_UInt16_FStar_UInt8.c
+  )
+
+  if (${CMAKE_LIBRARY_ARCHITECTURE} STREQUAL "x86_64-linux-gnu")
+  list(APPEND everest_src ${CMAKE_CURRENT_SOURCE_DIR}/library/Hacl_Curve25519.c)
+  else()
+  list(APPEND everest_def -DKRML_VERIFIED_UINT128)
+  list(APPEND everest_src
+    ${CMAKE_CURRENT_SOURCE_DIR}/library/legacy/Hacl_Curve25519.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/library/kremlib/FStar_UInt128_extracted.c
+  )
+  endif()
+
+  list(APPEND everest_inc ${CMAKE_CURRENT_SOURCE_DIR}/../../include ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include/everest ${CMAKE_CURRENT_SOURCE_DIR}/include/everest/kremlib)
+
+  if(INSTALL_MBEDTLS_HEADERS)
+
+      file(GLOB_RECURSE headers "${CMAKE_CURRENT_SOURCE_DIR}/include/everest/*.h")
+
+      install(FILES ${headers}
+          DESTINATION include/everest
+          PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
+
+  endif(INSTALL_MBEDTLS_HEADERS)
+
+endif()
+
+set(thirdparty_src ${thirdparty_src} ${everest_src} PARENT_SCOPE)
+set(thirdparty_inc ${thirdparty_inc} ${everest_inc} PARENT_SCOPE)
+set(thirdparty_def ${thirdparty_def} ${everest_def} PARENT_SCOPE)
diff --git a/3rdparty/everest/Makefile.inc b/3rdparty/everest/Makefile.inc
index bbdba56a3a..0b71e2a9f9 100755
--- a/3rdparty/everest/Makefile.inc
+++ b/3rdparty/everest/Makefile.inc
@@ -1,7 +1,18 @@
-THIRDPARTY_INCLUDES+=-I../3rdparty/everest/include -I../3rdparty/everest/include/everest -I../3rdparty/everest/include/everest/kremlib
-
-THIRDPARTY_OBJECTS+= \
-		../3rdparty/everest/library/everest.o \
-		../3rdparty/everest/library/Hacl_Curve25519.o \
-		../3rdparty/everest/library/x25519.o \
-		../3rdparty/everest/library/kremlib/FStar_UInt64_FStar_UInt32_FStar_UInt16_FStar_UInt8.o
\ No newline at end of file
+EVEREST_ENABLED=$(shell perl ../scripts/config.pl -f ../include/mbedtls/config.h get MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED; echo $$?)
+
+ifeq ($(EVEREST_ENABLED),0)
+THIRDPARTY_INCLUDES+=-I../3rdparty/everest/include -I../3rdparty/everest/include/everest -I../3rdparty/everest/include/everest/kremlib
+
+THIRDPARTY_OBJECTS+= \
+	../3rdparty/everest/library/everest.o \
+	../3rdparty/everest/library/x25519.o \
+	../3rdparty/everest/library/kremlib/FStar_UInt64_FStar_UInt32_FStar_UInt16_FStar_UInt8.o
+
+ifeq ($(shell getconf LONG_BIT),64)
+THIRDPARTY_OBJECTS+=../3rdparty/everest/library/Hacl_Curve25519.o
+else
+CFLAGS+="-DKRML_VERIFIED_UINT128"
+THIRDPARTY_OBJECTS+=../3rdparty/everest/library/legacy/Hacl_Curve25519.o \
+	../3rdparty/everest/library/kremlib/FStar_UInt128_extracted.o
+endif
+endif
diff --git a/3rdparty/everest/library/vs2010/Hacl_Curve25519.c b/3rdparty/everest/library/legacy/Hacl_Curve25519.c
similarity index 100%
rename from 3rdparty/everest/library/vs2010/Hacl_Curve25519.c
rename to 3rdparty/everest/library/legacy/Hacl_Curve25519.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 044ddc2817..5a09219262 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -176,10 +176,14 @@ else()
     set(LIB_INSTALL_DIR lib)
 endif()
 
-include_directories(include/ 3rdparty/everest/include/ 3rdparty/everest/include/everest/ 3rdparty/everest/include/everest/kremlin/ 3rdparty/everest/include/everest/kremlib/)
+include_directories(include/)
 include_directories(library/)
 
 add_subdirectory(3rdparty)
+include_directories(${thirdparty_inc})
+list(APPEND libs ${thirdparty_lib})
+add_definitions(${thirdparty_def})
+
 add_subdirectory(library)
 add_subdirectory(include)
 
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index 727fa210c5..02f924df45 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -4,9 +4,8 @@ if(INSTALL_MBEDTLS_HEADERS)
 
     file(GLOB headers "mbedtls/*.h")
     file(GLOB psa_headers "psa/*.h")
-    file(GLOB everest_headers "../3rdparty/everest/include/*.h")
 
-    install(FILES ${headers} ${everest_headers}
+    install(FILES ${headers}
         DESTINATION include/mbedtls
         PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
 
diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt
index a6eb1ed068..f4bb4725cd 100644
--- a/library/CMakeLists.txt
+++ b/library/CMakeLists.txt
@@ -74,7 +74,6 @@ set(src_crypto
     threading.c
     timing.c
     xtea.c
-    ${src_thirdparty}
 )
 
 # For files generated by the parent project (Mbed TLS) when building Mbed
@@ -95,6 +94,8 @@ set(src_crypto
 )
 endif()
 
+list(APPEND src_crypto ${thirdparty_src})
+
 if(CMAKE_COMPILER_IS_GNUCC)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes")
 endif(CMAKE_COMPILER_IS_GNUCC)
diff --git a/programs/Makefile b/programs/Makefile
index 871b75b77d..add1a8649b 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -11,7 +11,8 @@ LOCAL_CXXFLAGS = $(WARNING_CXXFLAGS) -I../include -D_FILE_OFFSET_BITS=64
 LOCAL_LDFLAGS = -L../library 			\
 		-lmbedcrypto$(SHARED_SUFFIX)
 
-LOCAL_CFLAGS+=-I../3rdparty/everest/include
+include ../3rdparty/Makefile.inc
+LOCAL_CFLAGS+=$(THIRDPARTY_INCLUDES)
 
 ifndef SHARED
 DEP=../library/libmbedcrypto.a
diff --git a/scripts/generate_visualc_files.pl b/scripts/generate_visualc_files.pl
index 5d07b885c5..2134f53a60 100755
--- a/scripts/generate_visualc_files.pl
+++ b/scripts/generate_visualc_files.pl
@@ -23,7 +23,7 @@ my $mbedtls_header_dir = 'include/mbedtls';
 my $psa_header_dir = 'include/psa';
 my $source_dir = 'library';
 my $everest_header_dir = '3rdparty/everest/include/everest';
-my @everest_source_dirs = ('3rdparty/everest/library', '3rdparty/everest/library/kremlib', '3rdparty/everest/library/vs2010');
+my @everest_source_dirs = ('3rdparty/everest/library', '3rdparty/everest/library/kremlib', '3rdparty/everest/library/legacy');
 
 # Need windows line endings!
 my $vsx_hdr_tpl = <<EOT;
diff --git a/tests/Makefile b/tests/Makefile
index 00a14bc211..4eb9142318 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -10,7 +10,8 @@ LOCAL_CFLAGS = $(WARNING_CFLAGS) $(CRYPTO_INCLUDES) -I../library -D_FILE_OFFSET_
 LOCAL_LDFLAGS = -L../library			\
 		-lmbedcrypto$(SHARED_SUFFIX)
 
-LOCAL_CFLAGS+=-I../3rdparty/everest/include
+include ../3rdparty/Makefile.inc
+LOCAL_CFLAGS+=$(THIRDPARTY_INCLUDES)
 
 # Enable definition of various functions used throughout the testsuite
 # (gethostname, strdup, fileno...) even when compiling with -std=c99. Harmless
diff --git a/visualc/VS2010/mbedTLS.vcxproj b/visualc/VS2010/mbedTLS.vcxproj
index 2206bb196e..d3bfaade8d 100644
--- a/visualc/VS2010/mbedTLS.vcxproj
+++ b/visualc/VS2010/mbedTLS.vcxproj
@@ -304,7 +304,7 @@
     <ClCompile Include="..\..\3rdparty\everest\library\x25519.c" />
     <ClCompile Include="..\..\3rdparty\everest\library\kremlib\FStar_UInt128_extracted.c" />
     <ClCompile Include="..\..\3rdparty\everest\library\kremlib\FStar_UInt64_FStar_UInt32_FStar_UInt16_FStar_UInt8.c" />
-    <ClCompile Include="..\..\3rdparty\everest\library\vs2010\Hacl_Curve25519.c" />
+    <ClCompile Include="..\..\3rdparty\everest\library\legacy\Hacl_Curve25519.c" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">