Index: /Cheat Engine/frmReferencedStringsUnit.pas
===================================================================
--- /Cheat Engine/frmReferencedStringsUnit.pas (revision 300)
+++ /Cheat Engine/frmReferencedStringsUnit.pas (revision 312)
@@ -259,5 +259,5 @@
       stringlist.Objects[i]:=nil;
     end;
-    stringlist.Free;
+    freeandnil(stringlist);
   end;
 
Index: /Cheat Engine/cheatengine.drc
===================================================================
--- /Cheat Engine/cheatengine.drc (revision 311)
+++ /Cheat Engine/cheatengine.drc (revision 312)
@@ -9,159 +9,159 @@
 */
 
-#define AdvancedOptionsUnit_strCode 64944
-#define AdvancedOptionsUnit_strFindWhatCodeaccesses 64945
-#define AdvancedOptionsUnit_strFindWhatCodeReads 64946
-#define AdvancedOptionsUnit_strFindWhatCodeWrites 64947
-#define AdvancedOptionsUnit_strcouldntrestorecode 64948
-#define AdvancedOptionsUnit_strnotthesame 64949
-#define AdvancedOptionsUnit_strcouldntwrite 64950
-#define AdvancedOptionsUnit_StrSelectExeFor3D 64951
-#define AdvancedOptionsUnit_StrSelectExeForOpenGL3D 64952
-#define formsettingsunit_strProcessWatcherWillPreventUnloader 64953
-#define FoundCodeUnit_strClose 64954
-#define MainUnit_strIncorrectspeed 64960
-#define MainUnit_strCantSetSpeed 64961
-#define MainUnit_strHyperscanFailed 64962
-#define MainUnit_strUnknownExtension 64963
-#define MainUnit_strCustomScanConfig 64964
-#define frmFindstaticsUnit_strScan 64965
-#define frmFindstaticsUnit_strStop 64966
-#define frmFindstaticsUnit_strStopping 64967
-#define frmLoadMemoryunit_strinvalidfile 64968
-#define AdvancedOptionsUnit_strnotreadable 64969
-#define AdvancedOptionsUnit_strNotWhatitshouldbe 64970
-#define AdvancedOptionsUnit_stralreadyinthelist 64971
-#define AdvancedOptionsUnit_strPartOfOpcodeInTheList 64972
-#define AdvancedOptionsUnit_strCECode 64973
-#define AdvancedOptionsUnit_strNameCECode 64974
-#define AdvancedOptionsUnit_strChangeOf 64975
-#define MainUnit_strFindWhatWritesToPointer 64976
-#define MainUnit_strFindWhatWritesToPointer2 64977
-#define MainUnit_strcantdebugnow 64978
-#define MainUnit_strpointercantberead 64979
-#define MainUnit_strconfirmUndo 64980
-#define MainUnit_strHideForeground 64981
-#define MainUnit_strHideAll 64982
-#define MainUnit_strUnHideForeground 64983
-#define MainUnit_strUnhideAll 64984
-#define MainUnit_strhappybirthday 64985
-#define MainUnit_strXMess 64986
-#define MainUnit_strNewyear 64987
-#define MainUnit_strfuture 64988
-#define MainUnit_strdontbother 64989
-#define MainUnit_strneeddebugger 64990
-#define MainUnit_strfailuretosetspeed 64991
-#define MainUnit_stralreadyin 64992
-#define MainUnit_stralreadyinlistmultiple 64993
-#define MainUnit_strsethotkey 64994
-#define MainUnit_strshowasdecimal 64995
-#define MainUnit_strshowashex 64996
-#define MainUnit_strFreezeAddressInList 64997
-#define MainUnit_strFreezeAllAddresses 64998
-#define MainUnit_strUnfreezeAllAddresses 64999
-#define MainUnit_strUnfreezeAddressInList 65000
-#define MainUnit_strDeleteAddress 65001
-#define MainUnit_strRecalculateAddress 65002
-#define MainUnit_strRecalculateSelectedAddresses 65003
-#define MainUnit_strRecalculateAllAddresses 65004
-#define MainUnit_strRemoveFromGroup 65005
-#define MainUnit_strEnableCheat 65006
-#define MainUnit_strDisableCheat 65007
-#define MainUnit_strAdd0 65008
-#define MainUnit_strNotAValidNotation 65009
-#define MainUnit_strNotSameAmmountofBytes 65010
-#define MainUnit_strNotAValidBinaryNotation 65011
-#define MainUnit_strValue 65012
-#define MainUnit_strChange1Value 65013
-#define MainUnit_strChangeMoreValues 65014
-#define MainUnit_strDelete1Address 65015
-#define MainUnit_strDeleteMultipleAddresses 65016
-#define MainUnit_strDelete1Group 65017
-#define MainUnit_strDeleteMoreGroups 65018
-#define MainUnit_strSelectedAddressIsAPointer 65019
-#define MainUnit_strMorePointers 65020
-#define MainUnit_strMorePointers2 65021
-#define MainUnit_strNotAValidValue 65022
-#define MainUnit_strdeleteall 65023
-#define MainUnit_strsearchForText 65024
-#define MainUnit_strSearchForArray 65025
-#define MainUnit_strConfirmProcessTermination 65026
-#define MainUnit_strError 65027
-#define MainUnit_strErrorwhileOpeningProcess 65028
-#define MainUnit_strKeepList 65029
-#define MainUnit_strInfoAboutTable 65030
-#define MainUnit_strPhysicalMemory 65031
-#define MainUnit_strfillInSomething 65032
-#define MainUnit_strFirstSelectAProcess 65033
-#define MainUnit_strCantdoNextScan 65034
-#define MainUnit_strClickToGoHome 65035
-#define MainUnit_strChangeDescription1 65036
-#define MainUnit_strChangeDescription2 65037
-#define MainUnit_strNotTheSameSize1 65038
-#define MainUnit_strNotTheSameSize2 65039
-#define SynEditStrConst_SYNS_EDuplicateShortcut 65040
-#define SynEditStrConst_SYNS_FilterPascal 65041
-#define SynEditStrConst_SYNS_FilterCPP 65042
-#define SynEditStrConst_SYNS_LangCPP 65043
-#define SynEditStrConst_SYNS_LangPascal 65044
-#define SynEditTextBuffer_SListIndexOutOfBounds 65045
-#define SynEditTextBuffer_SInvalidCapacity 65046
-#define MainUnit_strWindowFailedToHide 65047
-#define MainUnit_strAccessed 65048
-#define MainUnit_strOpcodeChanged 65049
-#define MainUnit_strAllowNegative 65050
-#define MainUnit_strAllowPositive 65051
-#define MainUnit_strNormalFreeze 65052
-#define MainUnit_strAskToSave 65053
-#define MainUnit_strScantextcaptiontotext 65054
-#define MainUnit_strScantextcaptiontoValue 65055
-#define SynEditStrConst_SYNS_AttrAssembler 65056
-#define SynEditStrConst_SYNS_AttrCharacter 65057
-#define SynEditStrConst_SYNS_AttrComment 65058
-#define SynEditStrConst_SYNS_AttrFloat 65059
-#define SynEditStrConst_SYNS_AttrHexadecimal 65060
-#define SynEditStrConst_SYNS_AttrIdentifier 65061
-#define SynEditStrConst_SYNS_AttrIllegalChar 65062
-#define SynEditStrConst_SYNS_AttrNumber 65063
-#define SynEditStrConst_SYNS_AttrOctal 65064
-#define SynEditStrConst_SYNS_AttrPreprocessor 65065
-#define SynEditStrConst_SYNS_AttrReservedWord 65066
-#define SynEditStrConst_SYNS_AttrSpace 65067
-#define SynEditStrConst_SYNS_AttrString 65068
-#define SynEditStrConst_SYNS_AttrSymbol 65069
-#define SynEditStrConst_SYNS_ScrollInfoFmt 65070
-#define SynEditStrConst_SYNS_ScrollInfoFmtTop 65071
-#define MainUnit2_strIncreasedValue 65072
-#define MainUnit2_strIncreasedValueBy 65073
-#define MainUnit2_strDecreasedValue 65074
-#define MainUnit2_strDecreasedValueBy 65075
-#define MainUnit2_strValueBetween 65076
-#define MainUnit2_strChangedValue 65077
-#define MainUnit2_strUnchangedValue 65078
-#define MainUnit2_strUnknownInitialValue 65079
-#define MainUnit2_strSameAsFirstScan 65080
-#define MainUnit2_strtoolong 65081
-#define OpenSave_strunknowncomponent 65082
-#define OpenSave_strCorruptIcon 65083
-#define OpenSave_strCantLoadFilepatcher 65084
-#define OpenSave_strNotACETrainer 65085
-#define OpenSave_strUnknownTrainerVersion 65086
-#define OpenSave_strCantLoadProtectedfile 65087
+#define MainUnit_strXMess 64944
+#define MainUnit_strNewyear 64945
+#define MainUnit_strfuture 64946
+#define MainUnit_strdontbother 64947
+#define MainUnit_strneeddebugger 64948
+#define MainUnit_strfailuretosetspeed 64949
+#define MainUnit_strIncorrectspeed 64950
+#define MainUnit_strCantSetSpeed 64951
+#define MainUnit_strHyperscanFailed 64952
+#define MainUnit_strUnknownExtension 64953
+#define MainUnit_strCustomScanConfig 64954
+#define MainUnit_strRecalculateAddress 64960
+#define MainUnit_strRecalculateSelectedAddresses 64961
+#define MainUnit_strRecalculateAllAddresses 64962
+#define MainUnit_strRemoveFromGroup 64963
+#define MainUnit_strEnableCheat 64964
+#define MainUnit_strDisableCheat 64965
+#define MainUnit_strFindWhatWritesToPointer 64966
+#define MainUnit_strFindWhatWritesToPointer2 64967
+#define MainUnit_strcantdebugnow 64968
+#define MainUnit_strpointercantberead 64969
+#define MainUnit_strconfirmUndo 64970
+#define MainUnit_strHideForeground 64971
+#define MainUnit_strHideAll 64972
+#define MainUnit_strUnHideForeground 64973
+#define MainUnit_strUnhideAll 64974
+#define MainUnit_strhappybirthday 64975
+#define MainUnit_strDeleteMoreGroups 64976
+#define MainUnit_strSelectedAddressIsAPointer 64977
+#define MainUnit_strMorePointers 64978
+#define MainUnit_strMorePointers2 64979
+#define MainUnit_strNotAValidValue 64980
+#define MainUnit_strdeleteall 64981
+#define MainUnit_stralreadyin 64982
+#define MainUnit_stralreadyinlistmultiple 64983
+#define MainUnit_strsethotkey 64984
+#define MainUnit_strshowasdecimal 64985
+#define MainUnit_strshowashex 64986
+#define MainUnit_strFreezeAddressInList 64987
+#define MainUnit_strFreezeAllAddresses 64988
+#define MainUnit_strUnfreezeAllAddresses 64989
+#define MainUnit_strUnfreezeAddressInList 64990
+#define MainUnit_strDeleteAddress 64991
+#define MainUnit_strCantdoNextScan 64992
+#define MainUnit_strClickToGoHome 64993
+#define MainUnit_strChangeDescription1 64994
+#define MainUnit_strChangeDescription2 64995
+#define MainUnit_strNotTheSameSize1 64996
+#define MainUnit_strNotTheSameSize2 64997
+#define MainUnit_strAdd0 64998
+#define MainUnit_strNotAValidNotation 64999
+#define MainUnit_strNotSameAmmountofBytes 65000
+#define MainUnit_strNotAValidBinaryNotation 65001
+#define MainUnit_strValue 65002
+#define MainUnit_strChange1Value 65003
+#define MainUnit_strChangeMoreValues 65004
+#define MainUnit_strDelete1Address 65005
+#define MainUnit_strDeleteMultipleAddresses 65006
+#define MainUnit_strDelete1Group 65007
+#define MainUnit_strAllowNegative 65008
+#define MainUnit_strAllowPositive 65009
+#define MainUnit_strNormalFreeze 65010
+#define MainUnit_strAskToSave 65011
+#define MainUnit_strScantextcaptiontotext 65012
+#define MainUnit_strScantextcaptiontoValue 65013
+#define MainUnit_strsearchForText 65014
+#define MainUnit_strSearchForArray 65015
+#define MainUnit_strConfirmProcessTermination 65016
+#define MainUnit_strError 65017
+#define MainUnit_strErrorwhileOpeningProcess 65018
+#define MainUnit_strKeepList 65019
+#define MainUnit_strInfoAboutTable 65020
+#define MainUnit_strPhysicalMemory 65021
+#define MainUnit_strfillInSomething 65022
+#define MainUnit_strFirstSelectAProcess 65023
+#define MainUnit2_strbiggerThan 65024
+#define MainUnit2_strSmallerThan 65025
+#define MainUnit2_strIncreasedValue 65026
+#define MainUnit2_strIncreasedValueBy 65027
+#define MainUnit2_strDecreasedValue 65028
+#define MainUnit2_strDecreasedValueBy 65029
+#define MainUnit2_strValueBetween 65030
+#define MainUnit2_strChangedValue 65031
+#define MainUnit2_strUnchangedValue 65032
+#define MainUnit2_strUnknownInitialValue 65033
+#define MainUnit2_strSameAsFirstScan 65034
+#define MainUnit2_strtoolong 65035
+#define FoundCodeUnit_strClose 65036
+#define MainUnit_strWindowFailedToHide 65037
+#define MainUnit_strAccessed 65038
+#define MainUnit_strOpcodeChanged 65039
+#define AdvancedOptionsUnit_strcouldntwrite 65040
+#define AdvancedOptionsUnit_StrSelectExeFor3D 65041
+#define AdvancedOptionsUnit_StrSelectExeForOpenGL3D 65042
+#define formsettingsunit_strProcessWatcherWillPreventUnloader 65043
+#define MainUnit2_strStart 65044
+#define MainUnit2_strStop 65045
+#define MainUnit2_strOK 65046
+#define MainUnit2_strBug 65047
+#define MainUnit2_strAutoAssemble 65048
+#define MainUnit2_strAddressHasToBeReadable 65049
+#define MainUnit2_strNewScan 65050
+#define MainUnit2_strFirstScan 65051
+#define MainUnit2_strNoDescription 65052
+#define MainUnit2_strNeedNewerWindowsVersion 65053
+#define MainUnit2_strexact 65054
+#define MainUnit2_strexactvalue 65055
+#define frmFindstaticsUnit_strStop 65056
+#define frmFindstaticsUnit_strStopping 65057
+#define frmLoadMemoryunit_strinvalidfile 65058
+#define AdvancedOptionsUnit_strnotreadable 65059
+#define AdvancedOptionsUnit_strNotWhatitshouldbe 65060
+#define AdvancedOptionsUnit_stralreadyinthelist 65061
+#define AdvancedOptionsUnit_strPartOfOpcodeInTheList 65062
+#define AdvancedOptionsUnit_strCECode 65063
+#define AdvancedOptionsUnit_strNameCECode 65064
+#define AdvancedOptionsUnit_strChangeOf 65065
+#define AdvancedOptionsUnit_strCode 65066
+#define AdvancedOptionsUnit_strFindWhatCodeaccesses 65067
+#define AdvancedOptionsUnit_strFindWhatCodeReads 65068
+#define AdvancedOptionsUnit_strFindWhatCodeWrites 65069
+#define AdvancedOptionsUnit_strcouldntrestorecode 65070
+#define AdvancedOptionsUnit_strnotthesame 65071
+#define SynEditStrConst_SYNS_AttrOctal 65072
+#define SynEditStrConst_SYNS_AttrPreprocessor 65073
+#define SynEditStrConst_SYNS_AttrReservedWord 65074
+#define SynEditStrConst_SYNS_AttrSpace 65075
+#define SynEditStrConst_SYNS_AttrString 65076
+#define SynEditStrConst_SYNS_AttrSymbol 65077
+#define SynEditStrConst_SYNS_ScrollInfoFmt 65078
+#define SynEditStrConst_SYNS_ScrollInfoFmtTop 65079
+#define SynEditStrConst_SYNS_EDuplicateShortcut 65080
+#define SynEditStrConst_SYNS_FilterPascal 65081
+#define SynEditStrConst_SYNS_FilterCPP 65082
+#define SynEditStrConst_SYNS_LangCPP 65083
+#define SynEditStrConst_SYNS_LangPascal 65084
+#define SynEditTextBuffer_SListIndexOutOfBounds 65085
+#define SynEditTextBuffer_SInvalidCapacity 65086
+#define frmFindstaticsUnit_strScan 65087
 #define XMLConst_SMissingFileName 65088
 #define XMLConst_SLine 65089
