diff --git a/configure b/configure
index d18bb47..05fdece 100755
--- a/configure
+++ b/configure
@@ -653,8 +653,8 @@
 ZLIB
 FREETYPE_LIBS
 FREETYPE_CFLAGS
-LCMS_LIBS
-LCMS_CFLAGS
+LCMS2_LIBS
+LCMS2_CFLAGS
 RESOLVLIBS
 GPHOTO2_PORT_LIBS
 GPHOTO2_PORT_CFLAGS
@@ -881,8 +881,8 @@
 GPHOTO2_LIBS
 GPHOTO2_PORT_CFLAGS
 GPHOTO2_PORT_LIBS
-LCMS_CFLAGS
-LCMS_LIBS
+LCMS2_CFLAGS
+LCMS2_LIBS
 FREETYPE_CFLAGS
 FREETYPE_LIBS
 GSTREAMER_CFLAGS
@@ -1597,8 +1597,9 @@
               C compiler flags for libgphoto2_port, overriding pkg-config
   GPHOTO2_PORT_LIBS
               Linker flags for libgphoto2_port, overriding pkg-config
-  LCMS_CFLAGS C compiler flags for lcms, overriding pkg-config
-  LCMS_LIBS   Linker flags for lcms, overriding pkg-config
+  LCMS2_CFLAGS
+              C compiler flags for lcms2, overriding pkg-config
+  LCMS2_LIBS  Linker flags for lcms2, overriding pkg-config
   FREETYPE_CFLAGS
               C compiler flags for freetype2, overriding pkg-config
   FREETYPE_LIBS
@@ -10761,45 +10762,44 @@
     LIBS="$ac_save_LIBS"
 fi
 
-if test "x$with_lcms" != "xno"
+if test "x$with_lcms2" != "xno"
 then
     ac_save_CPPFLAGS="$CPPFLAGS"
-    if test -n "$LCMS_CFLAGS"; then :
+    if test -n "$LCMS2_CFLAGS"; then :
 
 elif test -n "$PKG_CONFIG"; then :
-  LCMS_CFLAGS=`$PKG_CONFIG --cflags lcms 2>/dev/null`
+  LCMS2_CFLAGS=`$PKG_CONFIG --cflags lcms2 2>/dev/null`
 fi
 
-CPPFLAGS="$CPPFLAGS $LCMS_CFLAGS"
-if test -n "$LCMS_LIBS"; then :
+CPPFLAGS="$CPPFLAGS $LCMS2_CFLAGS"
+if test -n "$LCMS2_LIBS"; then :
 
 elif test -n "$PKG_CONFIG"; then :
-  LCMS_LIBS=`$PKG_CONFIG --libs lcms 2>/dev/null`
+  LCMS2_LIBS=`$PKG_CONFIG --libs lcms2 2>/dev/null`
 fi
 
-LCMS_LIBS=${LCMS_LIBS:-"-llcms"}
-    for ac_header in lcms.h lcms/lcms.h
+LCMS2_LIBS=${LCMS2_LIBS:-"-llcms2"}
+    for ac_header in lcms2.h
 do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  ac_fn_c_check_header_mongrel "$LINENO" "lcms2.h" "ac_cv_header_lcms2_h" "$ac_includes_default"
+if test "x$ac_cv_header_lcms2_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define HAVE_LCMS2_H 1
 _ACEOF
 
 fi
 
 done
 
-    if test "$ac_cv_header_lcms_h" = "yes" -o "$ac_cv_header_lcms_lcms_h" = "yes"
+    if test "$ac_cv_header_lcms2_h" = "yes"
     then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmsOpenProfileFromFile in -llcms" >&5
-$as_echo_n "checking for cmsOpenProfileFromFile in -llcms... " >&6; }
-if ${ac_cv_lib_lcms_cmsOpenProfileFromFile+:} false; then :
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmsOpenProfileFromFile in -llcms2" >&5
+$as_echo_n "checking for cmsOpenProfileFromFile in -llcms2... " >&6; }
+if ${ac_cv_lib_lcms2_cmsOpenProfileFromFile+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-llcms  $LIBS"
+LIBS="-llcms2  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -10819,35 +10819,35 @@
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_lcms_cmsOpenProfileFromFile=yes
+  ac_cv_lib_lcms2_cmsOpenProfileFromFile=yes
 else
-  ac_cv_lib_lcms_cmsOpenProfileFromFile=no
+  ac_cv_lib_lcms2_cmsOpenProfileFromFile=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lcms_cmsOpenProfileFromFile" >&5
-$as_echo "$ac_cv_lib_lcms_cmsOpenProfileFromFile" >&6; }
-if test "x$ac_cv_lib_lcms_cmsOpenProfileFromFile" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lcms2_cmsOpenProfileFromFile" >&5
+$as_echo "$ac_cv_lib_lcms2_cmsOpenProfileFromFile" >&6; }
+if test "x$ac_cv_lib_lcms2_cmsOpenProfileFromFile" = xyes; then :
 
