diff --git a/src/animation/AnimBlendHierarchy.cpp b/src/animation/AnimBlendHierarchy.cpp
index c7800de5..ea669999 100644
--- a/src/animation/AnimBlendHierarchy.cpp
+++ b/src/animation/AnimBlendHierarchy.cpp
@@ -52,8 +52,7 @@ CAnimBlendHierarchy::RemoveQuaternionFlips(void)
 void
 CAnimBlendHierarchy::RemoveAnimSequences(void)
 {
-	if(sequences)
-		delete[] sequences;
+	delete[] sequences;
 	numSequences = 0;
 }
 
diff --git a/src/animation/AnimBlendHierarchy.h b/src/animation/AnimBlendHierarchy.h
index e35b4925..40d2731b 100644
--- a/src/animation/AnimBlendHierarchy.h
+++ b/src/animation/AnimBlendHierarchy.h
@@ -15,7 +15,7 @@ public:
 	char name[24];
 	CAnimBlendSequence *sequences;
 	int16 numSequences;
-	int16 compressed;	// not really used
+	int16 compressed;
 	float totalLength;
 	CLink<CAnimBlendHierarchy*> *linkPtr;
 
diff --git a/src/animation/AnimBlendSequence.cpp b/src/animation/AnimBlendSequence.cpp
index c958b71a..2ae150c1 100644
--- a/src/animation/AnimBlendSequence.cpp
+++ b/src/animation/AnimBlendSequence.cpp
@@ -16,9 +16,10 @@ CAnimBlendSequence::CAnimBlendSequence(void)
 
 CAnimBlendSequence::~CAnimBlendSequence(void)
 {
-	assert(keyFramesCompressed == nil);
 	if(keyFrames)
 		RwFree(keyFrames);
+	if(keyFramesCompressed)
+		RwFree(keyFramesCompressed);
 }
 
 void
diff --git a/src/animation/AnimManager.cpp b/src/animation/AnimManager.cpp
index 877dcd76..e701018e 100644
--- a/src/animation/AnimManager.cpp
+++ b/src/animation/AnimManager.cpp
@@ -841,54 +841,57 @@ CAnimManager::LoadAnimFile(int fd, bool compress)
 				ROUNDSIZE(anim.size);
 				CFileMgr::Read(fd, buf, anim.size);
 				int numFrames = *(int*)(buf+28);
+				seq->SetName(buf);
 #ifdef PED_SKIN
 				if(anim.size == 44)
 					seq->SetBoneTag(*(int*)(buf+40));
 #endif
-				seq->SetName(buf);
 				if(numFrames == 0)
 					continue;
 
+				bool hasScale = false;
+				bool hasTranslation = false;
 				CFileMgr::Read(fd, (char*)&info, sizeof(info));
-				if(strncmp(info.ident, "KR00", 4) == 0){
-					seq->SetNumFrames(numFrames, false);
-					KeyFrame *kf = seq->GetKeyFrame(0);
-					for(l = 0; l < numFrames; l++, kf++){
-						CFileMgr::Read(fd, buf, 0x14);
-						kf->rotation.x = -fbuf[0];
-						kf->rotation.y = -fbuf[1];
-						kf->rotation.z = -fbuf[2];
-						kf->rotation.w = fbuf[3];
-						kf->deltaTime = fbuf[4];	// absolute time here
-					}
+				if(strncmp(info.ident, "KRTS", 4) == 0){
+					hasScale = true;
+					seq->SetNumFrames(numFrames, true);
 				}else if(strncmp(info.ident, "KRT0", 4) == 0){
+					hasTranslation = true;
 					seq->SetNumFrames(numFrames, true);
-					KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
-					for(l = 0; l < numFrames; l++, kf++){
-						CFileMgr::Read(fd, buf, 0x20);
-						kf->rotation.x = -fbuf[0];
-						kf->rotation.y = -fbuf[1];
-						kf->rotation.z = -fbuf[2];
-						kf->rotation.w = fbuf[3];
-						kf->translation.x = fbuf[4];
-						kf->translation.y = fbuf[5];
-						kf->translation.z = fbuf[6];
-						kf->deltaTime = fbuf[7];	// absolute time here
-					}
-				}else if(strncmp(info.ident, "KRTS", 4) == 0){
-					seq->SetNumFrames(numFrames, true);
-					KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
-					for(l = 0; l < numFrames; l++, kf++){
+				}else if(strncmp(info.ident, "KR00", 4) == 0){
+					seq->SetNumFrames(numFrames, false);
+				}
+
+				for(l = 0; l < numFrames; l++){
+					if(hasScale){
 						CFileMgr::Read(fd, buf, 0x2C);
-						kf->rotation.x = -fbuf[0];
-						kf->rotation.y = -fbuf[1];
-						kf->rotation.z = -fbuf[2];
-						kf->rotation.w = fbuf[3];
-						kf->translation.x = fbuf[4];
-						kf->translation.y = fbuf[5];
-						kf->translation.z = fbuf[6];
+						CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
+						rot.Invert();
+						CVector trans(fbuf[4], fbuf[5], fbuf[6]);
+
+						KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
+						kf->rotation = rot;
+						kf->translation = trans;
 						// scaling ignored
 						kf->deltaTime = fbuf[10];	// absolute time here
+					}else if(hasTranslation){
+						CFileMgr::Read(fd, buf, 0x20);
+						CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
+						rot.Invert();
+						CVector trans(fbuf[4], fbuf[5], fbuf[6]);
+
+						KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
+						kf->rotation = rot;
+						kf->translation = trans;
+						kf->deltaTime = fbuf[7];	// absolute time here
+					}else{
+						CFileMgr::Read(fd, buf, 0x14);
+						CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
+						rot.Invert();
+
+						KeyFrame *kf = (KeyFrame*)seq->GetKeyFrame(l);
+						kf->rotation = rot;
+						kf->deltaTime = fbuf[4];	// absolute time here
 					}
 				}
 
diff --git a/src/animation/RpAnimBlend.cpp b/src/animation/RpAnimBlend.cpp
index dcb656ee..e430e52a 100644
--- a/src/animation/RpAnimBlend.cpp
+++ b/src/animation/RpAnimBlend.cpp
@@ -8,6 +8,7 @@
 #include "AnimBlendClumpData.h"
 #include "AnimBlendHierarchy.h"
 #include "AnimBlendAssociation.h"
+#include "AnimManager.h"
 #include "RpAnimBlend.h"
 #ifdef PED_SKIN
 #include "PedModelInfo.h"
@@ -441,7 +442,7 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
 		next = link->next;
 		CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
 		if(assoc->UpdateBlend(timeDelta)){
-			// CAnimManager::UncompressAnimation(v6->hierarchy)
+			CAnimManager::UncompressAnimation(assoc->hierarchy);
 			updateData.nodes[i++] = assoc->GetNode(0);
 			if(assoc->flags & ASSOC_MOVEMENT){
 				totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
diff --git a/src/math/Quaternion.h b/src/math/Quaternion.h
index a5a34626..47c94f7c 100644
--- a/src/math/Quaternion.h
+++ b/src/math/Quaternion.h
@@ -12,6 +12,11 @@ public:
 	float MagnitudeSqr(void) const { return x*x + y*y + z*z + w*w; }
 	void Normalise(void);
 	void Multiply(const CQuaternion &q1, const CQuaternion &q2);
+	void Invert(void){	// Conjugate would have been a better name
+		x = -x;
+		y = -y;
+		z = -z;
+	}
 
 	const CQuaternion &operator+=(CQuaternion const &right) {
 		x += right.x;