-#define MainUnit2_strStart 65090
-#define MainUnit2_strStop 65091
-#define MainUnit2_strOK 65092
-#define MainUnit2_strBug 65093
-#define MainUnit2_strAutoAssemble 65094
-#define MainUnit2_strAddressHasToBeReadable 65095
-#define MainUnit2_strNewScan 65096
-#define MainUnit2_strFirstScan 65097
-#define MainUnit2_strNoDescription 65098
-#define MainUnit2_strNeedNewerWindowsVersion 65099
-#define MainUnit2_strexact 65100
-#define MainUnit2_strexactvalue 65101
-#define MainUnit2_strbiggerThan 65102
-#define MainUnit2_strSmallerThan 65103
+#define OpenSave_strunknowncomponent 65090
+#define OpenSave_strCorruptIcon 65091
+#define OpenSave_strCantLoadFilepatcher 65092
+#define OpenSave_strNotACETrainer 65093
+#define OpenSave_strUnknownTrainerVersion 65094
+#define OpenSave_strCantLoadProtectedfile 65095
+#define SynEditStrConst_SYNS_AttrAssembler 65096
+#define SynEditStrConst_SYNS_AttrCharacter 65097
+#define SynEditStrConst_SYNS_AttrComment 65098
+#define SynEditStrConst_SYNS_AttrFloat 65099
+#define SynEditStrConst_SYNS_AttrHexadecimal 65100
+#define SynEditStrConst_SYNS_AttrIdentifier 65101
+#define SynEditStrConst_SYNS_AttrIllegalChar 65102
+#define SynEditStrConst_SYNS_AttrNumber 65103
 #define XMLConst_SDuplicateRegistration 65104
 #define XMLConst_SNoMatchingDOMVendor 65105
@@ -598,15 +598,10 @@
 STRINGTABLE
 BEGIN
-	AdvancedOptionsUnit_strCode,	"Code :"
-	AdvancedOptionsUnit_strFindWhatCodeaccesses,	"Find out what addresses this code accesses"
-	AdvancedOptionsUnit_strFindWhatCodeReads,	"Find out what addresses this code reads from"
-	AdvancedOptionsUnit_strFindWhatCodeWrites,	"Find out what addresses this code writes to"
-	AdvancedOptionsUnit_strcouldntrestorecode,	"Error when trying to restore this code!"
-	AdvancedOptionsUnit_strnotthesame,	"The memory at this address isn't what it should be! Continue?"
-	AdvancedOptionsUnit_strcouldntwrite,	"The memory at this address couldn't be written"
-	AdvancedOptionsUnit_StrSelectExeFor3D,	"Select the executable of the Direct-3D game"
-	AdvancedOptionsUnit_StrSelectExeForOpenGL3D,	"Select the executable of the OpenGL game"
-	formsettingsunit_strProcessWatcherWillPreventUnloader,	"Enabling the process watcher will prevent the unloader from working"
-	FoundCodeUnit_strClose,	"Close"
+	MainUnit_strXMess,	"Merry christmas and happy new year"
+	MainUnit_strNewyear,	"And what are your good intentions for this year? ;-)"
+	MainUnit_strfuture,	"Wow,I never imagined people would use Cheat Engine up to today"
+	MainUnit_strdontbother,	"Don't even bother. Cheat Engine uses the main thread to receive messages when the scan is done, freeze it and CE will crash!"
+	MainUnit_strneeddebugger,	"To use this option the debugger must be attached to the game"
+	MainUnit_strfailuretosetspeed,	"Failure to set the speed"
 	MainUnit_strIncorrectspeed,	"The speed value is incorrect"
 	MainUnit_strCantSetSpeed,	"I can't set this speed. (must be bigger than 0)"