-$as_echo "#define HAVE_LCMS 1" >>confdefs.h
+$as_echo "#define HAVE_LCMS2 1" >>confdefs.h
 
 else
-  LCMS_LIBS=""
+  LCMS2_LIBS=""
 fi
 
     else
-        LCMS_CFLAGS=""
-        LCMS_LIBS=""
+        LCMS2_CFLAGS=""
+        LCMS2_LIBS=""
     fi
     CPPFLAGS="$ac_save_CPPFLAGS"
 fi
-if test "$ac_cv_lib_lcms_cmsOpenProfileFromFile" != "yes"; then :
+if test "$ac_cv_lib_lcms2_cmsOpenProfileFromFile" != "yes"; then :
   case "x$with_cms" in
-  x)   as_fn_append wine_notices "|liblcms ${notice_platform}development files not found, Color Management won't be supported." ;;
+  x)   as_fn_append wine_notices "|liblcms2 ${notice_platform}development files not found, Color Management won't be supported." ;;
   xno) ;;
-  *)   as_fn_error $? "liblcms ${notice_platform}development files not found, Color Management won't be supported.
+  *)   as_fn_error $? "liblcms2 ${notice_platform}development files not found, Color Management won't be supported.
 This is an error since --with-cms was requested." "$LINENO" 5 ;;
 esac
 fi
diff --git a/configure.ac b/configure.ac
index 9844038..39a392c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1442,23 +1442,23 @@
 fi
 
 dnl **** Check for LittleCMS ***
-if test "x$with_lcms" != "xno"
+if test "x$with_lcms2" != "xno"
 then
     ac_save_CPPFLAGS="$CPPFLAGS"
-    WINE_PACKAGE_FLAGS(LCMS,[lcms],[-llcms])
-    AC_CHECK_HEADERS([lcms.h lcms/lcms.h])
-    if test "$ac_cv_header_lcms_h" = "yes" -o "$ac_cv_header_lcms_lcms_h" = "yes"
+    WINE_PACKAGE_FLAGS(LCMS2,[lcms2],[-llcms2])
+    AC_CHECK_HEADERS([lcms2.h])
+    if test "$ac_cv_header_lcms2_h" = "yes"
     then
-        AC_CHECK_LIB(lcms, cmsOpenProfileFromFile,
-            [AC_DEFINE(HAVE_LCMS, 1, [Define if you have the LittleCMS development environment])],[LCMS_LIBS=""])
+        AC_CHECK_LIB(lcms2, cmsOpenProfileFromFile,
+            [AC_DEFINE(HAVE_LCMS2, 1, [Define if you have the LittleCMS development environment])],[LCMS2_LIBS=""])
     else
-        LCMS_CFLAGS=""
-        LCMS_LIBS=""
+        LCMS2_CFLAGS=""
+        LCMS2_LIBS=""
     fi
     CPPFLAGS="$ac_save_CPPFLAGS"
 fi
