Pay attention to the terminology from the caller's perspective.  For example, when you create an instance with the (string fileName) constructor, you can then read the file name from the "File" property.  In C#, File implies a System.IO.File object reference rather than the name of the file. As for the builder pattern mentioned above, think about this -- How useful would it be to create an ImageCPG instance using a no-arg constructor.  By having no public contructor and using a static method to build an instance for you, this is expressed a little more elegantly.  It's probably a good idea to discard the file name after loading the XML.  Life is much simpler if that doesn't cause you to scratch your head two years from now (like when you clone an instance and the filename gets copied, then you save over the original). What's with the resize timer?  That's gonna bite you in the ass later.  Is the image guaranteed to be fully rendered in 2 seconds?  If you want to redraw while resizing, let it start immediately and interrupt and restart the process at each new size.  Then people with reallllly fast computers (that would be nearly everybody in three years) can actually enjoy them.  People with really slow computers are going to be screwed anyways, this code isn't going to help them at all.  If you want to do flicker prevention, use a model like "no size change in last 0.1 seconds" rather than "2 seconds after resizing starts", or even better -- use double buffering.  Double buffering will fix all of the UI uglinesses. As for pure readability, handling of the group type is a little hard to read.  First, a switch is made on the name of the node to set the group type, then another switch actually performs the operation.  Often, the two seem to be intermingled.  For example, for an inverse, the first switch sets "group = CPGGroupType.Inverse".  Then the second switch catches a bunch of node names and then does a buch of ifs and if the group is CPGGroupType.Inverse, then it performs the inverse.  It shouldn't take two switches and an if to get such a direct consequence.  That code should probably be refactored into a section that determines what actions should be performed and a bunch of routines that do them. My 2 cents, take them or leave them.