@@ -614,15 +609,10 @@
 	MainUnit_strUnknownExtension,	"Unknown extension"
 	MainUnit_strCustomScanConfig,	"Custom scan config"
-	frmFindstaticsUnit_strScan,	"Scan"
-	frmFindstaticsUnit_strStop,	"Stop"
-	frmFindstaticsUnit_strStopping,	"Stopping..."
-	frmLoadMemoryunit_strinvalidfile,	"This is a invalid memory region file. I'll assume this file has no header data"
-	AdvancedOptionsUnit_strnotreadable,	"This address is not readable"
-	AdvancedOptionsUnit_strNotWhatitshouldbe,	"The memory at this address is'nt what it should be! Continue?"
-	AdvancedOptionsUnit_stralreadyinthelist,	"This byte is already part of another opcode already present in the list"
-	AdvancedOptionsUnit_strPartOfOpcodeInTheList,	"At least one of these bytes is already in the list"
-	AdvancedOptionsUnit_strCECode,	"Cheat Engine code:"
-	AdvancedOptionsUnit_strNameCECode,	"What name do you want to give this code?"
-	AdvancedOptionsUnit_strChangeOf,	"Change of "
+	MainUnit_strRecalculateAddress,	"Recalculate address"
+	MainUnit_strRecalculateSelectedAddresses,	"Recalculate selected addresses"
+	MainUnit_strRecalculateAllAddresses,	"Recalculate all addresses"
+	MainUnit_strRemoveFromGroup,	"Remove from group "
+	MainUnit_strEnableCheat,	"Enable cheat"
+	MainUnit_strDisableCheat,	"Disable cheat"
 	MainUnit_strFindWhatWritesToPointer,	"Find out what writes to this pointer"
 	MainUnit_strFindWhatWritesToPointer2,	"Find what reads from the address pointed at by this pointer"
@@ -635,10 +625,10 @@
 	MainUnit_strUnhideAll,	"will bring all windows back"
 	MainUnit_strhappybirthday,	"Let's sing Happy Birthday for Dark Byte today!"
-	MainUnit_strXMess,	"Merry christmas and happy new year"
-	MainUnit_strNewyear,	"And what are your good intentions for this year? ;-)"
-	MainUnit_strfuture,	"Wow,I never imagined people would use Cheat Engine up to today"
-	MainUnit_strdontbother,	"Don't even bother. Cheat Engine uses the main thread to receive messages when the scan is done, freeze it and CE will crash!"
-	MainUnit_strneeddebugger,	"To use this option the debugger must be attached to the game"
-	MainUnit_strfailuretosetspeed,	"Failure to set the speed"
+	MainUnit_strDeleteMoreGroups,	"Also delete the groups of the addresses you selected?"
+	MainUnit_strSelectedAddressIsAPointer,	"The selected address is a pointer. Are you sure? (the base pointer will get the address)"
+	MainUnit_strMorePointers,	"There are more pointers selected. Do you want to change them as well?"
+	MainUnit_strMorePointers2,	"You have selected one or more pointers. Do you want to change them as well?"
+	MainUnit_strNotAValidValue,	"This is not an valid value"
+	MainUnit_strdeleteall,	"Are you sure you want to delete all addresses?"
 	MainUnit_stralreadyin,	"This address is already in the list"
 	MainUnit_stralreadyinlistmultiple,	"One or more addresses where already in the list"
@@ -651,10 +641,10 @@
 	MainUnit_strUnfreezeAddressInList,	"Unfreeze the address in this list"
 	MainUnit_strDeleteAddress,	"Delete this address"
-	MainUnit_strRecalculateAddress,	"Recalculate address"
-	MainUnit_strRecalculateSelectedAddresses,	"Recalculate selected addresses"
-	MainUnit_strRecalculateAllAddresses,	"Recalculate all addresses"
-	MainUnit_strRemoveFromGroup,	"Remove from group "
-	MainUnit_strEnableCheat,	"Enable cheat"
-	MainUnit_strDisableCheat,	"Disable cheat"
+	MainUnit_strCantdoNextScan,	"You can't do a Next Scan with the current selected way of scanning!"
+	MainUnit_strClickToGoHome,	"Click here to go to the Cheat Engine homepage"
+	MainUnit_strChangeDescription1,	"Description"
+	MainUnit_strChangeDescription2,	"Change the description to:"
+	MainUnit_strNotTheSameSize1,	"The text you entered isn't the same size as the original. Continue?"
+	MainUnit_strNotTheSameSize2,	"Not the same size!"
 	MainUnit_strAdd0,	"Do you want to add a '0'-terminator at the end?"
 	MainUnit_strNotAValidNotation,	"This is not a valid notation"
@@ -667,10 +657,10 @@
 	MainUnit_strDeleteMultipleAddresses,	"Delete these addresses?"
 	MainUnit_strDelete1Group,	"Also delete the group this address is a member of?"
-	MainUnit_strDeleteMoreGroups,	"Also delete the groups of the addresses you selected?"
-	MainUnit_strSelectedAddressIsAPointer,	"The selected address is a pointer. Are you sure? (the base pointer will get the address)"
-	MainUnit_strMorePointers,	"There are more pointers selected. Do you want to change them as well?"
-	MainUnit_strMorePointers2,	"You have selected one or more pointers. Do you want to change them as well?"
-	MainUnit_strNotAValidValue,	"This is not an valid value"
-	MainUnit_strdeleteall,	"Are you sure you want to delete all addresses?"
+	MainUnit_strAllowNegative,	"Allow negative changes"
+	MainUnit_strAllowPositive,	"Allow positive changes"
+	MainUnit_strNormalFreeze,	"Don't allow any change"
+	MainUnit_strAskToSave,	"You haven't saved your last changes yet. Save Now?"
+	MainUnit_strScantextcaptiontotext,	"Text:"
+	MainUnit_strScantextcaptiontoValue,	"Value:"
 	MainUnit_strsearchForText,	"Search for text"
 	MainUnit_strSearchForArray,	"Search for this array"
@@ -683,42 +673,6 @@
 	MainUnit_strfillInSomething,	"Please fill in something!"
 	MainUnit_strFirstSelectAProcess,	"First select a process"
-	MainUnit_strCantdoNextScan,	"You can't do a Next Scan with the current selected way of scanning!"
-	MainUnit_strClickToGoHome,	"Click here to go to the Cheat Engine homepage"
-	MainUnit_strChangeDescription1,	"Description"
-	MainUnit_strChangeDescription2,	"Change the description to:"
-	MainUnit_strNotTheSameSize1,	"The text you entered isn't the same size as the original. Continue?"
-	MainUnit_strNotTheSameSize2,	"Not the same size!"
-	SynEditStrConst_SYNS_EDuplicateShortcut,	"Shortcut already exists"
-	SynEditStrConst_SYNS_FilterPascal,	"Pascal Files (*.pas;*.pp;*.dpr;*.dpk;*.inc)|*.pas;*.pp;*.dpr;*.dpk;*.inc"
-	SynEditStrConst_SYNS_FilterCPP,	"C/C++ Files (*.c;*.cpp;*.h;*.hpp)|*.c;*.cpp;*.h;*.hpp"
-	SynEditStrConst_SYNS_LangCPP,	"C/C++"
-	SynEditStrConst_SYNS_LangPascal,	"Object Pascal"
-	SynEditTextBuffer_SListIndexOutOfBounds,	"Invalid stringlist index %d"
-	SynEditTextBuffer_SInvalidCapacity,	"Stringlist capacity cannot be smaller than count"
-	MainUnit_strWindowFailedToHide,	"A window failed to hide"
-	MainUnit_strAccessed,	"The following opcodes accessed the selected address"
-	MainUnit_strOpcodeChanged,	"The following opcodes changed the selected address"
-	MainUnit_strAllowNegative,	"Allow negative changes"
-	MainUnit_strAllowPositive,	"Allow positive changes"
-	MainUnit_strNormalFreeze,	"Don't allow any change"
-	MainUnit_strAskToSave,	"You haven't saved your last changes yet. Save Now?"
-	MainUnit_strScantextcaptiontotext,	"Text:"
-	MainUnit_strScantextcaptiontoValue,	"Value:"
-	SynEditStrConst_SYNS_AttrAssembler,	"Assembler"
-	SynEditStrConst_SYNS_AttrCharacter,	"Character"
-	SynEditStrConst_SYNS_AttrComment,	"Comment"
-	SynEditStrConst_SYNS_AttrFloat,	"Float"
-	SynEditStrConst_SYNS_AttrHexadecimal,	"Hexadecimal"
-	SynEditStrConst_SYNS_AttrIdentifier,	"Identifier"
-	SynEditStrConst_SYNS_AttrIllegalChar,	"Illegal Char"
-	SynEditStrConst_SYNS_AttrNumber,	"Number"
-	SynEditStrConst_SYNS_AttrOctal,	"Octal"
-	SynEditStrConst_SYNS_AttrPreprocessor,	"Preprocessor"
-	SynEditStrConst_SYNS_AttrReservedWord,	"Reserved Word"
-	SynEditStrConst_SYNS_AttrSpace,	"Space"
-	SynEditStrConst_SYNS_AttrString,	"String"
-	SynEditStrConst_SYNS_AttrSymbol,	"Symbol"
-	SynEditStrConst_SYNS_ScrollInfoFmt,	"%d - %d"
-	SynEditStrConst_SYNS_ScrollInfoFmtTop,	"Top Line: %d"
+	MainUnit2_strbiggerThan,	"Bigger than..."
+	MainUnit2_strSmallerThan,	"Smaller than..."
 	MainUnit2_strIncreasedValue,	"Increased value"
 	MainUnit2_strIncreasedValueBy,	"Increased value by ..."
@@ -731,12 +685,12 @@
 	MainUnit2_strSameAsFirstScan,	"Same as first scan"
 	MainUnit2_strtoolong,	"Too long"
