diff --git a/erpnext/home/page/event_updates/event_updates.js b/erpnext/home/page/event_updates/event_updates.js
index 9a76d16..99e8605 100644
--- a/erpnext/home/page/event_updates/event_updates.js
+++ b/erpnext/home/page/event_updates/event_updates.js
@@ -613,7 +613,7 @@
 			// complete registration
 			if(in_list(user_roles,'System Manager')) { 
 				wn.require("erpnext/home/page/event_updates/complete_registration.js");
-				pscript.complete_registration(r.message.registration_complete); 
+				pscript.complete_registration(r.message.registration_complete, r.message.profile); 
 			}
 			
 			// setup wizard
@@ -624,6 +624,114 @@
 	);	
 }
 
+// complete my company registration
+// --------------------------------
+pscript.complete_registration = function(is_complete, profile) {
+	if(is_complete == 'No'){
+		var d = new Dialog(400, 200, "Setup your Account");
+		if(user != 'Administrator'){
+			d.no_cancel(); // Hide close image
+			$dh(page_body.wntoolbar.wrapper);
+		}
+
+		d.make_body([
+			['HTML', 'Your Profile Details', '<h4>Your Profile Details</h4>'],
+			['Data', 'First Name'],
+			['Data', 'Last Name'],
+			['HTML', 'Company Details', '<h4>Create your first company</h4>'],
+			['Data','Company Name','Example: Your Company LLC'],
+	  		['Data','Company Abbreviation', 'Example: YC (all your acconts will have this as a suffix)'],
+	  		['Select','Fiscal Year Start Date'],
+	  		['Select','Default Currency'],
+	  		['Button','Save'],
+		]);
+
+		// if company name is set, set the input value
+		// and disable it
+		if(locals['Control Panel']['Control Panel'].company_name) {
+			d.widgets['Company Name'].value = locals['Control Panel']['Control Panel'].company_name;
+			d.widgets['Company Name'].disabled = 1;
+		}
+
+		if(profile && profile.length>0) {
+			if(profile[0].first_name && profile[0].first_name!='None') {
+				d.widgets['First Name'].value = profile[0].first_name;
+			}
+
+			if(profile[0].last_name && profile[0].last_name!='None') {
+				d.widgets['Last Name'].value = profile[0].last_name;
+			}
+		}		
+
+		//d.widgets['Save'].disabled = true;	  // disable Save button
+		pscript.make_dialog_field(d);
+
+		// submit details
+		d.widgets['Save'].onclick = function()
+		{
+			d.widgets['Save'].set_working();
+			
+			flag = pscript.validate_fields(d);
+			if(flag)
+			{
+				var args = [
+					d.widgets['Company Name'].value,
+					d.widgets['Company Abbreviation'].value,
+					d.widgets['Fiscal Year Start Date'].value,
+					d.widgets['Default Currency'].value,
+					d.widgets['First Name'].value,
+					d.widgets['Last Name'].value
+				];
+				
+				$c_obj('Setup Control','setup_account',JSON.stringify(args),function(r, rt){
+					sys_defaults = r.message.sys_defaults;
+					user_fullname = r.message.user_fullname;
+					d.hide();
+					$ds(page_body.wntoolbar.wrapper);
+					$('#user_fullname').html(user_fullname + " (Profile Settings)");
+				});
+			} else {
+				d.widgets['Save'].done_working();
+			}
+		}
+		d.show();
+	}
+}
+
+// make dialog fields
+// ------------------
+pscript.make_dialog_field = function(d)
+{
+	// fiscal year format 
+	fisc_format = d.widgets['Fiscal Year Start Date'];
+	add_sel_options(fisc_format, ['', '1st Jan', '1st Apr', '1st Jul', '1st Oct']);
+  
+	// default currency
+	currency_list = ['', 'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL', 'BSD', 'BTN', 'BYR', 'BZD', 'CAD', 'CDF', 'CFA', 'CFP', 'CHF', 'CLP', 'CNY', 'COP', 'CRC', 'CUC', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EEK', 'EGP', 'ERN', 'ETB', 'EUR', 'EURO', 'FJD', 'FKP', 'FMG', 'GBP', 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GQE', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LTL', 'LVL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRO', 'MUR', 'MVR', 'MWK', 'MXN', 'MYR', 'MZM', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NRs', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RMB', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SCR', 'SDG', 'SDR', 'SEK', 'SGD', 'SHP', 'SOS', 'SRD', 'STD', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TRY', 'TTD', 'TWD', 'TZS', 'UAE', 'UAH', 'UGX', 'USD', 'USh', 'UYU', 'UZS', 'VEB', 'VND', 'VUV', 'WST', 'XAF', 'XCD', 'XDR', 'XOF', 'XPF', 'YEN', 'YER', 'YTL', 'ZAR', 'ZMK', 'ZWR'];
+	currency = d.widgets['Default Currency'];
+	add_sel_options(currency, currency_list);
+}
+
+
+// validate fields
+// ---------------
+pscript.validate_fields = function(d)
+{
+	var lst = ['First Name', 'Company Name', 'Company Abbreviation', 'Fiscal Year Start Date', 'Default Currency'];
+	var msg = 'Please enter the following fields\n';
+	var flag = 1;
+	for(var i=0; i<lst.length; i++)
+	{
+		if(!d.widgets[lst[i]].value || d.widgets[lst[i]].value=='None'){
+			flag = 0;
+			msg = msg + NEWLINE + lst[i];
+		}
+	}
+
+	if(!flag)  alert(msg);
+	return flag;
+}
+
 SetupWizard = function(status) { 
 	var me = this;
 	$.extend(this, {
diff --git a/erpnext/home/page/event_updates/event_updates.py b/erpnext/home/page/event_updates/event_updates.py
index 1d1d1b2..e4690d0 100644
--- a/erpnext/home/page/event_updates/event_updates.py
+++ b/erpnext/home/page/event_updates/event_updates.py
@@ -36,7 +36,10 @@
 		'is_trial': webnotes.conn.get_global('is_trial'),
 		'days_to_expiry': (webnotes.conn.get_global('days_to_expiry') or '0'),
 		'setup_status': get_setup_status(),
-		'registration_complete': cint(get_defaults('registration_complete')) and 'Yes' or 'No'
+		'registration_complete': cint(get_defaults('registration_complete')) and 'Yes' or 'No',
+		'profile': webnotes.conn.sql("""\
+			SELECT first_name, last_name FROM `tabProfile`
+			WHERE name=%s AND docstatus<2""", webnotes.user.name, as_dict=1)
 	}
 	return ret
 
@@ -89,4 +92,4 @@
 		return ''
 		
 	return {'ret': ret, 'percent': percent}
-		
\ No newline at end of file
+		
diff --git a/erpnext/setup/doctype/setup_control/setup_control.py b/erpnext/setup/doctype/setup_control/setup_control.py
index 55b967e..6616338 100644
--- a/erpnext/setup/doctype/setup_control/setup_control.py
+++ b/erpnext/setup/doctype/setup_control/setup_control.py
@@ -47,9 +47,17 @@
 	# Account Setup
 	# ---------------
 	def setup_account(self, args):
-		company_name, comp_abbr, fy_start, currency = eval(args)
+		import webnotes
+		company_name, comp_abbr, fy_start, currency, first_name, last_name = eval(args)
 		curr_fiscal_year,fy_start_date = self.get_fy_details(fy_start)
 		self.currency = currency
+
+		# Update Profile
+		if last_name=='None': last_name = None
+		webnotes.conn.sql("""\
+			UPDATE `tabProfile` SET first_name=%s, last_name=%s
+			WHERE name=%s AND docstatus<2""", (first_name, last_name, webnotes.user.name))
+			
 		
 		# Fiscal Year
 		master_dict = {'Fiscal Year':{'year':curr_fiscal_year, 'year_start_date':fy_start_date}}
@@ -66,6 +74,7 @@
 								'default_currency': currency,
 								'default_company':company_name,
 								'default_valuation_method':'FIFO',
+								'default_stock_uom':'Nos',
 								'date_format':'dd-mm-yyyy',
 								'default_currency_format':'Lacs',
 								'so_required':'No',
@@ -87,7 +96,8 @@
 		msgprint("Great! Your company has now been created")
 		
 		import webnotes.utils
-		return webnotes.utils.get_defaults()
+		user_fullname = (first_name or '') + (last_name and (" " + last_name) or '')
+		return {'sys_defaults': webnotes.utils.get_defaults(), 'user_fullname': user_fullname}
 
 		
 	# Get Fiscal year Details
