diff --git a/configure b/configure
index 51fdf1d..42efbcc 100755
--- a/configure
+++ b/configure
@@ -16019,7 +16019,7 @@ fi
 fi
 
 
-pkg_modules="gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11"
+pkg_modules="gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms2 dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11"
 
 
 
diff --git a/configure.in b/configure.in
index 19d704a..cefdcf7 100644
--- a/configure.in
+++ b/configure.in
@@ -83,7 +83,7 @@ AC_CHECK_LIB(tiff, TIFFOpen, tiff_ok=yes, tiff_ok=no)
 fi
 AC_SUBST(LIBTIFF)
 
-pkg_modules="gthread-2.0 gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11"
+pkg_modules="gthread-2.0 gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms2 dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11"
 PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
 AC_SUBST(PACKAGE_CFLAGS)
 AC_SUBST(PACKAGE_LIBS)
diff --git a/plugins/colorspace-transform/colorspace_transform.c b/plugins/colorspace-transform/colorspace_transform.c
index c9a7633..9617d74 100644
--- a/plugins/colorspace-transform/colorspace_transform.c
+++ b/plugins/colorspace-transform/colorspace_transform.c
@@ -20,7 +20,7 @@
 /* Plugin tmpl version 5 */
 
 #include <rawstudio.h>
-#include <lcms.h>
+#include <lcms2.h>
 #include "rs-cmm.h"
 #include "colorspace_transform.h"
 
diff --git a/plugins/colorspace-transform/colorspace_transform.h b/plugins/colorspace-transform/colorspace_transform.h
index 8728f48..a3964d6 100644
--- a/plugins/colorspace-transform/colorspace_transform.h
+++ b/plugins/colorspace-transform/colorspace_transform.h
@@ -20,7 +20,7 @@
 /* Plugin tmpl version 5 */
 
 #include <rawstudio.h>
-#include <lcms.h>
+#include <lcms2.h>
 #include "rs-cmm.h"
 
 #define RS_TYPE_COLORSPACE_TRANSFORM (rs_colorspace_transform_type)
diff --git a/plugins/colorspace-transform/colorspace_transform_sse2.c b/plugins/colorspace-transform/colorspace_transform_sse2.c
index 53e9e0d..1639d3d 100644
--- a/plugins/colorspace-transform/colorspace_transform_sse2.c
+++ b/plugins/colorspace-transform/colorspace_transform_sse2.c
@@ -20,7 +20,7 @@
 /* Plugin tmpl version 5 */
 
 #include <rawstudio.h>
-#include <lcms.h>
+#include <lcms2.h>
 #include "rs-cmm.h"
 #include "colorspace_transform.h"
 
