diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index a54127362114a837f96cc51ecfc565227cb09878..5561fddb9d5ccd80b8860da6b69c615a30111ee0 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -31,6 +31,7 @@
 #include "llapr.h"
 #include "lldir.h"
 #include "llimage.h"
+#include "llimagej2c.h" // for version control
 #include "lllfsthread.h"
 #include "llviewercontrol.h"
 
@@ -938,6 +939,14 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
 F32 LLTextureCache::sHeaderCacheVersion = 1.7f;
 U32 LLTextureCache::sCacheMaxEntries = 1024 * 1024; //~1 million textures.
 S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
+std::string LLTextureCache::sHeaderCacheEncoderVersion = LLImageJ2C::getEngineInfo();
+
+#if defined(ADDRESS_SIZE)
+U32 LLTextureCache::sHeaderCacheAddressSize = ADDRESS_SIZE;
+#else
+U32 LLTextureCache::sHeaderCacheAddressSize = 32;
+#endif
+
 const char* entries_filename = "texture.entries";
 const char* cache_filename = "texture.cache";
 const char* old_textures_dirname = "textures";
@@ -1080,12 +1089,28 @@ void LLTextureCache::readEntriesHeader()
 	}
 	else //create an empty entries header.
 	{
-		mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
-		mHeaderEntriesInfo.mEntries = 0 ;
+		setEntriesHeader();
 		writeEntriesHeader() ;
 	}
 }
 
+void LLTextureCache::setEntriesHeader()
+{
+	if (sHeaderEncoderStringSize < sHeaderCacheEncoderVersion.size() + 1)
+	{
+		// For simplicity we use predefined size of header, so if version string
+		// doesn't fit, either getEngineInfo() returned malformed string or 
+		// sHeaderEncoderStringSize need to be increased.
+		// Also take into accout that c_str() returns additional null character
+		LL_ERRS() << "Version string doesn't fit in header" << LL_ENDL;
+	}
+
+	mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
+	mHeaderEntriesInfo.mAdressSize = sHeaderCacheAddressSize;
+	strcpy(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str());
+	mHeaderEntriesInfo.mEntries = 0;
+}
+
 void LLTextureCache::writeEntriesHeader()
 {
 	llassert_always(mHeaderAPRFile == NULL);
@@ -1439,7 +1464,9 @@ void LLTextureCache::readHeaderCache()
 
 	readEntriesHeader();
 	
-	if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion)
+	if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion
+		|| mHeaderEntriesInfo.mAdressSize != sHeaderCacheAddressSize
+		|| strcmp(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str()) != 0)
 	{
 		if (!mReadOnly)
 		{
@@ -1601,8 +1628,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
 	mUpdatedEntryMap.clear();
 
 	// Info with 0 entries
-	mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
-	mHeaderEntriesInfo.mEntries = 0;
+	setEntriesHeader();
 	writeEntriesHeader();
 
 	LL_INFOS() << "The entire texture cache is cleared." << LL_ENDL ;
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 6ff4c4456828e9bcfa44c2ac69aafc55c170e6bd..95f9afc2bc7fe3a5fd93e0564f68c1e00551f802 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -46,10 +46,13 @@ class LLTextureCache : public LLWorkerThread
 
 private:
 	// Entries
+	static const U32 sHeaderEncoderStringSize = 32;
 	struct EntriesInfo
 	{
-		EntriesInfo() : mVersion(0.f), mEntries(0) {}
+		EntriesInfo() : mVersion(0.f), mAdressSize(0), mEntries(0) { memset(mEncoderVersion, 0, sHeaderEncoderStringSize); }
 		F32 mVersion;
+		U32 mAdressSize;
+		char mEncoderVersion[sHeaderEncoderStringSize];
 		U32 mEntries;
 	};
 	struct Entry
@@ -156,6 +159,7 @@ class LLTextureCache : public LLWorkerThread
 	LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
 	void closeHeaderEntriesFile();
 	void readEntriesHeader();
+	void setEntriesHeader();
 	void writeEntriesHeader();
 	S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
 	bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size);
@@ -224,6 +228,8 @@ class LLTextureCache : public LLWorkerThread
 
 	// Statics
 	static F32 sHeaderCacheVersion;
+	static U32 sHeaderCacheAddressSize;
+	static std::string sHeaderCacheEncoderVersion;
 	static U32 sCacheMaxEntries;
 	static S64 sCacheMaxTexturesSize;
 };
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index fd1d57a9d0d367326e216213eeccf1102d0bc4c8..fb28d9bdb5ab31422705ab7c89c652aef1ae9273 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -1093,11 +1093,21 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
 	}
 	mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES);
 	mMetaInfo.mVersion = cache_version;
+
+#if defined(ADDRESS_SIZE)
+	U32 expected_address = ADDRESS_SIZE;
+#else
+	U32 expected_address = 32;
+#endif
+	mMetaInfo.mAddressSize = expected_address;
+
 	readCacheHeader();	
 
-	if(mMetaInfo.mVersion != cache_version) 
+	if( mMetaInfo.mVersion != cache_version
+		|| mMetaInfo.mAddressSize != expected_address) 
 	{
 		mMetaInfo.mVersion = cache_version ;
+		mMetaInfo.mAddressSize = expected_address;
 		if(mReadOnly) //disable cache
 		{
 			clearCacheInMemory();
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 7aabde1b2da66d2ac36360dcaaf7db9080098efd..230a81fb7632774077e727f3ee5ab4f0b3c20e1f 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -237,9 +237,10 @@ class LLVOCache : public LLSingleton<LLVOCache>
 
 	struct HeaderMetaInfo
 	{
-		HeaderMetaInfo() : mVersion(0){}
+		HeaderMetaInfo() : mVersion(0), mAddressSize(0) {}
 
 		U32 mVersion;
+		U32 mAddressSize;
 	};
 
 	struct header_entry_less