public static bool UpgradeProjectProperties(Microsoft.Build.Evaluation.Project project, bool cpp)
        {
            bool modified = false;

            string outputDir       = null;
            string headerOutputDir = null;
            string baseDirectoryForGeneratedInclude = null;

            string value = project.GetProperty(PropertyNames.Old.OutputDir, false);

            if (!string.IsNullOrEmpty(value))
            {
                project.RemovePropertyWithName(PropertyNames.Old.OutputDir);
                value = value.Replace("$(IceBuilder", "%(");
                project.SetItemMetadata(ItemMetadataNames.OutputDir, value);
                modified  = true;
                outputDir = value;
            }
            else if (cpp)
            {
                // The default output directory for C++ generated items was changed to $(IntDir)
                // but we keep the old default when converted projects by setting it in the project
                // file
                project.SetItemMetadata(ItemMetadataNames.OutputDir, "generated");
            }

            value = project.GetProperty(PropertyNames.Old.IncludeDirectories, false);
            if (!string.IsNullOrEmpty(value))
            {
                project.RemovePropertyWithName(PropertyNames.Old.IncludeDirectories);
                value = value.Replace("$(IceHome)\\slice", "");
                value = value.Replace("$(IceHome)/slice", "");
                value = value.Trim(';');
                value = value.Replace("$(IceBuilder", "%(");
                if (!string.IsNullOrEmpty(value))
                {
                    project.SetItemMetadata(ItemMetadataNames.IncludeDirectories, value);
                }
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.HeaderOutputDir, false);
            if (!string.IsNullOrEmpty(value))
            {
                project.RemovePropertyWithName(PropertyNames.Old.HeaderOutputDir);
                value = value.Replace("$(IceBuilder", "%(");
                project.SetItemMetadata(ItemMetadataNames.HeaderOutputDir, value);
                modified        = true;
                headerOutputDir = value;
            }

            value = project.GetProperty(PropertyNames.Old.HeaderExt, false);
            if (!string.IsNullOrEmpty(value))
            {
                project.RemovePropertyWithName(PropertyNames.Old.HeaderExt);
                project.SetItemMetadata(ItemMetadataNames.HeaderExt, value);
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.BaseDirectoryForGeneratedInclude, false);
            if (!string.IsNullOrEmpty(value))
            {
                project.RemovePropertyWithName(PropertyNames.Old.BaseDirectoryForGeneratedInclude);
                project.SetItemMetadata(ItemMetadataNames.BaseDirectoryForGeneratedInclude, value);
                modified = true;
                baseDirectoryForGeneratedInclude = value;
            }

            value = project.GetProperty(PropertyNames.Old.SourceExt, false);
            if (!string.IsNullOrEmpty(value))
            {
                project.RemovePropertyWithName(PropertyNames.Old.SourceExt);
                project.SetItemMetadata(ItemMetadataNames.SourceExt, value);
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.AllowIcePrefix, false);
            string additionalOptions = project.GetProperty(PropertyNames.Old.AdditionalOptions, false);

            if (!string.IsNullOrEmpty(additionalOptions))
            {
                project.RemovePropertyWithName(PropertyNames.Old.AdditionalOptions);
                modified = true;
            }

            if (!string.IsNullOrEmpty(value))
            {
                if (value.Equals("yes", StringComparison.CurrentCultureIgnoreCase) ||
                    value.Equals("true", StringComparison.CurrentCultureIgnoreCase))
                {
                    additionalOptions = String.Format("{0} --ice", additionalOptions).Trim();
                }
                project.RemovePropertyWithName(PropertyNames.Old.AllowIcePrefix);
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.Underscore, false);
            if (!string.IsNullOrEmpty(value))
            {
                if (value.Equals("yes", StringComparison.CurrentCultureIgnoreCase) ||
                    value.Equals("true", StringComparison.CurrentCultureIgnoreCase))
                {
                    additionalOptions = String.Format("{0} --underscore", additionalOptions).Trim();
                }
                project.RemovePropertyWithName(PropertyNames.Old.Underscore);
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.Stream, false);
            if (!string.IsNullOrEmpty(value))
            {
                if (value.Equals("yes", StringComparison.CurrentCultureIgnoreCase) ||
                    value.Equals("true", StringComparison.CurrentCultureIgnoreCase))
                {
                    additionalOptions = String.Format("{0} --stream ", additionalOptions).Trim();
                }
                project.RemovePropertyWithName(PropertyNames.Old.Stream);
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.DLLExport, false);
            if (!string.IsNullOrEmpty(value))
            {
                additionalOptions = String.Format("{0} --dll-export {1}", additionalOptions, value).Trim();
                project.RemovePropertyWithName(PropertyNames.Old.DLLExport);
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.Checksum, false);
            if (!string.IsNullOrEmpty(value))
            {
                additionalOptions = String.Format("{0} --checksum", additionalOptions).Trim();
                project.RemovePropertyWithName(PropertyNames.Old.Checksum);
                modified = true;
            }

            value = project.GetProperty(PropertyNames.Old.Tie, false);
            if (!string.IsNullOrEmpty(value))
            {
                additionalOptions = String.Format("{0} --tie", additionalOptions).Trim();
                project.RemovePropertyWithName(PropertyNames.Old.Tie);
                modified = true;
            }

            if (!string.IsNullOrEmpty(additionalOptions))
            {
                additionalOptions = additionalOptions.Replace("IceBuilder", "SliceCompile");
                project.SetItemMetadata(ItemMetadataNames.AdditionalOptions, additionalOptions);
            }

            if (string.IsNullOrEmpty(baseDirectoryForGeneratedInclude))
            {
                if (!string.IsNullOrEmpty(headerOutputDir))
                {
                    project.SetClCompileAdditionalIncludeDirectories(headerOutputDir);
                }
                else
                {
                    project.SetClCompileAdditionalIncludeDirectories(outputDir);
                }
            }

            value = project.GetProperty("ProjectTypeGuids", false);
            if (!string.IsNullOrEmpty(value))
            {
                value = value.Replace(Package.IceBuilderOldFlavor, Package.IceBuilderNewFlavor);
                project.SetProperty("ProjectTypeGuids", value, "");
                modified = true;
            }

            return(modified);
        }