Thank you everyone for some great responses! While I've been the lead developer in many projects I've only been in business a little over a year. Im still learning a lot of things the hard way. I learned a few things from this project; so even if I have to send this guy to collections or am forced to sue him, It was a valuable experience. I made a few mistakes with this guy.. * I discounted my rate to get the job. * I let the project start without a hard specification. * I didn't get a firm contract since there wasn't a firm definition of the deliverable. For those reasons I said I'd do it on an hourly basis and bill him periodically. Later in the game he wants to shift to a milestone based billing, essentially one HUGE milestone that includes half of his project. He already owes me for 56 hours of work, the rest of the project if all goes well should take another 20 hours. It's a lot of money to my small company to be at risk. What really makes me nervous is that he doesn't even want to pay half of what he currently owes me. This project has made me realize that I can't take on another project before I get some contracts created that spell out my terms. The project in question is an Internet application modification project. The $99 software he wanted it based on was junk. Despite my recommendations to pick something else due to scalability and design issues, he wanted to stick with it. It's a Perl CGI web application with ton's of SQL calls per page, REALLY screwy template and variable 'mazes' in the code, and zero documentation related to the code itself. Making modifications to it is very time consuming compaired to a project you'd download on sourceforge. Having the source code and being 'open source' are two different things. With an open source project you have people to turn to when you find code that doesn't follow typical design methodologies. Heres a breakdown of a typical line of code from this code, I sent this to the client to explain the issues I was having : Heres *one line* from bidding.pm in *AccountMgr.pm*: * $Template =&Translate_File($Global{BiddingList_Template});* **/The above line looks innocent enough until you try to figure out what it's loading:/ Searching through the code I eventually find this line in* Configuration.pm*: $Global{BiddingList_Template} = "$Global{Template_Dir}/BiddingList.html"; Looking up $Global{Template_Dir}I eventually find this line: $Global{Template_Dir} = "$Global{Templates_Dir}/$Global{Theme}"; Now there are two variables to decode ($Global{Templates_Dir} and $Global{Theme} $Global{Templates_Dir} = "$Global{Data_Dir}/templates Ok.. now I have to look up $Global{Data_Dir} $Global{Data_Dir} = "$Global{CGI_Dir}/data This isn't defined specifically anywhere I can find with grep.. but must be /cgi-bin/auction/ Now theres $Global{Theme} $Global{Theme} = $Themes{$Global{Language}}; Now theres $Global{Language} $Global{Language} = $Cookies{User_Language} Cant find this anywhere.. but it must be English. That leaves $Themes{English} I finally find this line: $Themes{$Lang} = $Theme; Another line in Configuration.pm: ($Lang, $Theme) = split(/\:/, $Line); and $Line comes from $Global{Themes} And finally in Defaults.pm I find that line: *Defaults.pm*: $Global{Themes} = "English:Default"; The above line is splitting $Global{Themes} on ':' into $Lang and $Theme. /*So what file is it loading?? :)*/ /**/It's loading: /cgi-bin/auction/data/tempates/Default/BiddingList.html Then theres the function that's processing the file: Translate_File *DisplayMgr.pm: Translate_File* All that does is load the whole file into a string, simple enough once you figure out all the layers of BS to get there. . *_Thats just one line._* I hate when people write code like this; it's almost like the author purposefully made it obscure though perl makes that an easy task (grin) On that note.. did that person that was looking for the Perl list like this one find one? JD -- JD Austin Twin Geckos Technology Services LLC email: jd@twingeckos.com http://www.twingeckos.com phone/fax: 480.344.2640