Hi Cuong, Here is the log entry in my Mercurial log for the files I sent you. As you can see, it is a rewrite of the history at the top of the file, but it might be a little easier to make sense of. changeset: 8:8b1225c9de98 tag: tip user: Gary Campbell <campg2003@xxxxxxxxx> date: Sat Aug 18 17:22:39 2012 -0600 files: Jaws Script installer_cuong/Jaws Script installer/Cuong/ginstaller.nsi description: Changes to ginstaller.nsi: Remembers JAWS selected versions if you come back to the versions page. Added Welcome, Components, and Confirm Install pages. The Confirm Install page shows the selected JAWS versions, the $INSTDIR for full installations and installer source folder if selected. Started making a way for the user to specify the files to be installed from the installer script if most of this code is in a header file. Made ${JAWSScriptItemsBegin/End} macros. Usage: ${JAWSScriptItemsBegin} ;Instructions to install script files into a JAWS version. $OUTDIR will be set to the directory where the scripts should be installed. ${JAWSScriptItemsEnd} A default version that looks for the common script files will be used if these macros are not defined. This is still a bit hard to test while almost everything is in the .nsi file. Added macro __FileDatedNF and define FileDatedNF to execute file /nonfatal, used in default version. Converted for MUI2. Added section Installer Source. Added section Install JAWS scripts. Made JAWS section silent. Changed functions GetJawsScriptDir and GetJawsProgDir to return on TOS instead of $2. Added DirPagePre to skip directory page if not full install. Added ${NSD_CreateTextMultiline} used on Confirm Install page. Added function GetSecIDs and variables to store section indexes needed for InstConfirmPre, called from .OnInit. The issue is that the defines for section indexes aren't defined until after the sections are defined, yet they are needed in the dir and confirmInst page pre functions. All of the functions could be moved after the sections, but that would make it harder to package the pages, sections, and functions into a header file. Added function ComponentsPageLeave to select SecUninstaller if type JUSTSCRIPTS is not selected, this covers type Custom. ADDED CODE TO SET THE PAGE TITLE ON THE CONFIRMATION PAGE. Changed uninstall section to delete using uninstlog and not use rmdir /r to remove $INSTDIR. Made most of code in install JAWS scripts section into a macro. Moved version uninstall macros ahead of install scripts section. Changed to use the ${WriteUninstaller} uninstlog macro. Added open/close uninstlog in -uninstaller section. Added function MarkSelectedVersions to check the list view items of selected versions when the user comes back to the JAWS Versions page. Wrote LVCheckItem. Changed code in JawsPage to set $SELECTEDJAWSVERSIONS when only one JAWS version is found. Issues: The output of makensis shows warnings generated for code in function __JAWSInstallScriptItemsDefault when ${ScriptItemsBegin} is used. The uninstaller has shown a message saying that $INSTDIR can't be removed when it is actually removed. Even if the warning about not being able to remove $INSTDIR is displayed and $UNINSTDIR is in fact not removed, the finish message says the uninstall is successful. Issue: need a way for the user to choose between installing scripts in All Users or current user. One may wish to make that choice even if the installer can write All Users and the installer is set to install to All Users-- i.e. into Program Files. Issue: need a way to choose to install scripts into the program files folder, e.g. to view them on a system where JAWS is not installed. Issue: If Install Source is not selected install type is 2 when Custom is selected, therefore, selecting install type Custom but not selecting Install Installer Source will cause a Just Scripts installation. The Installer Source component is not checked by default when Custom is selected. Text from the Components page appears on the Confirm Install page. The README file is currently not installed. ------ Gary