 	
 	public function getMetadata(propertyName:String):String
 	{
+		// when columns change, reset cached metadata
+		if (internalData.triggerCounter != columnCallbacks.triggerCounter)
+		{
+			internalData.triggerCounter = columnCallbacks.triggerCounter;
+			internalData.sourceMetadataCache = {};
+			internalData.deriveStringFromNumber = null;
+		}
+		
 		// since this column is a transposed record, keyType is a custom value
 		if (propertyName == ColumnMetadata.KEY_TYPE)
-			return internalData.keyType;
-		
-		if (metadataName)
-		{
+			return internalData.transposedKeyType;
+		
+		if (sourceMetadataName)
+		{
+			// metadata for transposed metadata columns
 			if (propertyName == ColumnMetadata.TITLE)
 				return propertyName;
 			if (propertyName == ColumnMetadata.DATA_TYPE)

		private function validateKeyType():void
		{
			// make sure keyType is set
			if (internalData.keyType == null)
			{
				var owner:ILinkableHashMap = getLinkableOwner(this) as ILinkableHashMap;
				internalData.keyType = owner ? owner.getName(this) : DataTypes.STRING;
			}
		}
		

			var objects:Array = columns.getObjects();
			
			// update transposed keys to correspond to column names
			internalData.transposedKeys = WeaveAPI.QKeyManager.getQKeys(internalData.transposedKeyType, names);
			
			// update column lookup
			internalData.sourceColumnsArray = objects;
			for (var i:int = 0; i < names.length; i++)
				internalData.sourceColumnNameToIndex[names[i]] = i;
			if (columns.childListCallbacks.lastNameRemoved)
				delete internalData.sourceColumnNameToIndex[columns.childListCallbacks.lastNameRemoved];
			
			setColumnKeySources();
		}
