diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index afe11ac..b6eef69 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -122,7 +122,7 @@
        /* 2 = present but replace */
        /* 3 = present do not replace */
        /* 4 = Installed */
-    WCHAR   SourcePath[MAX_PATH];
+    LPWSTR  SourcePath;
     LPWSTR  TargetPath;
     BOOL    Temporary; 
 }MSIFILE;
@@ -252,6 +252,15 @@
     return ret;
 }
 
+static LPWSTR dupstrW(LPCWSTR src)
+{
+    LPWSTR dest;
+    if (!src) return NULL;
+    dest = HeapAlloc(GetProcessHeap(), 0, (strlenW(src)+1)*sizeof(WCHAR));
+    strcpyW(dest, src);
+    return dest;
+}
+
 inline static WCHAR *load_dynamic_stringW(MSIRECORD *row, INT index)
 {
     UINT rc;
@@ -259,22 +268,33 @@
     LPWSTR ret;
    
     sz = 0; 
-    rc = MSI_RecordGetStringW(row,index,NULL,&sz);
-    if (sz <= 0)
+    if (MSI_RecordIsNull(row,index))
         return NULL;
 
+    rc = MSI_RecordGetStringW(row,index,NULL,&sz);
+
+    /* having an empty string is different than NULL */
+    if (sz == 0)
+    {
+        ret = HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR));
+        ret[0] = 0;
+        return ret;
+    }
+
     sz ++;
     ret = HeapAlloc(GetProcessHeap(),0,sz * sizeof (WCHAR));
     rc = MSI_RecordGetStringW(row,index,ret,&sz);
     if (rc!=ERROR_SUCCESS)
     {
+        ERR("Unable to load dynamic string\n");
         HeapFree(GetProcessHeap(), 0, ret);
         ret = NULL;
     }
     return ret;
 }
 
-static LPWSTR PACKAGE_GetProperty(MSIPACKAGE *package, LPCWSTR prop)
+inline static LPWSTR load_dynamic_property(MSIPACKAGE *package, LPCWSTR prop,
+                                           UINT* rc)
 {
     DWORD sz = 0;
     LPWSTR str;
@@ -282,7 +302,11 @@
 
     r = MSI_GetPropertyW(package, prop, NULL, &sz);
     if (r != ERROR_SUCCESS && r != ERROR_MORE_DATA)
+    {
+        if (rc)
+            *rc = r;
         return NULL;
+    }
     sz++;
     str = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
     r = MSI_GetPropertyW(package, prop, str, &sz);
@@ -291,6 +315,8 @@
         HeapFree(GetProcessHeap(),0,str);
         str = NULL;
     }
+    if (rc)
+        *rc = r;
     return str;
 }
 
@@ -342,14 +368,6 @@
     return rc;
 }
 
-static LPWSTR PACKAGE_dupstrW(LPCWSTR src)
-{
-    LPWSTR dest;
-    if (!src) return NULL;
-    dest = HeapAlloc(GetProcessHeap(), 0, (strlenW(src)+1)*sizeof(WCHAR));
-    strcpyW(dest, src);
-    return dest;
-}
 
 static int track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path)
 {
@@ -373,10 +391,8 @@
 
     memset(&package->files[index],0,sizeof(MSIFILE));
 
-    package->files[index].File = PACKAGE_dupstrW(name);
-    if (package->files[index].TargetPath)
-        HeapFree(GetProcessHeap(),0,package->files[index].TargetPath);
-    package->files[index].TargetPath = PACKAGE_dupstrW(path);
+    package->files[index].File = dupstrW(name);
+    package->files[index].TargetPath = dupstrW(path);
     package->files[index].Temporary = TRUE;
 
     TRACE("Tracking tempfile (%s)\n",debugstr_w(package->files[index].File));  
@@ -399,19 +415,6 @@
     }
 }
 
-static void ui_progress(MSIPACKAGE *package, int a, int b, int c, int d )
-{
-    MSIRECORD * row;
-
-    row = MSI_CreateRecord(4);
-    MSI_RecordSetInteger(row,1,a);
-    MSI_RecordSetInteger(row,2,b);
-    MSI_RecordSetInteger(row,3,c);
-    MSI_RecordSetInteger(row,4,d);
-    MSI_ProcessMessage(package, INSTALLMESSAGE_PROGRESS, row);
-    msiobj_release(&row->hdr);
-}
-
 static UINT ACTION_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... )
 {
     LPWSTR szQuery;
@@ -460,6 +463,19 @@
     return rc;
 }
 