-	OpenSave_strunknowncomponent,	"There is a unknown component in the trainer! compnr="
-	OpenSave_strCorruptIcon,	"The icon has been corrupted"
-	OpenSave_strCantLoadFilepatcher,	"The file patcher can't be loaded by Cheat Engine!"
-	OpenSave_strNotACETrainer,	"This is not a trainer made by Cheat Engine (If it is a trainer at all!)"
-	OpenSave_strUnknownTrainerVersion,	"This version of Cheat Engine doesn't know how to read this trainer! Trainerversion="
-	OpenSave_strCantLoadProtectedfile,	"This trainer is protected from being opened by CE. Now go away!!!"
-	XMLConst_SMissingFileName,	"FileName cannot be blank"
-	XMLConst_SLine,	"Line"
+	FoundCodeUnit_strClose,	"Close"
+	MainUnit_strWindowFailedToHide,	"A window failed to hide"
+	MainUnit_strAccessed,	"The following opcodes accessed the selected address"
+	MainUnit_strOpcodeChanged,	"The following opcodes changed the selected address"
+	AdvancedOptionsUnit_strcouldntwrite,	"The memory at this address couldn't be written"
+	AdvancedOptionsUnit_StrSelectExeFor3D,	"Select the executable of the Direct-3D game"
+	AdvancedOptionsUnit_StrSelectExeForOpenGL3D,	"Select the executable of the OpenGL game"
+	formsettingsunit_strProcessWatcherWillPreventUnloader,	"Enabling the process watcher will prevent the unloader from working"
 	MainUnit2_strStart,	"Start"
 	MainUnit2_strStop,	"Stop"
@@ -751,6 +705,52 @@
 	MainUnit2_strexact,	"Exact"
 	MainUnit2_strexactvalue,	"Exact Value"
-	MainUnit2_strbiggerThan,	"Bigger than..."
-	MainUnit2_strSmallerThan,	"Smaller than..."
+	frmFindstaticsUnit_strStop,	"Stop"
+	frmFindstaticsUnit_strStopping,	"Stopping..."
+	frmLoadMemoryunit_strinvalidfile,	"This is a invalid memory region file. I'll assume this file has no header data"
+	AdvancedOptionsUnit_strnotreadable,	"This address is not readable"
+	AdvancedOptionsUnit_strNotWhatitshouldbe,	"The memory at this address is'nt what it should be! Continue?"
+	AdvancedOptionsUnit_stralreadyinthelist,	"This byte is already part of another opcode already present in the list"
+	AdvancedOptionsUnit_strPartOfOpcodeInTheList,	"At least one of these bytes is already in the list"
+	AdvancedOptionsUnit_strCECode,	"Cheat Engine code:"
+	AdvancedOptionsUnit_strNameCECode,	"What name do you want to give this code?"
+	AdvancedOptionsUnit_strChangeOf,	"Change of "
+	AdvancedOptionsUnit_strCode,	"Code :"
+	AdvancedOptionsUnit_strFindWhatCodeaccesses,	"Find out what addresses this code accesses"
+	AdvancedOptionsUnit_strFindWhatCodeReads,	"Find out what addresses this code reads from"
+	AdvancedOptionsUnit_strFindWhatCodeWrites,	"Find out what addresses this code writes to"
+	AdvancedOptionsUnit_strcouldntrestorecode,	"Error when trying to restore this code!"
+	AdvancedOptionsUnit_strnotthesame,	"The memory at this address isn't what it should be! Continue?"
+	SynEditStrConst_SYNS_AttrOctal,	"Octal"
+	SynEditStrConst_SYNS_AttrPreprocessor,	"Preprocessor"
+	SynEditStrConst_SYNS_AttrReservedWord,	"Reserved Word"
+	SynEditStrConst_SYNS_AttrSpace,	"Space"
+	SynEditStrConst_SYNS_AttrString,	"String"
+	SynEditStrConst_SYNS_AttrSymbol,	"Symbol"
+	SynEditStrConst_SYNS_ScrollInfoFmt,	"%d - %d"
+	SynEditStrConst_SYNS_ScrollInfoFmtTop,	"Top Line: %d"
+	SynEditStrConst_SYNS_EDuplicateShortcut,	"Shortcut already exists"
+	SynEditStrConst_SYNS_FilterPascal,	"Pascal Files (*.pas;*.pp;*.dpr;*.dpk;*.inc)|*.pas;*.pp;*.dpr;*.dpk;*.inc"
+	SynEditStrConst_SYNS_FilterCPP,	"C/C++ Files (*.c;*.cpp;*.h;*.hpp)|*.c;*.cpp;*.h;*.hpp"
+	SynEditStrConst_SYNS_LangCPP,	"C/C++"
+	SynEditStrConst_SYNS_LangPascal,	"Object Pascal"
+	SynEditTextBuffer_SListIndexOutOfBounds,	"Invalid stringlist index %d"
+	SynEditTextBuffer_SInvalidCapacity,	"Stringlist capacity cannot be smaller than count"
+	frmFindstaticsUnit_strScan,	"Scan"
+	XMLConst_SMissingFileName,	"FileName cannot be blank"
+	XMLConst_SLine,	"Line"
+	OpenSave_strunknowncomponent,	"There is a unknown component in the trainer! compnr="
+	OpenSave_strCorruptIcon,	"The icon has been corrupted"
+	OpenSave_strCantLoadFilepatcher,	"The file patcher can't be loaded by Cheat Engine!"
+	OpenSave_strNotACETrainer,	"This is not a trainer made by Cheat Engine (If it is a trainer at all!)"
+	OpenSave_strUnknownTrainerVersion,	"This version of Cheat Engine doesn't know how to read this trainer! Trainerversion="
+	OpenSave_strCantLoadProtectedfile,	"This trainer is protected from being opened by CE. Now go away!!!"
+	SynEditStrConst_SYNS_AttrAssembler,	"Assembler"
+	SynEditStrConst_SYNS_AttrCharacter,	"Character"
+	SynEditStrConst_SYNS_AttrComment,	"Comment"
+	SynEditStrConst_SYNS_AttrFloat,	"Float"
+	SynEditStrConst_SYNS_AttrHexadecimal,	"Hexadecimal"
+	SynEditStrConst_SYNS_AttrIdentifier,	"Identifier"
+	SynEditStrConst_SYNS_AttrIllegalChar,	"Illegal Char"
+	SynEditStrConst_SYNS_AttrNumber,	"Number"
 	XMLConst_SDuplicateRegistration,	"\"%s\" DOMImplementation already registered"
 	XMLConst_SNoMatchingDOMVendor,	"No matching DOM Vendor: \"%s\""
Index: /Cheat Engine/frmSaveMemoryRegionUnit.dfm
===================================================================
--- /Cheat Engine/frmSaveMemoryRegionUnit.dfm (revision 109)
+++ /Cheat Engine/frmSaveMemoryRegionUnit.dfm (revision 312)
@@ -16,11 +16,11 @@
   Scaled = False
   OnClose = FormClose
-  PixelsPerInch = 96
+  PixelsPerInch = 120
   TextHeight = 13
   object Panel1: TPanel
     Left = 0
     Top = 0
-    Width = 262
-    Height = 196
+    Width = 252
+    Height = 185
     Align = alClient
     BevelOuter = bvNone
@@ -29,5 +29,5 @@
       Left = 0
       Top = 0
-      Width = 262
+      Width = 252
       Height = 13
       Align = alTop
@@ -38,6 +38,6 @@
       Left = 0
       Top = 13
-      Width = 155
-      Height = 183
+      Width = 145
+      Height = 172
       Align = alClient
       ItemHeight = 13
@@ -46,8 +46,8 @@
     end
     object Panel4: TPanel
-      Left = 155
+      Left = 145
       Top = 13
       Width = 107
-      Height = 183
+      Height = 172
       Align = alRight
       BevelOuter = bvNone
@@ -96,6 +96,6 @@
   object Panel2: TPanel
     Left = 0
-    Top = 196
-    Width = 262
+    Top = 185
+    Width = 252
     Height = 48
     Align = alBottom
@@ -103,5 +103,5 @@
     TabOrder = 1
     DesignSize = (
-      262
+      252
       48)
     object DontInclude: TCheckBox
Index: /Cheat Engine/FoundCodeUnit.pas
===================================================================
--- /Cheat Engine/FoundCodeUnit.pas (revision 311)
+++ /Cheat Engine/FoundCodeUnit.pas (revision 312)
@@ -443,5 +443,5 @@
   for i:=0 to FoundcodeList.Items.count-1 do
     if FoundcodeList.Selected[i] then
-      s:=s+FoundcodeList.Items[i]+#13;
+      s:=s+FoundcodeList.Items[i]+#13#10;
 
   clipboard.AsText:=s;
Index: /Cheat Engine/CEFuncProc.pas
===================================================================
--- /Cheat Engine/CEFuncProc.pas (revision 309)
+++ /Cheat Engine/CEFuncProc.pas (revision 312)
@@ -2615,5 +2615,5 @@
     scanvalue:=copy(scanvalue,1,length(scanvalue)-1);
 
-  if (pos('-',scanvalue)>0) or (pos(' ',scanvalue)>0) then
+  if (pos('-',scanvalue)>0) or (pos(' ',scanvalue)>0) or (pos(',',scanvalue)>0) then
   begin
     //syntax is xx-xx-xx or xx xx xx
@@ -2624,5 +2624,5 @@
     for i:=1 to length(scanvalue) do
     begin
-      if (scanvalue[i]=' ') or (scanvalue[i]='-') then
+      if (scanvalue[i] in [' ', '-', ',']) then
       begin
         helpstr:=copy(scanvalue,j,i-j);
Index: /Cheat Engine/frmMemoryAllocHandlerUnit.pas
===================================================================
--- /Cheat Engine/frmMemoryAllocHandlerUnit.pas (revision 309)
+++ /Cheat Engine/frmMemoryAllocHandlerUnit.pas (revision 312)
@@ -226,5 +226,5 @@
 
     if addresslist=@frmMemoryAllocHandler.HeapBaselevel then
-     dec(heapcount);
+      dec(heapcount);
      
     temp.Free;
Index: /Cheat Engine/frmHeapsUnit.dfm
===================================================================
--- /Cheat Engine/frmHeapsUnit.dfm (revision 281)
+++ /Cheat Engine/frmHeapsUnit.dfm (revision 312)
@@ -2,5 +2,5 @@
   Left = 408
   Top = 186
-  Width = 220
+  Width = 253
   Height = 316
   BorderIcons = [biSystemMenu]
@@ -21,5 +21,5 @@
     Left = 0
     Top = 221