diff --git a/plugins/colorspace-transform/rs-cmm.c b/plugins/colorspace-transform/rs-cmm.c
index 99f5456..ca63ef5 100644
--- a/plugins/colorspace-transform/rs-cmm.c
+++ b/plugins/colorspace-transform/rs-cmm.c
@@ -1,5 +1,5 @@
 /*
- * * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>, 
+ * * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>,
  * * Anders Kvist <akv@lnxbx.dk> and Klaus Post <klauspost@gmail.com>
  *
  * This program is free software; you can redistribute it and/or
@@ -17,9 +17,18 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-#include <lcms.h>
+#include <lcms2.h>
 #include "rs-cmm.h"
 
+
+#ifndef LCMS_WIN_TYPES_ALREADY_DEFINED
+typedef unsigned char BYTE, *LPBYTE;
+typedef unsigned short WORD, *LPWORD;
+typedef unsigned long DWORD, *LPDWORD;
+typedef char *LPSTR;
+typedef void *LPVOID;
+#endif
+
 static gushort gammatable22[65536];
 
 struct _RSCmm {
@@ -40,6 +49,7 @@ struct _RSCmm {
 
 	cmsHTRANSFORM lcms_transform8;
 	cmsHTRANSFORM lcms_transform16;
+	gboolean is_gamma_corrected;
 };
 
 G_DEFINE_TYPE (RSCmm, rs_cmm, G_TYPE_OBJECT)
@@ -152,29 +162,59 @@ rs_cmm_transform16(RSCmm *cmm, RS_IMAGE16 *input, RS_IMAGE16 *output)
 		gushort *in = GET_PIXEL(input, 0, y);
 		gushort *out = GET_PIXEL(output, 0, y);
 		gushort *buffer_pointer = buffer;
-		for(x=0;x<input->w;x++)
+		if (cmm->is_gamma_corrected)
 		{
-			register gfloat r = (gfloat) MIN(*in, cmm->clip[R]); in++;
-			register gfloat g = (gfloat) MIN(*in, cmm->clip[G]); in++;
-			register gfloat b = (gfloat) MIN(*in, cmm->clip[B]); in++;
-			in++;
-
-			r = MIN(r, cmm->clip[R]);
-			g = MIN(g, cmm->clip[G]);
-			b = MIN(b, cmm->clip[B]);
-
-			r = r * cmm->premul[R];
-			g = g * cmm->premul[G];
-			b = b * cmm->premul[B];
-
-			r = MIN(r, 65535.0);
-			g = MIN(g, 65535.0);
-			b = MIN(b, 65535.0);
-
-			*(buffer_pointer++) = (gushort) r;
-			*(buffer_pointer++) = (gushort) g;
-			*(buffer_pointer++) = (gushort) b;
-			buffer_pointer++;
+			for(x=0; x<input->w;x++)
+			{
+				register gfloat r = (gfloat) MIN(*in, cmm->clip[R]); in++;
+				register gfloat g = (gfloat) MIN(*in, cmm->clip[G]); in++;
+				register gfloat b = (gfloat) MIN(*in, cmm->clip[B]); in++;
+				in++;
+
+				r = MIN(r, cmm->clip[R]);
+				g = MIN(g, cmm->clip[G]);
+				b = MIN(b, cmm->clip[B]);
+
+				r = r * cmm->premul[R];
+				g = g * cmm->premul[G];
+				b = b * cmm->premul[B];
+
+				r = MIN(r, 65535.0);
+				g = MIN(g, 65535.0);
+				b = MIN(b, 65535.0);
+
+				*(buffer_pointer++) = gammatable22[(gushort) r];
+				*(buffer_pointer++) = gammatable22[(gushort) g];
+				*(buffer_pointer++) = gammatable22[(gushort) b];
+				buffer_pointer++;
+			}
+		}
+		else
+		{
+			for(x=0; x<input->w;x++)
+			{
+				register gfloat r = (gfloat) MIN(*in, cmm->clip[R]); in++;
+				register gfloat g = (gfloat) MIN(*in, cmm->clip[G]); in++;
+				register gfloat b = (gfloat) MIN(*in, cmm->clip[B]); in++;
+				in++;
+
+				r = MIN(r, cmm->clip[R]);
+				g = MIN(g, cmm->clip[G]);
+				b = MIN(b, cmm->clip[B]);
+
+				r = r * cmm->premul[R];
+				g = g * cmm->premul[G];
+				b = b * cmm->premul[B];
+
+				r = MIN(r, 65535.0);
+				g = MIN(g, 65535.0);
+				b = MIN(b, 65535.0);
+
+				*(buffer_pointer++) = (gushort) r;
+				*(buffer_pointer++) = (gushort) g;
+				*(buffer_pointer++) = (gushort) b;
+				buffer_pointer++;
+			}
 		}
 		cmsDoTransform(cmm->lcms_transform16, buffer, out, input->w);
 	}
@@ -202,36 +242,6 @@ rs_cmm_transform8(RSCmm *cmm, RS_IMAGE16 *input, GdkPixbuf *output)
 	return TRUE;
 }
 
-static guchar *
-pack_rgb_w4(void *info, register WORD wOut[], register LPBYTE output)
-{
-	*(LPWORD) output = wOut[0]; output+= 2;
-	*(LPWORD) output = wOut[1]; output+= 2;
-	*(LPWORD) output = wOut[2]; output+= 4;
-
-	return(output);
-}
-
-static guchar *
-unroll_rgb_w4(void *info, register WORD wIn[], register LPBYTE accum)
-{
-	wIn[0] = *(LPWORD) accum; accum+= 2;
-	wIn[1] = *(LPWORD) accum; accum+= 2;
-	wIn[2] = *(LPWORD) accum; accum+= 4;
-
-	return(accum);
-}
-
-static guchar *
-unroll_rgb_w4_gammatable22(void *info, register WORD wIn[], register LPBYTE accum)
-{
-	wIn[0] = gammatable22[*(LPWORD) accum]; accum+= 2;
-	wIn[1] = gammatable22[*(LPWORD) accum]; accum+= 2;
-	wIn[2] = gammatable22[*(LPWORD) accum]; accum+= 4;
-
-	return(accum);
-}
-
 static void
 load_profile(RSCmm *cmm, const RSIccProfile *profile, const RSIccProfile **profile_target, cmsHPROFILE *lcms_target)
 {
@@ -308,10 +318,12 @@ is_profile_gamma_22_corrected(cmsHPROFILE *profile)
 			{0.115, 0.826, 0.724938},
 			{0.157, 0.018, 0.016875}};
 		cmsCIExyY D65;
-		LPGAMMATABLE gamma[3];
 
-		cmsWhitePointFromTemp(6504, &D65);
-		gamma[0] = gamma[1] = gamma[2] = cmsBuildGamma(2,1.0);
+		gint context = 1337;
+		cmsToneCurve* gamma[3];
+		cmsWhitePointFromTemp(&D65, 6504);
+		gamma[0] = gamma[1] = gamma[2] = cmsBuildGamma(&context,1.0);
+
 		linear = cmsCreateRGBProfile(&D65, &srgb_primaries, gamma);
 	}
 	g_mutex_unlock(is_profile_gamma_22_corrected_linear_lock);
@@ -347,21 +359,14 @@ prepare16(RSCmm *cmm)
 	cmm->lcms_transform16 = cmsCreateTransform(
 		cmm->lcms_input_profile, TYPE_RGB_16,
 		cmm->lcms_output_profile, TYPE_RGB_16,
-		INTENT_PERCEPTUAL, 0);
+		INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE);
 
 	g_warn_if_fail(cmm->lcms_transform16 != NULL);
 
 	/* Enable packing/unpacking for pixelsize==4 */
 	/* If we estimate that the input profile will apply gamma correction,
 	   we try to undo it in 16 bit transform */