+static void ui_progress(MSIPACKAGE *package, int a, int b, int c, int d )
+{
+    MSIRECORD * row;
+
+    row = MSI_CreateRecord(4);
+    MSI_RecordSetInteger(row,1,a);
+    MSI_RecordSetInteger(row,2,b);
+    MSI_RecordSetInteger(row,3,c);
+    MSI_RecordSetInteger(row,4,d);
+    MSI_ProcessMessage(package, INSTALLMESSAGE_PROGRESS, row);
+    msiobj_release(&row->hdr);
+}
+
 static void ui_actiondata(MSIPACKAGE *package, LPCWSTR action, MSIRECORD * record)
 {
     static const WCHAR Query_t[] = 
@@ -505,8 +521,8 @@
         package->ActionFormat = load_dynamic_stringW(row,3);
 
         if (package->LastAction)
-            HeapFree(GetProcessHeap(),0,package->ActionFormat);
-        package->LastAction = PACKAGE_dupstrW(action);
+            HeapFree(GetProcessHeap(),0,package->LastAction);
+        package->LastAction = dupstrW(action);
 
         msiobj_release(&row->hdr);
         MSI_ViewClose(view);
@@ -634,6 +650,58 @@
     msiobj_release(&row->hdr);
 }
 
+/*
+ *  build_directory_name()
+ *
+ *  This function is to save messing round with directory names
+ *  It handles adding backslashes between path segments, 
+ *   and can add \ at the end of the directory name if told to.
+ *
+ *  It takes a variable number of arguments.
+ *  It always allocates a new string for the result, so make sure
+ *   to free the return value when finished with it.
+ *
+ *  The first arg is the number of path segments that follow.
+ *  The arguments following count are a list of path segments.
+ *  A path segment may be NULL.
+ *
+ *  Path segments will be added with a \ seperating them.
+ *  A \ will not be added after the last segment, however if the
+ *    last segment is NULL, then the last character will be a \
+ * 
+ */
+static LPWSTR build_directory_name(DWORD count, ...)
+{
+    DWORD sz = 1, i;
+    LPWSTR dir;
+    va_list va;
+
+    va_start(va,count);
+    for(i=0; i<count; i++)
+    {
+        LPCWSTR str = va_arg(va,LPCWSTR);
+        if (str)
+            sz += strlenW(str) + 1;
+    }
+    va_end(va);
+
+    dir = HeapAlloc(GetProcessHeap(), 0, sz*sizeof(WCHAR));
+    dir[0]=0;
+
+    va_start(va,count);
+    for(i=0; i<count; i++)
+    {
+        LPCWSTR str = va_arg(va,LPCWSTR);
+        if (!str)
+            continue;
+        strcatW(dir, str);
+        if( ((i+1)!=count) && dir[strlenW(dir)-1]!='\\')
+            strcatW(dir, cszbs);
+    }
+    return dir;
+}
+
+
 /****************************************************
  * TOP level entry points 
  *****************************************************/
@@ -650,7 +718,7 @@
     {
         LPWSTR p, check, path;
  
-        path = PACKAGE_dupstrW(szPackagePath);
+        path = dupstrW(szPackagePath);
         p = strrchrW(path,'\\');    
         if (p)
         {
@@ -658,12 +726,12 @@
             *p=0;
         }
 
-        check = PACKAGE_GetProperty(package, cszSourceDir);
+        check = load_dynamic_property(package, cszSourceDir,NULL);
         if (!check)
-        {
             MSI_SetPropertyW(package, cszSourceDir, path);
+        else
             HeapFree(GetProcessHeap(), 0, check);
-        }
+
         HeapFree(GetProcessHeap(), 0, path);
     }
 
@@ -709,7 +777,8 @@
 
                 if (strlenW(prop) > 0)
                 {
-                    TRACE("Found commandline property (%s) = (%s)\n", debugstr_w(prop), debugstr_w(val));
+                    TRACE("Found commandline property (%s) = (%s)\n", 
+                                       debugstr_w(prop), debugstr_w(val));
                     MSI_SetPropertyW(package,prop,val);
                 }
             }
@@ -1193,7 +1262,6 @@
     return ERROR_SUCCESS;
 }
 