-    Width = 202
+    Width = 235
     Height = 50
     Align = alBottom
@@ -27,8 +27,8 @@
     TabOrder = 0
     DesignSize = (
-      202
+      235
       50)
     object Button1: TButton
-      Left = 54
+      Left = 70
       Top = 10
       Width = 92
@@ -44,5 +44,5 @@
     Left = 0
     Top = 0
-    Width = 202
+    Width = 235
     Height = 221
     Align = alClient
@@ -50,5 +50,5 @@
       item
         Caption = 'Address'
-        Width = 128
+        Width = 120
       end
       item
Index: /Cheat Engine/frmSaveMemoryRegionUnit.pas
===================================================================
--- /Cheat Engine/frmSaveMemoryRegionUnit.pas (revision 109)
+++ /Cheat Engine/frmSaveMemoryRegionUnit.pas (revision 312)
@@ -100,5 +100,5 @@
     toaddress:=tregion(lbregions.Items.Objects[i]).toaddress;
 
-    size:=toaddress-fromaddress;
+    size:=toaddress-fromaddress+1;
     getmem(buf[i],size);
 
Index: /Cheat Engine/disassembler.pas
===================================================================
--- /Cheat Engine/disassembler.pas (revision 306)
+++ /Cheat Engine/disassembler.pas (revision 312)
@@ -9037,6 +9037,7 @@
   i: integer;
 begin
+  result:=false;
   hexcount:=0;
-  for i:=length(d) downto 1 do 
+  for i:=length(d) downto 1 do
   begin
     if d[i] in ['a'..'f','A'..'F','0'..'9'] then
@@ -9046,5 +9047,6 @@
       begin
         //it has a 4 byte hexadecimal value
-        hexstring:=copy('$'+d,i-6,8);
+        hexstring:='$'+copy(d,i,8);
+        result:=true;
         exit;
       end;
@@ -9084,5 +9086,5 @@
     if has4ByteHexString(d,s) then
     begin
-      address:=strtoint('$'+s);
+      address:=strtoint(s); //s already has the $ in front
       result:=isAddress(address);
     end;
@@ -9188,5 +9190,5 @@
     fvalue: single;
     fvalue2: double;
-    tempbuf: array [0..16] of byte;
+    tempbuf: array [0..127] of byte;
 
     pc: pchar;
@@ -9360,5 +9362,15 @@
           5:
           begin
-            tempbuf[15]:=0;
+            actualread:=0;
+            ReadProcessMemory(processhandle, pointer(tempaddress), @tempbuf[0], 128, actualread);
+
+            tempbuf[127]:=0;
+            tempbuf[126]:=ord('.');
+            tempbuf[125]:=ord('.');
+            tempbuf[124]:=ord('.');
+
+            if actualread>0 then
+              tempbuf[actualread-1]:=0;
+              
             pc:=@tempbuf[0];
             ts:='"'+ pc+'"';
@@ -9367,6 +9379,23 @@
           6:
           begin
-            tempbuf[15]:=0;
-            tempbuf[14]:=0;
+            actualread:=0;
+            ReadProcessMemory(processhandle, pointer(tempaddress), @tempbuf[0], 128, actualread);
+                      
+            tempbuf[127]:=0;
+            tempbuf[126]:=0;
+
+            tempbuf[125]:=0;
+            tempbuf[124]:=ord('.');
+            tempbuf[123]:=0;
+            tempbuf[122]:=ord('.');
+            tempbuf[121]:=0;            
+            tempbuf[120]:=ord('.');
+
+            if actualread>1 then
+            begin
+              tempbuf[actualread-1]:=0;
+              tempbuf[actualread-2]:=0;
+            end;
+
             pwc:=@tempbuf[0];
             ts:='""'+ pwc+'""';
Index: /Cheat Engine/MemoryBrowserFormUnit.dfm
===================================================================
--- /Cheat Engine/MemoryBrowserFormUnit.dfm (revision 309)
+++ /Cheat Engine/MemoryBrowserFormUnit.dfm (revision 312)
@@ -176,5 +176,5 @@
           Top = 115
           Width = 96
-          Height = 14
+          Height = 13
           Cursor = crHandPoint
           Caption = 'EBP 00000000'
@@ -192,5 +192,5 @@
           Top = 131
           Width = 96
-          Height = 14
+          Height = 13
           Cursor = crHandPoint
           Caption = 'ESP 00000000'
@@ -208,5 +208,5 @@
           Top = 147
           Width = 96
-          Height = 15
+          Height = 13
           Cursor = crHandPoint
           Caption = 'EIP 00000000'
Index: /Cheat Engine/disassemblerviewunit.pas
===================================================================
--- /Cheat Engine/disassemblerviewunit.pas (revision 301)
+++ /Cheat Engine/disassemblerviewunit.pas (revision 312)
@@ -370,5 +370,4 @@
     //not the selected address
 
-    if disassembleDescription.caption<>line.description then disassembleDescription.caption:=line.description;
     fSelectedAddress:=line.address;
 
@@ -464,4 +463,6 @@
 
   selstart, selstop: dword;
+  description: string;
+  x: dword;
 begin
   if (not symhandler.isloaded) and (not symhandler.haserror) then
@@ -515,4 +516,9 @@
 
   fTotalvisibledisassemblerlines:=i;
+
+  x:=fSelectedAddress;
+  disassemble(x,description);
+  if disassembleDescription.caption<>description then disassembleDescription.caption:=description;
+
 
   if ShowJumplines then
Index: /Cheat Engine/savedisassemblyfrm.pas
===================================================================
--- /Cheat Engine/savedisassemblyfrm.pas (revision 301)
+++ /Cheat Engine/savedisassemblyfrm.pas (revision 312)
@@ -80,5 +80,5 @@
   i:=0;
 
-  while (not terminated) and (currentaddress<stop) do
+  while (not terminated) and (currentaddress<=stop) do
   begin
     oldaddress:=currentaddress;
Index: /Cheat Engine/memscan.pas
===================================================================
--- /Cheat Engine/memscan.pas (revision 311)
+++ /Cheat Engine/memscan.pas (revision 312)
@@ -2014,5 +2014,5 @@
       maxsvalue:=svalue+(1/(power(10,floataccuracy)));
     end;
-
+                  
     if variableType = vtString then
     begin
Index: /Cheat Engine/DissectCodeunit.pas
===================================================================
--- /Cheat Engine/DissectCodeunit.pas (revision 303)
+++ /Cheat Engine/DissectCodeunit.pas (revision 312)
@@ -75,7 +75,10 @@
   begin
     timer1.Enabled:=false;
-    dissectcode.terminate;
-    dissectcode.WaitFor;
-    dissectcode.done:=true;
+    if dissectcode<>nil then
+    begin
+      dissectcode.terminate;
+      dissectcode.WaitFor;
+      dissectcode.done:=true;
+    end;
     Timer1Timer(timer1);
 
@@ -85,4 +88,8 @@
   end;
 
+
+
+  if listbox1.SelCount=0 then raise exception.Create('Please select something to scan');
+
   if dissectcode<>nil then
   begin
@@ -93,41 +100,36 @@
 
   dissectcode:=TDissectCodeThread.create(true);
-
- 
-  begin
-    setlength(dissectcode.memoryregion,0);
-    if listbox1.SelCount=0 then raise exception.Create('Please select something to scan');
-    for i:=0 to listbox1.items.count-1 do
-    begin
-      if listbox1.Selected[i] then
+  setlength(dissectcode.memoryregion,0);
+
+  for i:=0 to listbox1.items.count-1 do
+  begin
+    if listbox1.Selected[i] then
+    begin
+      getexecutablememoryregionsfromregion(tmoduledata(listbox1.Items.Objects[i]).moduleaddress,tmoduledata(listbox1.Items.Objects[i]).moduleaddress+tmoduledata(listbox1.Items.Objects[i]).modulesize,tempregions);
+      setlength(dissectcode.memoryregion,length(dissectcode.memoryregion)+length(tempregions));
+
+      for j:=0 to length(tempregions)-1 do
+        dissectcode.memoryregion[length(dissectcode.memoryregion)-length(tempregions)+j]:=tempregions[j];
+    end;
+  end;
+
+
+  //sort the regions so they are from big to small (bubblesort)
+  n:=length(dissectcode.memoryregion);
+  for i:=0 to n-1 do
+  begin
+    flipped:=false;
+    for j:=0 to n-2-i do
+    begin
+      if dissectcode.memoryregion[j+1].BaseAddress<dissectcode.memoryregion[j].BaseAddress then//swap
       begin
-        getexecutablememoryregionsfromregion(tmoduledata(listbox1.Items.Objects[i]).moduleaddress,tmoduledata(listbox1.Items.Objects[i]).moduleaddress+tmoduledata(listbox1.Items.Objects[i]).modulesize,tempregions);
-        setlength(dissectcode.memoryregion,length(dissectcode.memoryregion)+length(tempregions));
-
-        for j:=0 to length(tempregions)-1 do
-          dissectcode.memoryregion[length(dissectcode.memoryregion)-length(tempregions)+j]:=tempregions[j];
+        temp:=dissectcode.memoryregion[j+1];
+        dissectcode.memoryregion[j+1]:=dissectcode.memoryregion[j];
+        dissectcode.memoryregion[j]:=temp;
+        flipped:=true;
       end;
     end;
 
-
-    //sort the regions so they are from big to small (bubblesort)
-    n:=length(dissectcode.memoryregion);
-    for i:=0 to n-1 do
-    begin
-      flipped:=false;
-      for j:=0 to n-2-i do
-      begin
-        if dissectcode.memoryregion[j+1].BaseAddress<dissectcode.memoryregion[j].BaseAddress then//swap
-        begin
-          temp:=dissectcode.memoryregion[j+1];
-          dissectcode.memoryregion[j+1]:=dissectcode.memoryregion[j];
-          dissectcode.memoryregion[j]:=temp;
-          flipped:=true;
-        end;
-      end;
-
-      if not flipped then break;
-    end;
-
+    if not flipped then break;
   end;
 
@@ -181,8 +183,14 @@
   if dissectcode.done then
   begin
-    close;
+    timer1.Enabled:=false;
+    btnStart.Caption:='Start';
+    ProgressBar1.Position:=0;
+    label7.Caption:='done';
+
+
 
     if ondone=odOpenReferedStringList then
     begin