-WINE_NOTICE_WITH(cms,[test "$ac_cv_lib_lcms_cmsOpenProfileFromFile" != "yes"],
-                 [liblcms ${notice_platform}development files not found, Color Management won't be supported.])
+WINE_NOTICE_WITH(cms,[test "$ac_cv_lib_lcms2_cmsOpenProfileFromFile" != "yes"],
+                 [liblcms2 ${notice_platform}development files not found, Color Management won't be supported.])
 
 dnl **** Check for FreeType 2 ****
 if test "x$with_freetype" != "xno"
diff --git a/dlls/mscms/Makefile.in b/dlls/mscms/Makefile.in
index 6fb5e1f..234c515 100644
--- a/dlls/mscms/Makefile.in
+++ b/dlls/mscms/Makefile.in
@@ -1,8 +1,8 @@
 MODULE    = mscms.dll
 IMPORTLIB = mscms
 IMPORTS   = shlwapi advapi32
-EXTRAINCL = @LCMS_CFLAGS@
-EXTRALIBS = @LCMS_LIBS@
+EXTRAINCL = @LCMS2_CFLAGS@
+EXTRALIBS = @LCMS2_LIBS@
 
 C_SRCS = \
 	handle.c \
diff --git a/dlls/mscms/handle.c b/dlls/mscms/handle.c
index 2f9eaec..8a0f26d 100644
--- a/dlls/mscms/handle.c
+++ b/dlls/mscms/handle.c
@@ -31,7 +31,7 @@
 
 #include "mscms_priv.h"
 
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
 
 static CRITICAL_SECTION MSCMS_handle_cs;
 static CRITICAL_SECTION_DEBUG MSCMS_handle_cs_debug =
@@ -112,7 +112,7 @@
 
     for (index = 0; index < num_profile_handles; index++)
     {
-        if (!profiletable[index].iccprofile) return (HPROFILE)(index + 1);
+        if (!profiletable[index].data) return (HPROFILE)(index + 1);
     }
     if (!profiletable)
     {
@@ -165,11 +165,11 @@
     {
         if (profile->access & PROFILE_READWRITE)
         {
-            DWORD written, size = MSCMS_get_profile_size( profile->iccprofile );
+            DWORD written;
 
             if (SetFilePointer( profile->file, 0, NULL, FILE_BEGIN ) ||
-                !WriteFile( profile->file, profile->iccprofile, size, &written, NULL ) ||
-                written != size)
+                !WriteFile( profile->file, profile->data, profile->size, &written, NULL ) ||
+                written != profile->size)
             {
                 ERR( "Unable to write color profile\n" );
             }
@@ -177,7 +177,7 @@
         CloseHandle( profile->file );
     }
     cmsCloseProfile( profile->cmsprofile );
-    HeapFree( GetProcessHeap(), 0, profile->iccprofile );
+    HeapFree( GetProcessHeap(), 0, profile->data );
 
     memset( profile, 0, sizeof(struct profile) );
 
@@ -249,4 +249,4 @@
     return TRUE;
 }
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
diff --git a/dlls/mscms/icc.c b/dlls/mscms/icc.c
index f751c70..3b1c718 100644
--- a/dlls/mscms/icc.c
+++ b/dlls/mscms/icc.c
@@ -31,75 +31,90 @@
 
 #include "mscms_priv.h"
 
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
 
-static inline void MSCMS_adjust_endianness32( ULONG *ptr )
+static inline void adjust_endianness32( ULONG *ptr )
 {
 #ifndef WORDS_BIGENDIAN
     *ptr = RtlUlongByteSwap(*ptr);
 #endif
 }
 
-void MSCMS_get_profile_header( const icProfile *iccprofile, PROFILEHEADER *header )
+void get_profile_header( const struct profile *profile, PROFILEHEADER *header )
 {
     unsigned int i;
 
-    memcpy( header, iccprofile, sizeof(PROFILEHEADER) );
+    memcpy( header, profile->data, sizeof(PROFILEHEADER) );
 
     /* ICC format is big-endian, swap bytes if necessary */
     for (i = 0; i < sizeof(PROFILEHEADER) / sizeof(ULONG); i++)
-        MSCMS_adjust_endianness32( (ULONG *)header + i );
+        adjust_endianness32( (ULONG *)header + i );
 }
 
-void MSCMS_set_profile_header( icProfile *iccprofile, const PROFILEHEADER *header )
+void set_profile_header( const struct profile *profile, const PROFILEHEADER *header )
 {
     unsigned int i;
-    icHeader *iccheader = (icHeader *)iccprofile;
 
-    memcpy( iccheader, header, sizeof(icHeader) );
+    memcpy( profile->data, header, sizeof(PROFILEHEADER) );
 
     /* ICC format is big-endian, swap bytes if necessary */
-    for (i = 0; i < sizeof(icHeader) / sizeof(ULONG); i++)
-        MSCMS_adjust_endianness32( (ULONG *)iccheader + i );
+    for (i = 0; i < sizeof(PROFILEHEADER) / sizeof(ULONG); i++)
+        adjust_endianness32( (ULONG *)profile->data + i );
 }
 
-DWORD MSCMS_get_tag_count( const icProfile *iccprofile )
+static BOOL get_adjusted_tag( const struct profile *profile, TAGTYPE type, cmsTagEntry *tag )
 {
-    ULONG count = iccprofile->count;
+    DWORD i, num_tags = *(DWORD *)(profile->data + sizeof(cmsICCHeader));
+    cmsTagEntry *entry;
+    ULONG sig;
 
-    MSCMS_adjust_endianness32( &count );
-    return count;
+    adjust_endianness32( &num_tags );
+    for (i = 0; i < num_tags; i++)
+    {
+        entry = (cmsTagEntry *)(profile->data + sizeof(cmsICCHeader) + sizeof(DWORD) + i * sizeof(*tag));
+        sig = entry->sig;
+        adjust_endianness32( &sig );
+        if (sig == type)
+        {
+            tag->sig    = sig;
+            tag->offset = entry->offset;
+            tag->size   = entry->size;
+            adjust_endianness32( &tag->offset );
+            adjust_endianness32( &tag->size );
+            return TRUE;
+        }
+    }
+    return FALSE;
 }
 
-void MSCMS_get_tag_by_index( icProfile *iccprofile, DWORD index, icTag *tag )
+BOOL get_tag_data( const struct profile *profile, TAGTYPE type, DWORD offset, void *buffer, DWORD *len )
 {
-    icTag *tmp = (icTag *)((char *)iccprofile->data + index * sizeof(icTag));
+    cmsTagEntry tag;
 
-    tag->sig = tmp->sig;
-    tag->offset = tmp->offset;
-    tag->size = tmp->size;
+    if (!get_adjusted_tag( profile, type, &tag )) return FALSE;
 
-    MSCMS_adjust_endianness32( &tag->sig );
-    MSCMS_adjust_endianness32( &tag->offset );
-    MSCMS_adjust_endianness32( &tag->size );
+    if (!buffer) offset = 0;
+    if (offset > tag.size) return FALSE;
+    if (*len < tag.size - offset || !buffer)
+    {
+        *len = tag.size - offset;
+        return FALSE;
+    }
+    memcpy( buffer, profile->data + tag.offset + offset, tag.size - offset );
+    *len = tag.size - offset;
+    return TRUE;
 }
 
-void MSCMS_get_tag_data( const icProfile *iccprofile, const icTag *tag, DWORD offset, void *buffer )
+BOOL set_tag_data( const struct profile *profile, TAGTYPE type, DWORD offset, const void *buffer, DWORD *len )
 {
-    memcpy( buffer, (const char *)iccprofile + tag->offset + offset, tag->size - offset );
+    cmsTagEntry tag;
+
+    if (!get_adjusted_tag( profile, type, &tag )) return FALSE;
+
+    if (offset > tag.size) return FALSE;
+    *len = min( tag.size - offset, *len );
+    memcpy( profile->data + tag.offset + offset, buffer, *len );
+    return TRUE;
 }
 
-void MSCMS_set_tag_data( icProfile *iccprofile, const icTag *tag, DWORD offset, const void *buffer )
-{
-    memcpy( (char *)iccprofile + tag->offset + offset, buffer, tag->size - offset );
-}
-
-DWORD MSCMS_get_profile_size( const icProfile *iccprofile )
-{
-    DWORD size = ((const icHeader *)iccprofile)->size;
-
-    MSCMS_adjust_endianness32( &size );
-    return size;
-}
-
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
diff --git a/dlls/mscms/mscms_main.c b/dlls/mscms/mscms_main.c
index 1688239..3f8dae5 100644
--- a/dlls/mscms/mscms_main.c
+++ b/dlls/mscms/mscms_main.c
@@ -36,20 +36,10 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mscms);
 
-#ifdef HAVE_LCMS
-static int lcms_error_handler( int error, const char *text )
+#ifdef HAVE_LCMS2
+static void lcms_error_handler(cmsContext ctx, cmsUInt32Number error, const char *text)
 {
-    switch (error)
-    {
-    case LCMS_ERRC_WARNING:
-    case LCMS_ERRC_RECOVERABLE:
-    case LCMS_ERRC_ABORTED:
-        WARN("%d %s\n", error, debugstr_a(text));
-        return 1;
-    default:
-        ERR("unknown error %d %s\n", error, debugstr_a(text));
-        return 0;
-    }
+    TRACE("%u %s\n", error, debugstr_a(text));
 }
 #endif
 
@@ -61,13 +51,13 @@
     {
     case DLL_PROCESS_ATTACH:
         DisableThreadLibraryCalls( hinst );
-#ifdef HAVE_LCMS
-        cmsSetErrorHandler( lcms_error_handler );
+#ifdef HAVE_LCMS2
+        cmsSetLogErrorHandler( lcms_error_handler );
 #endif
         break;
     case DLL_PROCESS_DETACH:
         if (reserved) break;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
         free_handle_tables();
 #endif
         break;
diff --git a/dlls/mscms/mscms_priv.h b/dlls/mscms/mscms_priv.h
index ffaf13b..a3bffa2 100644
--- a/dlls/mscms/mscms_priv.h
+++ b/dlls/mscms/mscms_priv.h
@@ -18,54 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#ifdef HAVE_LCMS
-
-/*  These basic Windows types are defined in lcms.h when compiling on
- *  a non-Windows platform (why?), so they would normally not conflict
- *  with anything included earlier. But since we are building Wine they
- *  most certainly will have been defined before we include lcms.h.
- *  The preprocessor comes to the rescue.
- */
-
-#define BYTE    LCMS_BYTE
-#define LPBYTE  LCMS_LPBYTE
-#define WORD    LCMS_WORD
-#define LPWORD  LCMS_LPWORD
-#define DWORD   LCMS_DWORD
-#define LPDWORD LCMS_LPDWORD
-#define BOOL    LCMS_BOOL
-#define LPSTR   LCMS_LPSTR
-#define LPVOID  LCMS_LPVOID
-
-#undef cdecl
-#undef FAR
-
-#undef ZeroMemory
-#undef CopyMemory
-
-#undef LOWORD
-#undef HIWORD
-#undef MAX_PATH
-
-#ifdef HAVE_LCMS_LCMS_H
-#include <lcms/lcms.h>
-#else
-#include <lcms.h>
-#endif
-
-/*  Funny thing is lcms.h defines DWORD as an 'unsigned long' whereas Wine
- *  defines it as an 'unsigned int'. To avoid compiler warnings we use a
- *  preprocessor define for DWORD and LPDWORD to get back Wine's original
- *  (typedef) definitions.
- */
-
-#undef BOOL
-#undef DWORD
-#undef LPDWORD
-
-#define BOOL    BOOL
-#define DWORD   DWORD
-#define LPDWORD LPDWORD
+#ifdef HAVE_LCMS2
+#include <lcms2.h>
 
 /*  A simple structure to tie together a pointer to an icc profile, an lcms
  *  color profile handle and a Windows file handle. If the profile is memory
@@ -76,9 +30,10 @@
 
 struct profile
 {
-    HANDLE file;
-    DWORD access;
-    icProfile *iccprofile;
+    HANDLE      file;
+    DWORD       access;
+    char       *data;
+    DWORD       size;
     cmsHPROFILE cmsprofile;
 };
 
@@ -101,14 +56,11 @@
 
 extern void free_handle_tables( void ) DECLSPEC_HIDDEN;
 
-extern DWORD MSCMS_get_tag_count( const icProfile *iccprofile ) DECLSPEC_HIDDEN;
-extern void MSCMS_get_tag_by_index( icProfile *iccprofile, DWORD index, icTag *tag ) DECLSPEC_HIDDEN;
-extern void MSCMS_get_tag_data( const icProfile *iccprofile, const icTag *tag, DWORD offset, void *buffer ) DECLSPEC_HIDDEN;
-extern void MSCMS_set_tag_data( icProfile *iccprofile, const icTag *tag, DWORD offset, const void *buffer ) DECLSPEC_HIDDEN;
-extern void MSCMS_get_profile_header( const icProfile *iccprofile, PROFILEHEADER *header ) DECLSPEC_HIDDEN;
-extern void MSCMS_set_profile_header( icProfile *iccprofile, const PROFILEHEADER *header ) DECLSPEC_HIDDEN;
-extern DWORD MSCMS_get_profile_size( const icProfile *iccprofile ) DECLSPEC_HIDDEN;
+extern BOOL get_tag_data( const struct profile *, TAGTYPE, DWORD, void *, DWORD * ) DECLSPEC_HIDDEN;
+extern BOOL set_tag_data( const struct profile *, TAGTYPE, DWORD, const void *, DWORD * ) DECLSPEC_HIDDEN;
+extern void get_profile_header( const struct profile *, PROFILEHEADER * ) DECLSPEC_HIDDEN;
+extern void set_profile_header( const struct profile *, const PROFILEHEADER * ) DECLSPEC_HIDDEN;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
 
 extern const char *MSCMS_dbgstr_tag(DWORD) DECLSPEC_HIDDEN;
diff --git a/dlls/mscms/profile.c b/dlls/mscms/profile.c
index 8444e14..cb6fbfc 100644
--- a/dlls/mscms/profile.c
+++ b/dlls/mscms/profile.c
@@ -337,10 +337,8 @@
                                     PVOID buffer, PBOOL ref )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
-    DWORD i, count;
-    icTag tag;
 
     TRACE( "( %p, 0x%08x, %d, %p, %p, %p )\n", handle, type, offset, size, buffer, ref );
 
@@ -351,30 +349,17 @@
         release_profile( profile );
         return FALSE;
     }
-    count = MSCMS_get_tag_count( profile->iccprofile );
-
-    for (i = 0; i < count; i++)
+    if (!get_tag_data( profile, type, offset, buffer, size ))
     {
-        MSCMS_get_tag_by_index( profile->iccprofile, i, &tag );
-
-        if (tag.sig == type)
-        {
-            if ((tag.size - offset) > *size || !buffer)
-            {
-                *size = (tag.size - offset);
-                release_profile( profile );
-                return FALSE;
-            }
-            MSCMS_get_tag_data( profile->iccprofile, &tag, offset, buffer );
-
-            *ref = FALSE; /* FIXME: calculate properly */
-            release_profile( profile );
-            return TRUE;
-        }
+        release_profile( profile );
+        return FALSE;
     }
+    ret = get_tag_data( profile, type, offset, buffer, size );
+    *ref = cmsTagLinkedTo( profile->cmsprofile, type ) != 0;
     release_profile( profile );
+    return ret;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -399,10 +384,10 @@
 BOOL WINAPI GetColorProfileElementTag( HPROFILE handle, DWORD index, PTAGTYPE type )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
-    DWORD count;
-    icTag tag;
+    cmsInt32Number num_tags;
+    cmsTagSignature sig;
 
     TRACE( "( %p, %d, %p )\n", handle, index, type );
 
@@ -413,19 +398,20 @@
         release_profile( profile );
         return FALSE;
     }
-    count = MSCMS_get_tag_count( profile->iccprofile );
-    if (index > count || index < 1)
+    num_tags = cmsGetTagCount( profile->cmsprofile );
+    if (num_tags < 0 || index > num_tags || index < 1)
     {
         release_profile( profile );
         return FALSE;
     }
-    MSCMS_get_tag_by_index( profile->iccprofile, index - 1, &tag );
-    *type = tag.sig;
-
+    if ((sig = cmsGetTagSignature( profile->cmsprofile, index - 1 )))
+    {
+        *type = sig;
+        ret = TRUE;
+    }
     release_profile( profile );
-    ret = TRUE;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -450,7 +436,7 @@
 BOOL WINAPI GetColorProfileFromHandle( HPROFILE handle, PBYTE buffer, PDWORD size )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
     PROFILEHEADER header;
 
@@ -463,7 +449,7 @@
         release_profile( profile );
         return FALSE;
     }