-	if (is_profile_gamma_22_corrected(cmm->lcms_input_profile))
-		cmsSetUserFormatters(cmm->lcms_transform16,
-			TYPE_RGB_16, unroll_rgb_w4_gammatable22,
-			TYPE_RGB_16, pack_rgb_w4);
-	else
-		cmsSetUserFormatters(cmm->lcms_transform16,
-			TYPE_RGB_16, unroll_rgb_w4,
-			TYPE_RGB_16, pack_rgb_w4);
+	cmm->is_gamma_corrected = is_profile_gamma_22_corrected(cmm->lcms_input_profile);
 
 	cmm->dirty16 = FALSE;
 }
diff --git a/plugins/load-dcraw/dcraw.cc b/plugins/load-dcraw/dcraw.cc
index a080442..216b61c 100644
--- a/plugins/load-dcraw/dcraw.cc
+++ b/plugins/load-dcraw/dcraw.cc
@@ -62,7 +62,7 @@ dcraw_api.h [1.42]
    NO_LCMS disables the "-p" option.
  */
 #ifndef NO_LCMS
-#include <lcms.h>
+#include <lcms2.h>
 #endif
 #ifdef HAVE_LIBJPEG
 extern "C" {
@@ -8267,7 +8267,7 @@ void CLASS apply_profile (const char *input, const char *output)
   FILE *fp;
   unsigned size;
 
-  cmsErrorAction (LCMS_ERROR_SHOW);
+//  cmsErrorAction (LCMS_ERROR_SHOW);
   if (strcmp (input, "embed"))
     hInProfile = cmsOpenProfileFromFile (input, "r");
   else if (profile_length) {
diff --git a/src/gtk-helper.c b/src/gtk-helper.c
index 2ef2177..f075ab8 100644
--- a/src/gtk-helper.c
+++ b/src/gtk-helper.c
@@ -31,7 +31,7 @@
 #include "gtk-helper.h"
 #include "rs-preview-widget.h"
 #include <gettext.h>
-#include <lcms.h>
+#include <lcms2.h>
 
 struct _RS_CONFBOX
 {