+      close;
       if frmReferencedStrings=nil then
         frmReferencedStrings:=tfrmReferencedStrings.Create(self);
Index: /Cheat Engine/frmHeapsUnit.pas
===================================================================
--- /Cheat Engine/frmHeapsUnit.pas (revision 309)
+++ /Cheat Engine/frmHeapsUnit.pas (revision 312)
@@ -10,10 +10,10 @@
   private
     c: integer;
-    list: array [0..14] of record
+    list: array [0..63] of record
       address: dword;
       size: integer;
     end;
     expanded: boolean;
-    procedure enumerateHeapList(memreclist: PMemRecTableArray; level: integer);
+    procedure enumerateHeapList(const memreclist: PMemRecTableArray; level: integer);
     procedure updatelist;
   public
@@ -51,4 +51,7 @@
   li: tlistitem;
 begin
+  if GetCurrentThreadID <> MainThreadID then
+    exit;
+
   if frmheaps<>nil then
   begin
@@ -70,5 +73,5 @@
 end;
 
-procedure TFillHeapList.enumerateHeapList(memreclist: PMemRecTableArray; level: integer);
+procedure TFillHeapList.enumerateHeapList(const memreclist: PMemRecTableArray; level: integer);
 var i: integer;
 begin
@@ -85,6 +88,9 @@
         list[c].size:=memreclist[i].memallocevent.HookEvent.HeapAllocEvent.Size;
         inc(c);
-        if c=15 then
+        if c=64 then
+        begin
           synchronize(updatelist);
+          sleep(100);
+        end;
       end;
     end;
@@ -99,4 +105,6 @@
     end;
   end;
+
+
 end;
 
@@ -107,6 +115,10 @@
 begin
   c:=0;
-
-  enumerateHeapList(@frmMemoryAllocHandler.HeapBaselevel, 0);
+  frmMemoryAllocHandler.memrecCS.Enter;
+  try
+    enumerateHeapList(@frmMemoryAllocHandler.HeapBaselevel, 0);
+  finally
+    frmMemoryAllocHandler.memrecCS.Leave;
+  end;
 
   if c>0 then
@@ -116,8 +128,11 @@
 procedure TfrmHeaps.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
-  fillthread.Terminate;
-  fillthread.WaitFor;
-  fillthread.Free;
-  
+  if fillthread<>nil then
+  begin
+    fillthread.Terminate;
+    fillthread.WaitFor;
+    fillthread.Free;
+  end;
+
   action:=caFree;
   frmheaps:=nil;
@@ -127,12 +142,13 @@
 begin
   if frmMemoryAllocHandler=nil then
-    frmMemoryAllocHandler:=TfrmMemoryAllocHandler.Create(self); //just not show
+    frmMemoryAllocHandler:=TfrmMemoryAllocHandler.Create(memorybrowser); //just not show
 
-  frmMemoryAllocHandler.WaitForInitializationToFinish;
+  if frmMemoryAllocHandler.WaitForInitializationToFinish then
+  begin
+    //start the thread that enumerates the heaplist
+    button1.Left:=(clientwidth div 2) - (button1.Width div 2);
 
-  //start the thread that enumerates the heaplist
-  button1.Left:=(clientwidth div 2) - (button1.Width div 2);
-
-  fillthread:=TFillHeapList.Create(false);
+    fillthread:=TFillHeapList.Create(false);
+  end;
 end;
 
Index: /Cheat Engine/PointerscanresultReader.pas
===================================================================
--- /Cheat Engine/PointerscanresultReader.pas (revision 291)
+++ /Cheat Engine/PointerscanresultReader.pas (revision 312)
@@ -198,5 +198,5 @@
 begin
   FFilename:=filename;
-  configfile:=TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
+  configfile:=TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite);
   configfile.ReadBuffer(modulelistlength,sizeof(modulelistlength));
   modulelist:=tstringlist.create;
@@ -250,5 +250,5 @@
 
 
-    files[i].f:=TFileStream.Create(ExtractFilePath(filename)+temppchar, fmOpenRead or fmShareDenyNone);
+    files[i].f:=TFileStream.Create(ExtractFilePath(filename)+temppchar, fmOpenRead or fmShareDenyWrite);
     files[i].startindex:=fcount;
     fcount:=fcount+uint64(files[i].f.Size div uint64(sizeofentry));
Index: /Cheat Engine/MemoryBrowserFormUnit.pas
===================================================================
--- /Cheat Engine/MemoryBrowserFormUnit.pas (revision 309)
+++ /Cheat Engine/MemoryBrowserFormUnit.pas (revision 312)
@@ -1652,5 +1652,5 @@
             disassemble(b); //b gets increased with size of selected instruction
             edit1.Text:=inttohex(a,8);
-            edit2.Text:=inttohex(b,8);
+            edit2.Text:=inttohex(b-1,8);
             copymode:=true;
             showmodal;
@@ -3070,4 +3070,6 @@
     freeandnil(frmMemoryAllocHandler);
 
+
+
   if frmheaps=nil then
     frmheaps:=tfrmheaps.create(self);
@@ -3720,5 +3722,5 @@
     disassemble(b); //b gets increased with size of selected instruction
     edit1.Text:=inttohex(a,8);
-    edit2.Text:=inttohex(b,8);
+    edit2.Text:=inttohex(b-1,8);
     copymode:=true;
 
@@ -3926,10 +3928,5 @@
 
   if frmMemoryAllocHandler=nil then
-  begin
-    {if MessageDlg('This function will inject a dll into the target process and hook some memory allocation/free routines. Continue?',mtConfirmation, [mbyes,mbno],0)<>mryes then exit;
-
-    }
     frmMemoryAllocHandler:=TfrmMemoryAllocHandler.Create(self);
-  end;
 
   frmMemoryAllocHandler.Show;
Index: /Cheat Engine/MainUnit.dfm
===================================================================
--- /Cheat Engine/MainUnit.dfm (revision 309)
+++ /Cheat Engine/MainUnit.dfm (revision 312)
@@ -2967,4 +2967,5 @@
       object Helpindex1: TMenuItem
         Caption = 'Cheat Engine Help'
+        ShortCut = 112
         OnClick = Helpindex1Click
       end
Index: /Cheat Engine/aboutunit.dfm
===================================================================
--- /Cheat Engine/aboutunit.dfm (revision 295)
+++ /Cheat Engine/aboutunit.dfm (revision 312)
@@ -50,5 +50,5 @@
     end
     object Label4: TLabel
-      Left = 133
+      Left = 110
       Top = 158
       Width = 72
@@ -382,5 +382,5 @@
     end
     object Label6: TLabel
-      Left = 68
+      Left = 61
       Top = 158
       Width = 40
@@ -389,5 +389,5 @@
     end
     object Label7: TLabel
-      Left = 223
+      Left = 193
       Top = 158
       Width = 84
@@ -438,4 +438,11 @@
       Height = 16
       OnClick = lblDBVMClick
+    end
+    object Label11: TLabel
+      Left = 288
+      Top = 158
+      Width = 23
+      Height = 16
+      Caption = 'Psy'
     end
     object Button1: TButton
Index: /Cheat Engine/pointerscannerfrm.pas
===================================================================
--- /Cheat Engine/pointerscannerfrm.pas (revision 311)
+++ /Cheat Engine/pointerscannerfrm.pas (revision 312)
@@ -46,5 +46,5 @@
     evaluated: uint64;
     procedure execute; override;
-    destructor destroy;
+    destructor destroy; override;
   end;
 
@@ -52,8 +52,10 @@
   Trescanpointers=class(tthread)
   private
+    procedure closeOldFile;
   public
     ownerform: TFrmPointerScanner;
     progressbar: tprogressbar;
     filename: string;
+    overwrite: boolean;
     address: dword;
     forvalue: boolean;
@@ -1419,4 +1421,9 @@
 end;
 
+procedure TRescanpointers.closeOldFile;
+begin
+  ownerform.New1Click(ownerform.new1);
+end;
+
 procedure TRescanpointers.execute;
 var offsetsize: dword;
@@ -1450,4 +1457,5 @@
     temp: dword;
 begin
+ 
   progressbar.Min:=0;
   progressbar.Max:=100;
@@ -1501,5 +1509,8 @@
       rescanworkers[i].rescanhelper:=rescanhelper;
 
-      rescanworkers[i].filename:=self.filename+'.'+inttostr(i);
+      if overwrite then
+        rescanworkers[i].filename:=self.filename+'.'+inttostr(i)+'.overwrite'      
+      else
+        rescanworkers[i].filename:=self.filename+'.'+inttostr(i);
 
       rescanworkers[i].startEntry:=blocksize*i;
@@ -1513,5 +1524,8 @@
 
 
-    result:=TFileStream.Create(filename,fmCreate);
+    if overwrite then
+      result:=TFileStream.Create(filename+'.overwrite',fmCreate)
+    else
+      result:=TFileStream.Create(filename,fmCreate);
 
     //write header
@@ -1528,4 +1542,7 @@
     begin
       tempstring:=ExtractFileName(rescanworkers[i].filename);
+      if overwrite then
+        tempstring:=copy(tempstring,1,length(tempstring)-10);
+        
       temp:=length(tempstring);
       result.Write(temp,sizeof(temp));
@@ -1533,5 +1550,5 @@
     end;
 
-    //loop:
+    result.Free;
 
     while WaitForMultipleObjects(rescanworkercount, @threadhandles[0], true, 1000) = WAIT_TIMEOUT do      //wait
@@ -1546,4 +1563,10 @@
     //no timeout, so finished or crashed
 
+    if overwrite then //delete the old ptr file
+    begin
+      synchronize(closeoldfile);
+      DeleteFile(filename);
+      RenameFile(filename+'.overwrite',filename);
+    end;
 
     //destroy workers
@@ -1552,6 +1575,12 @@
       rescanworkers[i].WaitFor; //just to be sure
       rescanworkers[i].Free;
-    end;
-    result.Free;
+
+      if overwrite then
+      begin
+        DeleteFile(filename+'.'+inttostr(i));
+        RenameFile(filename+'.'+inttostr(i)+'.overwrite', filename+'.'+inttostr(i));
+      end;
+    end;
+
 
     rescanworkercount:=0;