-    MSCMS_get_profile_header( profile->iccprofile, &header );
+    get_profile_header( profile, &header );
 
     if (!buffer || header.phSize > *size)
     {
@@ -473,13 +459,13 @@
     }
 
     /* No endian conversion needed */
-    memcpy( buffer, profile->iccprofile, header.phSize );
-    *size = header.phSize;
+    memcpy( buffer, profile->data, profile->size );
+    *size = profile->size;
 
     release_profile( profile );
     ret = TRUE;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -501,7 +487,7 @@
  */
 BOOL WINAPI GetColorProfileHeader( HPROFILE handle, PPROFILEHEADER header )
 {
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
 
     TRACE( "( %p, %p )\n", handle, header );
@@ -513,14 +499,13 @@
         release_profile( profile );
         return FALSE;
     }
-    MSCMS_get_profile_header( profile->iccprofile, header );
-
+    get_profile_header( profile, header );
     release_profile( profile );
     return TRUE;
 
 #else
     return FALSE;
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
 }
 
 /******************************************************************************
@@ -540,8 +525,9 @@
 BOOL WINAPI GetCountColorProfileElements( HPROFILE handle, PDWORD count )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
+    cmsInt32Number num_tags;
 
     TRACE( "( %p, %p )\n", handle, count );
 
@@ -552,12 +538,14 @@
         release_profile( profile );
         return FALSE;
     }
-    *count = MSCMS_get_tag_count( profile->iccprofile );
-
+    if ((num_tags = cmsGetTagCount( profile->cmsprofile )) >= 0)
+    {
+        *count = num_tags;
+        ret = TRUE;
+    }
     release_profile( profile );
-    ret = TRUE;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -1156,10 +1144,8 @@
 BOOL WINAPI IsColorProfileTagPresent( HPROFILE handle, TAGTYPE type, PBOOL present )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
-    DWORD i, count;
-    icTag tag;
 
     TRACE( "( %p, 0x%08x, %p )\n", handle, type, present );
 
@@ -1170,21 +1156,11 @@
         release_profile( profile );
         return FALSE;
     }
-    count = MSCMS_get_tag_count( profile->iccprofile );
-
-    for (i = 0; i < count; i++)
-    {
-        MSCMS_get_tag_by_index( profile->iccprofile, i, &tag );
-
-        if (tag.sig == type)
-        {
-            *present = ret = TRUE;
-            break;
-        }
-    }
+    *present = cmsIsTag( profile->cmsprofile, type );
     release_profile( profile );
+    ret = TRUE;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -1205,7 +1181,7 @@
 BOOL WINAPI IsColorProfileValid( HPROFILE handle, PBOOL valid )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
 
     TRACE( "( %p, %p )\n", handle, valid );
@@ -1217,10 +1193,10 @@
         release_profile( profile );
         return FALSE;
     }
-    if (profile->iccprofile) ret = *valid = TRUE;
+    if (profile->data) ret = *valid = TRUE;
     release_profile( profile );
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -1245,10 +1221,8 @@
                                     PVOID buffer )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
-    DWORD i, count;
-    icTag tag;
 
     TRACE( "( %p, 0x%08x, %d, %p, %p )\n", handle, type, offset, size, buffer );
 
@@ -1259,28 +1233,11 @@
         release_profile( profile );
         return FALSE;
     }
-    count = MSCMS_get_tag_count( profile->iccprofile );
-
-    for (i = 0; i < count; i++)
-    {
-        MSCMS_get_tag_by_index( profile->iccprofile, i, &tag );
-
-        if (tag.sig == type)
-        {
-            if (offset > tag.size)
-            {
-                release_profile( profile );
-                return FALSE;
-            }
-            MSCMS_set_tag_data( profile->iccprofile, &tag, offset, buffer );
-
-            release_profile( profile );
-            return TRUE;
-        }
-    }
+    ret = set_tag_data( profile, type, offset, buffer, size );
     release_profile( profile );
+    return ret;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -1299,7 +1256,7 @@
  */
 BOOL WINAPI SetColorProfileHeader( HPROFILE handle, PPROFILEHEADER header )
 {
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct profile *profile = grab_profile( handle );
 
     TRACE( "( %p, %p )\n", handle, header );
@@ -1311,14 +1268,13 @@
         release_profile( profile );
         return FALSE;
     }