-
 typedef UINT __stdcall CustomEntry(MSIHANDLE);
 typedef struct 
 {
@@ -1313,28 +1381,38 @@
 static UINT HANDLE_CustomType2(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type)
 {
-    WCHAR tmp_file[MAX_PATH*2];
+    WCHAR tmp_file[MAX_PATH];
     STARTUPINFOW si;
     PROCESS_INFORMATION info;
     BOOL rc;
+    INT len;
     WCHAR *deformated;
+    WCHAR *cmd;
     static const WCHAR spc[] = {' ',0};
 
     memset(&si,0,sizeof(STARTUPINFOW));
 
     store_binary_to_temp(package, source, tmp_file);
 
-    strcatW(tmp_file,spc);
     deformat_string(package,target,&deformated);
-    strcatW(tmp_file,deformated);
+
+    len = strlenW(tmp_file) + strlenW(deformated) + 2;
+   
+    cmd = (WCHAR*)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*len);
+
+    strcpyW(cmd,tmp_file);
+    strcatW(cmd,spc);
+    strcatW(cmd,deformated);
 
     HeapFree(GetProcessHeap(),0,deformated);
 
-    TRACE("executing exe %s \n",debugstr_w(tmp_file));
+    TRACE("executing exe %s \n",debugstr_w(cmd));
 
-    rc = CreateProcessW(NULL, tmp_file, NULL, NULL, FALSE, 0, NULL,
+    rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL,
                   c_collen, &si, &info);
 
+    HeapFree(GetProcessHeap(),0,cmd);
+
     if ( !rc )
     {
         ERR("Unable to execute command\n");
@@ -1352,30 +1430,40 @@
 static UINT HANDLE_CustomType18(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type)
 {
-    WCHAR filename[MAX_PATH*2];
     STARTUPINFOW si;
     PROCESS_INFORMATION info;
     BOOL rc;
     WCHAR *deformated;
+    WCHAR *cmd;
+    INT len;
     static const WCHAR spc[] = {' ',0};
     int index;
 
     memset(&si,0,sizeof(STARTUPINFOW));
 
     index = get_loaded_file(package,source);
-    strcpyW(filename,package->files[index].TargetPath);
 
-    strcatW(filename,spc);
+    len = strlenW(package->files[index].TargetPath);
+
     deformat_string(package,target,&deformated);
-    strcatW(filename,deformated);
+    len += strlenW(deformated);
+    len += 2;
+
+    cmd = (WCHAR*)HeapAlloc(GetProcessHeap(),0,len * sizeof(WCHAR));
+
+    strcpyW(cmd, package->files[index].TargetPath);
+    strcatW(cmd, spc);
+    strcatW(cmd, deformated);
 
     HeapFree(GetProcessHeap(),0,deformated);
 
-    TRACE("executing exe %s \n",debugstr_w(filename));
+    TRACE("executing exe %s \n",debugstr_w(cmd));
 
-    rc = CreateProcessW(NULL, filename, NULL, NULL, FALSE, 0, NULL,
+    rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL,
                   c_collen, &si, &info);
 
+    HeapFree(GetProcessHeap(),0,cmd);
+    
     if ( !rc )
     {
         ERR("Unable to execute command\n");
@@ -1393,31 +1481,40 @@
 static UINT HANDLE_CustomType50(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type)
 {
-    WCHAR filename[MAX_PATH*2];
     STARTUPINFOW si;
     PROCESS_INFORMATION info;
+    WCHAR *prop;
     BOOL rc;
     WCHAR *deformated;
+    WCHAR *cmd;
+    INT len;
+    UINT prc;
     static const WCHAR spc[] = {' ',0};
-    DWORD sz;
 
     memset(&si,0,sizeof(STARTUPINFOW));
+    memset(&info,0,sizeof(PROCESS_INFORMATION));
 
-    sz = MAX_PATH*2;
-    if (MSI_GetPropertyW(package,source,filename,&sz) != ERROR_SUCCESS)
-        return ERROR_FUNCTION_FAILED;
+    prop = load_dynamic_property(package,source,&prc);
+    if (!prop)
+        return prc;
 
-    strcatW(filename,spc);
     deformat_string(package,target,&deformated);
-    strcatW(filename,deformated);
+    len = strlenW(prop) + strlenW(deformated) + 2;
+    cmd = (WCHAR*)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*len);
+
+    strcpyW(cmd,prop);
+    strcatW(cmd,spc);
+    strcatW(cmd,deformated);
 
     HeapFree(GetProcessHeap(),0,deformated);
 
-    TRACE("executing exe %s \n",debugstr_w(filename));
+    TRACE("executing exe %s \n",debugstr_w(cmd));
 
-    rc = CreateProcessW(NULL, filename, NULL, NULL, FALSE, 0, NULL,
+    rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL,
                   c_collen, &si, &info);
 
+    HeapFree(GetProcessHeap(),0,cmd);
+    
     if ( !rc )
     {
         ERR("Unable to execute command\n");
@@ -1443,6 +1540,7 @@
     memset(&si,0,sizeof(STARTUPINFOW));
 
     filename = resolve_folder(package, source, FALSE, FALSE, NULL);
+
     if (!filename)
         return ERROR_FUNCTION_FAILED;
 
@@ -1485,7 +1583,8 @@
     WCHAR *new_path;
 
     new_path = HeapAlloc(GetProcessHeap(), 0, (strlenW(path) + 1) *
-sizeof(WCHAR));
+                                              sizeof(WCHAR));
+
     strcpyW(new_path, path);
 
     while((len = strlenW(new_path)) && new_path[len - 1] == '\\')
@@ -1796,7 +1895,6 @@
 {
     MSIQUERY * view;
     MSIRECORD * row;
-    DWORD sz;
     UINT rc;
     static const WCHAR Query_all[] = {
        'S','E','L','E','C','T',' ','*',' ',
@@ -1808,7 +1906,6 @@
     MSI_SetPropertyW(package, szCosting, szZero);
     MSI_SetPropertyW(package, cszRootDrive , c_collen);
 
-    sz = 0x100;
     rc = MSI_DatabaseOpenViewW(package->db,Query_all,&view);
     if (rc != ERROR_SUCCESS)
         return rc;
@@ -1965,7 +2062,7 @@
 
     memset(&package->folders[index],0,sizeof(MSIFOLDER));
 
-    package->folders[index].Directory = PACKAGE_dupstrW(dir);
+    package->folders[index].Directory = dupstrW(dir);
 
     rc = ACTION_OpenQuery(package->db, &view, Query, dir);
     if (rc != ERROR_SUCCESS)
@@ -2023,14 +2120,15 @@
     if (targetdir)
     {
         TRACE("   TargetDefault = %s\n",debugstr_w(targetdir));
-        HeapFree(GetProcessHeap(), 0, package->folders[index].TargetDefault);
-        package->folders[index].TargetDefault = PACKAGE_dupstrW(targetdir);
+        if (package->folders[index].TargetDefault)
+            HeapFree(GetProcessHeap(),0, package->folders[index].TargetDefault);
+        package->folders[index].TargetDefault = dupstrW(targetdir);
     }
 
     if (srcdir)
-       package->folders[index].SourceDefault = PACKAGE_dupstrW(srcdir);
+       package->folders[index].SourceDefault = dupstrW(srcdir);
     else if (targetdir)
-        package->folders[index].SourceDefault = PACKAGE_dupstrW(targetdir);
+        package->folders[index].SourceDefault = dupstrW(targetdir);
     HeapFree(GetProcessHeap(), 0, targetdir);
 
     parent = load_dynamic_stringW(row,2);
@@ -2047,7 +2145,7 @@
         package->folders[index].ParentIndex = -2;
     HeapFree(GetProcessHeap(), 0, parent);
 
-    package->folders[index].Property = PACKAGE_GetProperty(package, dir);
+    package->folders[index].Property = load_dynamic_property(package, dir,NULL);
 
     msiobj_release(&row->hdr);
     MSI_ViewClose(view);
@@ -2056,56 +2154,6 @@
     return index;
 }
 
-/*
- *  build_directory_name()
- *
- *  This function is to save messing round with directory names
- *  It handles adding backslashes between path segments, 
- *   and can add \ at the end of the directory name if told to.
- *
- *  It takes a variable number of arguments.
- *  It always allocates a new string for the result, so make sure
- *   to free the return value when finished with it.
- *
- *  The first arg is the number of path segments that follow.
- *  The arguments following count are a list of path segments.
- *  A path segment may be NULL.
- *
- *  Path segments will be added with a \ seperating them.
- *  A \ will not be added after the last segment, however if the
- *    last segment is NULL, then the last character will be a \
- * 
- */
-static LPWSTR build_directory_name(DWORD count, ...)
-{
-    DWORD sz = 1, i;
-    LPWSTR dir;
-    va_list va;
-
-    va_start(va,count);
-    for(i=0; i<count; i++)
-    {
-        LPCWSTR str = va_arg(va,LPCWSTR);
-        if (str)
-            sz += strlenW(str) + 1;
-    }
-    va_end(va);
-
-    dir = HeapAlloc(GetProcessHeap(), 0, sz*sizeof(WCHAR));
-    dir[0]=0;
-
-    va_start(va,count);
-    for(i=0; i<count; i++)
-    {
-        LPCWSTR str = va_arg(va,LPCWSTR);
-        if (!str)
-            continue;
-        strcatW(dir, str);
-        if( ((i+1)!=count) && dir[strlenW(dir)-1]!='\\')
-            strcatW(dir, cszbs);
-    }
-    return dir;
-}
 
 static LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name,
                            BOOL source, BOOL set_prop, MSIFOLDER **folder)
@@ -2120,10 +2168,10 @@
     {
         if (!source)
         {
-            path = PACKAGE_GetProperty(package,cszTargetDir);
+            path = load_dynamic_property(package,cszTargetDir,NULL);
             if (!path)
             {
-                path = PACKAGE_GetProperty(package,cszRootDrive);
+                path = load_dynamic_property(package,cszRootDrive,NULL);
                 if (set_prop)
                     MSI_SetPropertyW(package,cszTargetDir,path);
             }
@@ -2133,10 +2181,10 @@
         }
         else
         {
-            path = PACKAGE_GetProperty(package,cszSourceDir);
+            path = load_dynamic_property(package,cszSourceDir,NULL);
             if (!path)
             {
-                path = PACKAGE_GetProperty(package,cszDatabase);
+                path = load_dynamic_property(package,cszDatabase,NULL);
                 if (path)
                 {
                     p = strrchrW(path,'\\');
@@ -2164,18 +2212,18 @@
 
     if (!source && package->folders[i].ResolvedTarget)
     {
-        path = PACKAGE_dupstrW(package->folders[i].ResolvedTarget);
+        path = dupstrW(package->folders[i].ResolvedTarget);
         TRACE("   already resolved to %s\n",debugstr_w(path));
         return path;
     }
     else if (source && package->folders[i].ResolvedSource)
     {
-        path = PACKAGE_dupstrW(package->folders[i].ResolvedSource);
+        path = dupstrW(package->folders[i].ResolvedSource);
         return path;
     }
     else if (!source && package->folders[i].Property)
     {
-        path = PACKAGE_dupstrW(package->folders[i].Property);
+        path = dupstrW(package->folders[i].Property);
         TRACE("   internally set to %s\n",debugstr_w(path));
         if (set_prop)
             MSI_SetPropertyW(package,name,path);
@@ -2193,7 +2241,7 @@
         {
             TRACE("   TargetDefault = %s\n",debugstr_w(package->folders[i].TargetDefault));
             path = build_directory_name(3, p, package->folders[i].TargetDefault, NULL);
-            package->folders[i].ResolvedTarget = PACKAGE_dupstrW(path);
+            package->folders[i].ResolvedTarget = dupstrW(path);
             TRACE("   resolved into %s\n",debugstr_w(path));
             if (set_prop)
                 MSI_SetPropertyW(package,name,path);
@@ -2201,7 +2249,7 @@
         else 
         {
             path = build_directory_name(3, p, package->folders[i].SourceDefault, NULL);
-            package->folders[i].ResolvedSource = PACKAGE_dupstrW(path);
+            package->folders[i].ResolvedSource = dupstrW(path);
         }
         HeapFree(GetProcessHeap(),0,p);
     }
@@ -2283,17 +2331,29 @@
         if (file->ComponentIndex >= 0)
             comp = &package->components[file->ComponentIndex];
 
+        if (file->Temporary == TRUE)
+            continue;
+
         if (comp)
         {
             LPWSTR p;
 
             /* calculate target */
             p = resolve_folder(package, comp->Directory, FALSE, FALSE, NULL);
+
+            if (file->TargetPath)
+                HeapFree(GetProcessHeap(),0,file->TargetPath);
+
+            TRACE("file %s is named %s\n",
+                   debugstr_w(file->File),debugstr_w(file->FileName));       
+
             file->TargetPath = build_directory_name(2, p, file->FileName);
 
+            HeapFree(GetProcessHeap(),0,p);
+
             TRACE("file %s resolves to %s\n",
                    debugstr_w(file->File),debugstr_w(file->TargetPath));       
- 
+
             if (GetFileAttributesW(file->TargetPath) == INVALID_FILE_ATTRIBUTES)
             {
                 file->State = 1;
@@ -2820,7 +2880,7 @@
 }
 
 inline static UINT get_file_target(MSIPACKAGE *package, LPCWSTR file_key, 
-                                   LPWSTR file_source)
+                                   LPWSTR* file_source)
 {
     DWORD index;
 
@@ -2833,7 +2893,7 @@
         {
             if (package->files[index].State >= 3)
             {
-                strcpyW(file_source,package->files[index].TargetPath);
+                *file_source = dupstrW(package->files[index].TargetPath);
                 return ERROR_SUCCESS;
             }
             else
@@ -2871,7 +2931,7 @@
     while (1)
     {
         WCHAR file_key[0x100];
-        WCHAR file_source[MAX_PATH];
+        WCHAR *file_source = NULL;
         WCHAR dest_name[0x100];
         LPWSTR dest_path, dest;
         WCHAR component[0x100];
@@ -2913,12 +2973,14 @@
             break;
         }
 
-        rc = get_file_target(package,file_key,file_source);
+        rc = get_file_target(package,file_key,&file_source);
 
         if (rc != ERROR_SUCCESS)
         {
             ERR("Original file unknown %s\n",debugstr_w(file_key));
             msiobj_release(&row->hdr);
+            if (file_source)
+                HeapFree(GetProcessHeap(),0,file_source);
             break;
         }
 
@@ -2936,7 +2998,7 @@
         if (MSI_RecordIsNull(row,5))
         {
             LPWSTR p;
-            dest_path = PACKAGE_dupstrW(file_source);
+            dest_path = dupstrW(file_source);
             p = strrchrW(dest_path,'\\');
             if (p)
                 *p=0;
@@ -2952,6 +3014,8 @@
             {
                 ERR("Unable to get destination folder\n");
                 msiobj_release(&row->hdr);
+                if (file_source)
+                    HeapFree(GetProcessHeap(),0,file_source);
                 break;
             }
         }
@@ -2960,10 +3024,10 @@
         HeapFree(GetProcessHeap(), 0, dest_path);
            
         TRACE("Duplicating file %s to %s\n",debugstr_w(file_source),
-              debugstr_w(dest_path)); 
+              debugstr_w(dest)); 
         
-        if (strcmpW(file_source,dest_path))
-            rc = !CopyFileW(file_source,dest_path,TRUE);
+        if (strcmpW(file_source,dest))
+            rc = !CopyFileW(file_source,dest,TRUE);
         else
             rc = ERROR_SUCCESS;
         
@@ -2973,11 +3037,12 @@
         FIXME("We should track these duplicate files as well\n");   
  
         msiobj_release(&row->hdr);
+        HeapFree(GetProcessHeap(),0,dest);
+        HeapFree(GetProcessHeap(),0,file_source);
     }
     MSI_ViewClose(view);
     msiobj_release(&view->hdr);
     return rc;
-
 }
 
 
@@ -3327,7 +3392,7 @@
 
     TRACE("Checking Install Level\n");
 
-    level = PACKAGE_GetProperty(package,szlevel);
+    level = load_dynamic_property(package,szlevel,NULL);
     if (level)
     {
         install_level = atoiW(level);
@@ -3336,7 +3401,7 @@
     else
         install_level = 1;
 
-    override = PACKAGE_GetProperty(package,szAddLocal);
+    override = load_dynamic_property(package,szAddLocal,NULL);
    
     /*
      * Components FeatureState defaults to FALSE. The idea is we want to 
@@ -3470,22 +3535,20 @@
     return rc;
 }
 
-static void resolve_keypath( MSIPACKAGE* package, INT
-                            component_index, WCHAR *keypath)
+static LPWSTR resolve_keypath( MSIPACKAGE* package, INT
+                            component_index)
 {
     MSICOMPONENT* cmp = &package->components[component_index];
 
     if (cmp->KeyPath[0]==0)
     {
         LPWSTR p = resolve_folder(package,cmp->Directory,FALSE,FALSE,NULL);
-        strcpyW(keypath,p);
-        HeapFree(GetProcessHeap(),0,p);
-        return;
+        return p;
     }
     if ((cmp->Attributes & 0x4) || (cmp->Attributes & 0x20))
     {
         FIXME("UNIMPLEMENTED keypath as Registry or ODBC Source\n");
-        keypath[0]=0;
+        return NULL;
     }
     else
     {
@@ -3493,8 +3556,12 @@
         j = get_loaded_file(package,cmp->KeyPath);
 
         if (j>=0)
-            strcpyW(keypath,package->files[j].TargetPath);
+        {
+            LPWSTR p = dupstrW(package->files[j].TargetPath);
+            return p;
+        }
     }
+    return NULL;
 }
 
 /*
@@ -3529,9 +3596,9 @@
         return ERROR_INVALID_HANDLE;
 
     /* writes the Component and Features values to the registry */
-    productcode = PACKAGE_GetProperty(package,szProductCode);
+    productcode = load_dynamic_property(package,szProductCode,&rc);
     if (!productcode)
-        return ERROR_SUCCESS;
+        return rc;
 
     squash_guid(productcode,squished_pc);
     rc = RegCreateKeyW(HKEY_LOCAL_MACHINE,szInstaller,&hkey);
@@ -3588,7 +3655,7 @@
     {
         if (package->components[i].ComponentId[0]!=0)
         {
-            WCHAR keypath[0x1000];
+            WCHAR *keypath = NULL;
             MSIRECORD * uirow;
 
             squash_guid(package->components[i].ComponentId,squished_cc);
@@ -3596,19 +3663,23 @@
             if (rc != ERROR_SUCCESS)
                 continue;
            
-            resolve_keypath(package,i,keypath);
-
-            RegSetValueExW(hkey3,squished_pc,0,REG_SZ,(LPVOID)keypath,
+            keypath = resolve_keypath(package,i);
+            if (keypath)
+            {
+                RegSetValueExW(hkey3,squished_pc,0,REG_SZ,(LPVOID)keypath,
                             (strlenW(keypath)+1)*sizeof(WCHAR));
-            RegCloseKey(hkey3);
+                RegCloseKey(hkey3);
         
-            /* UI stuff */
-            uirow = MSI_CreateRecord(3);
-            MSI_RecordSetStringW(uirow,1,productcode);
-            MSI_RecordSetStringW(uirow,2,package->components[i].ComponentId);
-            MSI_RecordSetStringW(uirow,3,keypath);
-            ui_actiondata(package,szProcessComponents,uirow);
-            msiobj_release( &uirow->hdr );
+                /* UI stuff */
+                uirow = MSI_CreateRecord(3);
+                MSI_RecordSetStringW(uirow,1,productcode);
+                MSI_RecordSetStringW(uirow,2,package->components[i].
+                                                        ComponentId);
+                MSI_RecordSetStringW(uirow,3,keypath);
+                ui_actiondata(package,szProcessComponents,uirow);
+                msiobj_release( &uirow->hdr );
+                HeapFree(GetProcessHeap(),0,keypath);
+            }
         }
     } 
 end:
@@ -4187,10 +4258,13 @@
 }
 
 static UINT build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name, 
-                            LPWSTR FilePath)
+                            LPWSTR *FilePath)
 {
     LPWSTR ProductCode;
     LPWSTR SystemFolder;
+    LPWSTR dest;
+    UINT rc;
+
     static const WCHAR szInstaller[] = 
         {'I','n','s','t','a','l','l','e','r','\\',0};
     static const WCHAR szProductCode[] =
@@ -4198,21 +4272,21 @@
     static const WCHAR szFolder[] =
         {'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
 
-    ProductCode = PACKAGE_GetProperty(package,szProductCode);
+    ProductCode = load_dynamic_property(package,szProductCode,&rc);
     if (!ProductCode)
-        return ERROR_FUNCTION_FAILED;
+        return rc;
 
-    SystemFolder = PACKAGE_GetProperty(package,szFolder);
+    SystemFolder = load_dynamic_property(package,szFolder,NULL);
 
-    strcatW(SystemFolder,szInstaller); 
-    strcatW(SystemFolder,ProductCode);
-    create_full_pathW(SystemFolder);
+    dest = build_directory_name(3, SystemFolder, szInstaller, ProductCode);
 
-    strcpyW(FilePath,SystemFolder);
-    strcatW(FilePath,cszbs);
-    strcatW(FilePath,icon_name);
+    create_full_pathW(dest);
+
+    *FilePath = build_directory_name(2, dest, icon_name);
+
     HeapFree(GetProcessHeap(),0,SystemFolder);
     HeapFree(GetProcessHeap(),0,ProductCode);
+    HeapFree(GetProcessHeap(),0,dest);
     return ERROR_SUCCESS;
 }
 
@@ -4357,16 +4431,17 @@
 
         if (!MSI_RecordIsNull(row,9))
         {
-            WCHAR Path[MAX_PATH];
+            WCHAR *Path = NULL;
             INT index; 
 
             sz = 0x100;
             MSI_RecordGetStringW(row,9,buffer,&sz);
 
-            build_icon_path(package,buffer,Path);
+            build_icon_path(package,buffer,&Path);
             index = MSI_RecordGetInteger(row,10);
 
             IShellLinkW_SetIconLocation(sl,Path,index);
+            HeapFree(GetProcessHeap(),0,Path);
         }
 
         if (!MSI_RecordIsNull(row,11))
@@ -4384,7 +4459,9 @@
 
         TRACE("Writing shortcut to %s\n",debugstr_w(target_file));
         IPersistFile_Save(pf,target_file,FALSE);
-        
+    
+        HeapFree(GetProcessHeap(),0,target_file);    
+
         IPersistFile_Release( pf );
         IShellLinkW_Release( sl );
 
@@ -4434,8 +4511,8 @@
     while (1)
     {
         HANDLE the_file;
-        WCHAR FilePath[MAX_PATH];
-        WCHAR FileName[MAX_PATH];
+        WCHAR *FilePath=NULL;
+        WCHAR *FileName=NULL;
         CHAR buffer[1024];
 
         rc = MSI_ViewFetch(view,&row);
@@ -4445,16 +4522,17 @@
             break;
         }
     
-        sz = MAX_PATH;
-        MSI_RecordGetStringW(row,1,FileName,&sz);
-        if (sz == 0)
+        FileName = load_dynamic_stringW(row,1);
+        if (!FileName)
         {
             ERR("Unable to get FileName\n");
             msiobj_release(&row->hdr);
             continue;
         }
 
-        build_icon_path(package,FileName,FilePath);
+        build_icon_path(package,FileName,&FilePath);
+
+        HeapFree(GetProcessHeap(),0,FileName);
 
         TRACE("Creating icon file at %s\n",debugstr_w(FilePath));
         
@@ -4465,6 +4543,7 @@
         {
             ERR("Unable to create file %s\n",debugstr_w(FilePath));
             msiobj_release(&row->hdr);
+            HeapFree(GetProcessHeap(),0,FilePath);
             continue;
         }
 
@@ -4483,6 +4562,8 @@
             WriteFile(the_file,buffer,sz,&write,NULL);
         } while (sz == 1024);
 
+        HeapFree(GetProcessHeap(),0,FilePath);
+
         CloseHandle(the_file);
         msiobj_release(&row->hdr);
     }
@@ -4584,11 +4665,12 @@
         *pcchPathBuf = strlenW(path)+1;
         rc = ERROR_MORE_DATA;
     }
-    else if (rc == ERROR_SUCCESS)
+    else if (path)
     {
         *pcchPathBuf = strlenW(path)+1;
         strcpyW(szPathBuf,path);
         TRACE("Returning Path %s\n",debugstr_w(path));
+        rc = ERROR_SUCCESS;
     }
     HeapFree(GetProcessHeap(),0,path);
     
@@ -4645,14 +4727,16 @@
     if (path && strlenW(path) > *pcchPathBuf)
     {
         *pcchPathBuf = strlenW(path)+1;
-        return ERROR_MORE_DATA;
+        rc = ERROR_MORE_DATA;
     }
-    else if (rc == ERROR_SUCCESS)
+    else if (path)
     {
         *pcchPathBuf = strlenW(path)+1;
         strcpyW(szPathBuf,path);
         TRACE("Returning Path %s\n",debugstr_w(path));
+        rc = ERROR_SUCCESS;
     }
+    HeapFree(GetProcessHeap(),0,path);
     
     return rc;
 }