@@ -1563,5 +1592,5 @@
     postmessage(ownerform.Handle,rescan_done,0,0);
     if rescanhelper<>nil then
-      freeandnil(rescanhelper);    
+      freeandnil(rescanhelper);
   end;
 
@@ -1598,4 +1627,9 @@
           begin
             rescan.filename:=savedialog1.filename;
+
+            if uppercase(rescan.filename)=uppercase(pointerscanresults.filename) then
+              rescan.overwrite:=true;
+
+
 
             Rescanmemory1.Enabled:=false;
Index: /Cheat Engine/Tutorial/Unit1.pas
===================================================================
--- /Cheat Engine/Tutorial/Unit1.pas (revision 13)
+++ /Cheat Engine/Tutorial/Unit1.pas (revision 312)
@@ -173,5 +173,5 @@
 procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 begin
-  canclose:=MessageDlg('First step too hard eh? Better give up now!',mtconfirmation,[mbyes,mbno],0)=mryes;
+  canclose:=MessageDlg('First step too hard? Better give up now!',mtconfirmation,[mbyes,mbno],0)=mryes;
 end;
 
Index: /Cheat Engine/Tutorial/Unit10.dfm
===================================================================
--- /Cheat Engine/Tutorial/Unit10.dfm (revision 181)
+++ /Cheat Engine/Tutorial/Unit10.dfm (revision 312)
@@ -2,9 +2,9 @@
   Left = 630
   Top = 563
-  Caption = 'Form10'
+  Caption = 'Step 9'
   OldCreateOrder = True
   Visible = True