-    MSCMS_set_profile_header( profile->iccprofile, header );
-
+    set_profile_header( profile, header );
     release_profile( profile );
     return TRUE;
 
 #else
     return FALSE;
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
 }
 
 /******************************************************************************
@@ -1439,10 +1395,11 @@
  */
 HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing, DWORD creation )
 {
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     cmsHPROFILE cmsprofile = NULL;
-    icProfile *iccprofile = NULL;
+    char *data = NULL;
     HANDLE handle = INVALID_HANDLE_VALUE;
+    DWORD size;
 
     TRACE( "( %p, 0x%08x, 0x%08x, 0x%08x )\n", profile, access, sharing, creation );
 
@@ -1452,14 +1409,15 @@
     {
         /* FIXME: access flags not implemented for memory based profiles */
 
-        if (!(iccprofile = HeapAlloc( GetProcessHeap(), 0, profile->cbDataSize ))) return NULL;
-        memcpy( iccprofile, profile->pProfileData, profile->cbDataSize );
+        if (!(data = HeapAlloc( GetProcessHeap(), 0, profile->cbDataSize ))) return NULL;
+        memcpy( data, profile->pProfileData, profile->cbDataSize );
 
-        cmsprofile = cmsOpenProfileFromMem( iccprofile, profile->cbDataSize );
+        cmsprofile = cmsOpenProfileFromMem( data, profile->cbDataSize );
+        size = profile->cbDataSize;
     }
     else if (profile->dwType == PROFILE_FILENAME)
     {
-        DWORD size, read, flags = 0;
+        DWORD read, flags = 0;
 
         TRACE( "profile file: %s\n", debugstr_w( profile->pProfileData ) );
 
@@ -1492,32 +1450,27 @@
             WARN( "Unable to open color profile %u\n", GetLastError() );
             return NULL;
         }
-
         if ((size = GetFileSize( handle, NULL )) == INVALID_FILE_SIZE)
         {
             ERR( "Unable to retrieve size of color profile\n" );
             CloseHandle( handle );
             return NULL;
         }
-
-        iccprofile = HeapAlloc( GetProcessHeap(), 0, size );
-        if (!iccprofile)
+        if (!(data = HeapAlloc( GetProcessHeap(), 0, size )))
         {
             ERR( "Unable to allocate memory for color profile\n" );
             CloseHandle( handle );
             return NULL;
         }
-
-        if (!ReadFile( handle, iccprofile, size, &read, NULL ) || read != size)
+        if (!ReadFile( handle, data, size, &read, NULL ) || read != size)
         {
             ERR( "Unable to read color profile\n" );
 
             CloseHandle( handle );
-            HeapFree( GetProcessHeap(), 0, iccprofile );
+            HeapFree( GetProcessHeap(), 0, data );
             return NULL;
         }
-
-        cmsprofile = cmsOpenProfileFromMem( iccprofile, size );
+        cmsprofile = cmsOpenProfileFromMem( data, size );
     }
     else
     {
@@ -1530,18 +1483,19 @@
         struct profile profile;
         HPROFILE hprof;
 
-        profile.file = handle;
-        profile.access = access;
-        profile.iccprofile = iccprofile;
+        profile.file       = handle;
+        profile.access     = access;
+        profile.data       = data;
+        profile.size       = size;
         profile.cmsprofile = cmsprofile;
 
         if ((hprof = create_profile( &profile ))) return hprof;
-        HeapFree( GetProcessHeap(), 0, iccprofile );
+        HeapFree( GetProcessHeap(), 0, data );
         cmsCloseProfile( cmsprofile );
     }
     CloseHandle( handle );
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return NULL;
 }
 
@@ -1560,11 +1514,11 @@
 BOOL WINAPI CloseColorProfile( HPROFILE profile )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
 
     TRACE( "( %p )\n", profile );
     ret = close_profile( profile );
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
diff --git a/dlls/mscms/transform.c b/dlls/mscms/transform.c
index 363400c..56a3232 100644
--- a/dlls/mscms/transform.c
+++ b/dlls/mscms/transform.c
@@ -34,7 +34,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mscms);
 
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
 
 static DWORD from_profile( HPROFILE profile )
 {
@@ -96,7 +96,7 @@
     }
 }
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
 
 /******************************************************************************
  * CreateColorTransformA            [MSCMS.@]
@@ -141,7 +141,7 @@
     HPROFILE target, DWORD flags )
 {
     HTRANSFORM ret = NULL;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct transform transform;
     struct profile *dst, *tgt = NULL;
     cmsHPROFILE cmsinput, cmsoutput, cmstarget = NULL;
@@ -181,7 +181,7 @@
     if (tgt) release_profile( tgt );
     release_profile( dst );
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -205,7 +205,7 @@
     PDWORD intents, DWORD nintents, DWORD flags, DWORD cmm )
 {
     HTRANSFORM ret = NULL;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     cmsHPROFILE *cmsprofiles, cmsconvert = NULL;
     struct transform transform;
     struct profile *profile0, *profile1;
@@ -237,7 +237,7 @@
     {
         /* insert a conversion profile for pairings that lcms doesn't handle */
         if (out_format == TYPE_RGB_16) cmsconvert = cmsCreate_sRGBProfile();