-  PixelsPerInch = 96
-  TextHeight = 13
+  PixelsPerInch = 120
+  TextHeight = 16
   inherited Memo1: TMemo
     Lines.Strings = (
Index: /Cheat Engine/Tutorial/Unit1.dfm
===================================================================
--- /Cheat Engine/Tutorial/Unit1.dfm (revision 181)
+++ /Cheat Engine/Tutorial/Unit1.dfm (revision 312)
@@ -5,10 +5,10 @@
   BorderStyle = bsDialog
   Caption = 'Cheat Engine Tutorial v3'
-  ClientHeight = 232
-  ClientWidth = 571
+  ClientHeight = 286
+  ClientWidth = 703
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
   Font.Color = clWindowText
-  Font.Height = -11
+  Font.Height = -14
   Font.Name = 'MS Sans Serif'
   Font.Style = []
@@ -17,11 +17,11 @@
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
-  PixelsPerInch = 96
-  TextHeight = 13
+  PixelsPerInch = 120
+  TextHeight = 16
   object Label1: TLabel
-    Left = 448
-    Top = 192
-    Width = 46
-    Height = 13
+    Left = 551
+    Top = 236
+    Width = 60
+    Height = 16
     Caption = 'Password'
   end
@@ -29,6 +29,6 @@
     Left = 0
     Top = 0
-    Width = 571
-    Height = 185
+    Width = 703
+    Height = 228
     Align = alTop
     Color = clBtnFace
@@ -47,5 +47,6 @@
       
         'When the process window is open find this tutorial. The process ' +
-        'name is probably '#39'tutorial.exe'#39' unless you renamed '
+        'name is probably '#39'tutorial.exe'#39' unless you '
+      'renamed '
       'it.'
       
@@ -66,8 +67,8 @@
   end
   object Button1: TButton
-    Left = 248
-    Top = 200
-    Width = 75
-    Height = 25
+    Left = 305
+    Top = 246
+    Width = 93
+    Height = 31
     Caption = 'Next'
     TabOrder = 1
@@ -75,7 +76,7 @@
   end
   object Edit1: TEdit
-    Left = 412
-    Top = 208
-    Width = 121
+    Left = 507
+    Top = 256
+    Width = 149
     Height = 21
     Hint = 'Use this to go imeadiatly to the step you want to try'
@@ -87,8 +88,8 @@
   end
   object Button2: TButton
-    Left = 536
-    Top = 211
-    Width = 25
-    Height = 17
+    Left = 660
+    Top = 260
+    Width = 30
+    Height = 21
     Caption = 'OK'
     TabOrder = 3
Index: /Cheat Engine/Tutorial/Unit2.dfm
===================================================================
--- /Cheat Engine/Tutorial/Unit2.dfm (revision 181)
+++ /Cheat Engine/Tutorial/Unit2.dfm (revision 312)
@@ -5,10 +5,10 @@
   BorderStyle = bsDialog
   Caption = 'Step 2'
-  ClientHeight = 251
-  ClientWidth = 570
+  ClientHeight = 309
+  ClientWidth = 702
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
   Font.Color = clWindowText
-  Font.Height = -11
+  Font.Height = -14
   Font.Name = 'MS Sans Serif'
   Font.Style = []
@@ -18,25 +18,25 @@
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
-  PixelsPerInch = 96
-  TextHeight = 13
+  PixelsPerInch = 120
+  TextHeight = 16
   object Label1: TLabel
-    Left = 40
-    Top = 232
-    Width = 18
-    Height = 13
+    Left = 49
+    Top = 286
+    Width = 21
+    Height = 16
     Caption = '100'
   end
   object Label2: TLabel
     Left = 0
-    Top = 232
-    Width = 34
-    Height = 13
+    Top = 286
+    Width = 42
+    Height = 16
     Caption = 'Health:'
   end
   object SpeedButton1: TSpeedButton
-    Left = 544
-    Top = 232
-    Width = 25
-    Height = 17
+    Left = 670
+    Top = 286
+    Width = 30
+    Height = 20
     Caption = 'Skip'
     Flat = True
@@ -46,6 +46,6 @@
     Left = 0
     Top = 0
-    Width = 570
-    Height = 185
+    Width = 702
+    Height = 228
     Align = alTop
     Color = clBtnFace
@@ -83,11 +83,11 @@
         'ck '#39'First Scan'#39
       
-        'After a while (if you have a extremly slow pc) the scan is done ' +
-        'and the results are shown in the list on the '
+        'After a while (if you have a extremely slow pc) the scan is done' +
+        ' and the results are shown in the list on the '
       'left'
       ''
       
-        'If you find more than 1 address and you dont know for sure wich ' +
-        'address it is, click '#39'Hit me'#39', fill in the new '
+        'If you find more than 1 address and you don'#39't know for sure whic' +
+        'h address it is, click '#39'Hit me'#39', fill in the new '
       'health value into the value box, and click '#39'Next Scan'#39
       
@@ -118,8 +118,8 @@
   end
   object Button1: TButton
-    Left = 248
-    Top = 192
-    Width = 75
-    Height = 25
+    Left = 305
+    Top = 236
+    Width = 93
+    Height = 31
     Caption = 'Next'
     Enabled = False
@@ -128,8 +128,8 @@
   end
   object Button2: TButton
-    Left = 64
-    Top = 230
-    Width = 41
-    Height = 17
+    Left = 79
+    Top = 283
+    Width = 50
+    Height = 21
     Caption = 'Hit me'
     TabOrder = 2
Index: /Cheat Engine/Tutorial/Unit9.dfm
===================================================================
--- /Cheat Engine/Tutorial/Unit9.dfm (revision 181)
+++ /Cheat Engine/Tutorial/Unit9.dfm (revision 312)
@@ -1,13 +1,13 @@
 object Form9: TForm9
-  Left = 437
-  Top = 446
+  Left = 411
+  Top = 229
   BorderStyle = bsDialog
   Caption = 'Step 8'
-  ClientHeight = 250
-  ClientWidth = 571
+  ClientHeight = 308
+  ClientWidth = 703
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
   Font.Color = clWindowText
-  Font.Height = -11
+  Font.Height = -14
   Font.Name = 'MS Sans Serif'
   Font.Style = []
@@ -18,26 +18,26 @@
   OnCloseQuery = FormCloseQuery
   OnCreate = FormCreate
-  PixelsPerInch = 96
-  TextHeight = 13
+  PixelsPerInch = 120
+  TextHeight = 16
   object Label1: TLabel
-    Left = 8
-    Top = 216
-    Width = 18
-    Height = 13
+    Left = 10
+    Top = 266
+    Width = 21
+    Height = 16
     Caption = '100'
   end
   object Label2: TLabel
-    Left = 96
-    Top = 215
-    Width = 6
-    Height = 13
+    Left = 118
+    Top = 265
+    Width = 7
+    Height = 16
     Caption = '3'
     Visible = False
   end
   object SpeedButton1: TSpeedButton
-    Left = 544
-    Top = 232
-    Width = 25
-    Height = 17
+    Left = 670
+    Top = 286
+    Width = 30
+    Height = 20
     Caption = 'Skip'
     Flat = True
@@ -47,6 +47,6 @@
     Left = 0
     Top = 0
-    Width = 571
-    Height = 185
+    Width = 703
+    Height = 228
     Align = alTop
     Color = clBtnFace
@@ -113,8 +113,8 @@
   end
   object Button2: TButton
-    Left = 248
-    Top = 192
-    Width = 75
-    Height = 25
+    Left = 305
+    Top = 236
+    Width = 93
+    Height = 31
     Caption = 'Next'
     Enabled = False
@@ -123,8 +123,8 @@
   end
   object Button1: TButton
-    Left = 8
-    Top = 228
-    Width = 81
-    Height = 19
+    Left = 10
+    Top = 281
+    Width = 100
+    Height = 23
     Caption = 'Change value'
     TabOrder = 2
@@ -132,8 +132,8 @@
   end
   object Button3: TButton
-    Left = 93
-    Top = 228
-    Width = 81
-    Height = 19
+    Left = 114
+    Top = 281
+    Width = 100
+    Height = 23
     Caption = 'Change pointer'
     TabOrder = 3
Index: /Cheat Engine/MainUnit.pas
===================================================================
--- /Cheat Engine/MainUnit.pas (revision 309)
+++ /Cheat Engine/MainUnit.pas (revision 312)
@@ -10895,43 +10895,47 @@
   getprocesslist(pl);
 
-  for i:=0 to autoattachlist.Count-1 do
-  begin
-    for j:=0 to pl.Count-1 do //can't do indexof
-    begin
-      if pos(uppercase(autoattachlist.Strings[i]),uppercase(pl.strings[j]))=10 then
+  try
+
+    for i:=0 to autoattachlist.Count-1 do
+    begin
+      for j:=0 to pl.Count-1 do //can't do indexof
       begin
-        //the process is found
-
-        val('$'+pl.strings[j],newPID,k);
-        if processid=newPID then exit; //already attached to this one
-
-        ProcessHandler.processid:=newPID;
-        unpause;
-        DetachIfPossible;
-
-        MainForm.ProcessLabel.caption:=pl.strings[j];
-        Open_Process;
-        enablegui(false);
-
-        openProcessEpilogue('',0,0);
-
-        symhandler.reinitialize;
-        reinterpretaddresses;
+        if pos(uppercase(autoattachlist.Strings[i]),uppercase(pl.strings[j]))=10 then
+        begin
+          //the process is found
+
+          val('$'+pl.strings[j],newPID,k);
+          if processid=newPID then exit; //already attached to this one
+
+          ProcessHandler.processid:=newPID;
+          unpause;
+          DetachIfPossible;
+
+          MainForm.ProcessLabel.caption:=pl.strings[j];
+          Open_Process;
+          enablegui(false);
+
+          openProcessEpilogue('',0,0);
+
+          symhandler.reinitialize;
+          reinterpretaddresses;
+        end;
       end;
-    end;
-
-  end;
-//  pl.IndexOf(autoattachlist.items[i]);
-
-  for i:=0 to pl.count-1 do
-    if pl.Objects[i]<>nil then
-    begin
-      pli:=pointer(pl.Objects[i]);
-      if pli.processIcon>0 then
-        DestroyIcon(pli.processIcon);
-      freemem(pli);
-    end;
-
-  pl.free;
+
+    end;
+  //  pl.IndexOf(autoattachlist.items[i]);
+
+  finally
+    for i:=0 to pl.count-1 do
+      if pl.Objects[i]<>nil then
+      begin
+        pli:=pointer(pl.Objects[i]);
+        if pli.processIcon>0 then
+          DestroyIcon(pli.processIcon);
+        freemem(pli);
+      end;
+
+    pl.free;
+  end;
 end;
 
Index: /Cheat Engine/aboutunit.pas
===================================================================
--- /Cheat Engine/aboutunit.pas (revision 298)
+++ /Cheat Engine/aboutunit.pas (revision 312)
@@ -26,4 +26,5 @@
     Label10: TLabel;
     lblDBVM: TLabel;
+    Label11: TLabel;
     procedure Button1Click(Sender: TObject);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
Index: /Cheat Engine/Structuresfrm.pas
===================================================================
--- /Cheat Engine/Structuresfrm.pas (revision 311)
+++ /Cheat Engine/Structuresfrm.pas (revision 312)
@@ -1994,5 +1994,5 @@
     begin
       sender.Canvas.Brush.Style:=bsSolid;
-      sender.Canvas.Brush.Color:=clHighlight;   
+      sender.Canvas.Brush.Color:=clHighlight;
       sender.Canvas.FillRect(textlinerect);
       sender.Canvas.DrawFocusRect(textlinerect);
@@ -2020,4 +2020,14 @@
       tvStructureView.canvas.Font.Color:=groupcolors[currentgroup];
 
+      if (cdsSelected in State) then
+      begin
+        case groupcolors[currentgroup] of
+          clGreen: sender.Canvas.font.Color:=clBlack;
+          clRed: sender.Canvas.font.Color:=clMaroon;
+          clBlue: sender.Canvas.font.Color:=clNavy;
+        end;
+
+      end;
+
       clip.Left:=headercontrol1.Sections[i].Left;
       clip.Right:=headercontrol1.Sections[i].Left+headercontrol1.Sections[i].Width;
@@ -2054,8 +2064,5 @@
   n6.Visible:=remove1.Visible;
 
-  if groups[x.Tag]<>0 then
-    setgroup1.Caption:='Change group ('+inttostr(groups[x.tag])+')'
-  else
-    setgroup1.Caption:='Set group';
+  setgroup1.Caption:='Change group ('+inttostr(groups[x.tag])+')';
 end;
 
Index: /Cheat Engine/Release/Cheat Engine.iss
===================================================================
--- /Cheat Engine/Release/Cheat Engine.iss (revision 309)
+++ /Cheat Engine/Release/Cheat Engine.iss (revision 312)
@@ -3,16 +3,16 @@
 
 [Setup]
-AppName=Cheat Engine 5.6 BETA 5
-AppVerName=Cheat Engine 5.6 BETA 5
+AppName=Cheat Engine 5.6 BETA 7
+AppVerName=Cheat Engine 5.6 BETA 7
 AppPublisher=Dark Byte
 AppPublisherURL=http://www.cheatengine.org/
 AppSupportURL=http://www.cheatengine.org/
 AppUpdatesURL=http://www.cheatengine.org/
-DefaultDirName={pf}\Cheat Engine Beta5
-DefaultGroupName=Cheat Engine 5.6 BETA 5
+DefaultDirName={pf}\Cheat Engine Beta7
+DefaultGroupName=Cheat Engine 5.6 BETA 7
 AllowNoIcons=yes
 LicenseFile=..\Release\License.txt
 InfoAfterFile=..\Release\readme.txt
-OutputBaseFilename=CheatEngine56Beta5
+OutputBaseFilename=CheatEngine56Beta7
 PrivilegesRequired=admin
 ChangesAssociations=yes
@@ -248,3 +248,3 @@
 
 [Run]
-Filename: "{app}\Cheat Engine.exe"; Description: "Launch Cheat Engine 5.6 Beta 5"; Flags: nowait postinstall skipifsilent runascurrentuser
+Filename: "{app}\Cheat Engine.exe"; Description: "Launch Cheat Engine 5.6 Beta 7"; Flags: nowait postinstall skipifsilent runascurrentuser
Index: /Cheat Engine/cheatengine.dof
===================================================================
--- /Cheat Engine/cheatengine.dof (revision 311)
+++ /Cheat Engine/cheatengine.dof (revision 312)
@@ -189,5 +189,5 @@
 MinorVer=6
 Release=0
-Build=55
+Build=56
 Debug=0
 PreRelease=1
@@ -200,5 +200,5 @@
 CompanyName=
 FileDescription=Cheat Engine 5.6
-FileVersion=5.6.0.55
+FileVersion=5.6.0.56
 InternalName=CheatEngine
 LegalCopyright=none
Index: /Cheat Engine/symbolhandler.pas
===================================================================
--- /Cheat Engine/symbolhandler.pas (revision 303)
+++ /Cheat Engine/symbolhandler.pas (revision 312)
@@ -1203,11 +1203,10 @@
             modulelist[modulelistpos].modulename:=extractfilename(x);
             modulelist[modulelistpos].modulepath:=x;
-            //I say that physxcore is also a system module even if it isn't located in the windows dir
-            modulelist[modulelistpos].isSystemModule:=(pos(lowercase(windowsdir),lowercase(x))>0);
+
+            //all windows folder files are system modules, except when it is an .exe (minesweeper in xp)
+            modulelist[modulelistpos].isSystemModule:=(pos(lowercase(windowsdir),lowercase(x))>0) and (ExtractFileExt(lowercase(x))<>'.exe');
 
             if (not modulelist[modulelistpos].isSystemModule) and (commonModuleList<>nil) then //check if it's a common module (e.g nvidia physx dll's)
               modulelist[modulelistpos].isSystemModule:=commonModuleList.IndexOf(lowercase(modulelist[modulelistpos].modulename))<>-1;
-
-
 
             modulelist[modulelistpos].baseaddress:=dword(me32.modBaseAddr);
Index: /Cheat Engine/autoassembler.pas
===================================================================
--- /Cheat Engine/autoassembler.pas (revision 311)
+++ /Cheat Engine/autoassembler.pas (revision 312)
@@ -419,37 +419,43 @@
               begin
                 s1:=copy(currentline,a+1,b-a-1);
-                s2:=copy(currentline,b+1,c-b-1);
+                s2:=trim(copy(currentline,b+1,c-b-1));
+
                 testdword:= symhandler.getAddressFromName(s1,false);
 
                 setlength(bytes,0);
-                ConvertStringToBytes(s2, true, bytes);
+                try
+                  ConvertStringToBytes(s2, true, bytes);
+                except
+                  raise exception.create(s2+' is not a valid bytestring');
+                end;
+
                 if length(bytes)>0 then
                 begin
                   getmem(bytebuf,length(bytes));
-                  if ReadProcessMemory(processhandle, pointer(testdword), bytebuf, length(bytes),x) then
-                  begin
-                    try
-                      for j:=0 to length(bytes)-1 do
-                      begin
-                        if bytes[j]>=0 then
-                          if byte(bytes[j])<>bytebuf[j] then
-                            raise exception.Create('The bytes at '+s1+' are not what was expected');
-                      end;
-                    finally
-                      freemem(bytebuf);
-                    end;
-                  end else raise exception.Create('The memory at +'+s1+' can not be read');
+                  try
+                    if ReadProcessMemory(processhandle, pointer(testdword), bytebuf, length(bytes),x) then
+                    begin
+
+                        for j:=0 to length(bytes)-1 do
+                        begin
+                          if bytes[j]>=0 then
+                            if byte(bytes[j])<>bytebuf[j] then
+                              raise exception.Create('The bytes at '+s1+' are not what was expected');
+                        end;
+                    end else raise exception.Create('The memory at +'+s1+' can not be read');
+                  finally
+                    freemem(bytebuf);
+                  end;
 
                 end
                 else raise exception.Create(s2+' is not a valid bytestring');
 
-
-
-                setlength(assemblerlines,length(assemblerlines)-1);
-                continue;
               end
               else
-                raise exception.Create('Wrong syntax. ASSERT(address,bytes)');
-            end;
+                raise exception.Create('Wrong syntax. ASSERT(address,11 22 33 ** 55 66)');
+            end;
+
+            setlength(assemblerlines,length(assemblerlines)-1);
+            continue;
           end;
 
@@ -713,5 +719,5 @@
             begin
               s1:=copy(currentline,a+1,b-a-1);
-              s2:=copy(currentline,b+1,c-b-1);
+              s2:=trim(copy(currentline,b+1,c-b-1));
 
               //s1=varname