-        if (out_format == TYPE_Lab_16) cmsconvert = cmsCreateLabProfile( NULL );
+        if (out_format == TYPE_Lab_16) cmsconvert = cmsCreateLab2Profile( NULL );
     }
 
     cmsprofiles = HeapAlloc( GetProcessHeap(), 0, (nprofiles + 1) * sizeof(cmsHPROFILE) );
@@ -263,7 +263,7 @@
     release_profile( profile0 );
     release_profile( profile1 );
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -282,13 +282,13 @@
 BOOL WINAPI DeleteColorTransform( HTRANSFORM handle )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
 
     TRACE( "( %p )\n", handle );
 
     ret = close_transform( handle );
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -319,7 +319,7 @@
     DWORD outputstride, PBMCALLBACKFN callback, ULONG data )
 {
     BOOL ret = FALSE;
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     struct transform *transform = grab_transform( handle );
 
     TRACE( "( %p, %p, 0x%08x, 0x%08x, 0x%08x, 0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08x )\n",
@@ -333,7 +333,7 @@
     release_transform( transform );
     ret = TRUE;
 
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
     return ret;
 }
 
@@ -357,7 +357,7 @@
 BOOL WINAPI TranslateColors( HTRANSFORM handle, PCOLOR in, DWORD count,
                              COLORTYPE input_type, PCOLOR out, COLORTYPE output_type )
 {
-#ifdef HAVE_LCMS
+#ifdef HAVE_LCMS2
     BOOL ret = TRUE;
     struct transform *transform = grab_transform( handle );
     cmsHTRANSFORM xfrm;
@@ -462,7 +462,7 @@
     release_transform( transform );
     return ret;
 
-#else  /* HAVE_LCMS */
+#else  /* HAVE_LCMS2 */
     return FALSE;
-#endif /* HAVE_LCMS */
+#endif /* HAVE_LCMS2 */
 }
diff --git a/include/config.h.in b/include/config.h.in
index b2459f0..eb0ea7a 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -271,13 +271,10 @@
 #undef HAVE_LBER_H
 
 /* Define if you have the LittleCMS development environment */
-#undef HAVE_LCMS
+#undef HAVE_LCMS2
 
-/* Define to 1 if you have the <lcms.h> header file. */
-#undef HAVE_LCMS_H
-
-/* Define to 1 if you have the <lcms/lcms.h> header file. */
-#undef HAVE_LCMS_LCMS_H
+/* Define to 1 if you have the <lcms2.h> header file. */
+#undef HAVE_LCMS2_H
 
 /* Define if you have the OpenLDAP development environment */
 #undef HAVE_LDAP
