diff --git a/selling/doctype/lead/lead.py b/selling/doctype/lead/lead.py
index c336fe2..571cdfd 100644
--- a/selling/doctype/lead/lead.py
+++ b/selling/doctype/lead/lead.py
@@ -97,7 +97,6 @@
 		return webnotes.conn.get_value('Sales Email Settings',None,'email_id')
 
 	def on_trash(self):
-		webnotes.conn.sql("""delete from tabCommunication where lead=%s""",
-			self.doc.name)
+		webnotes.conn.sql("""update tabCommunication set lead=null where lead=%s""", self.doc.name)
 		webnotes.conn.sql("""update `tabSupport Ticket` set lead='' where lead=%s""",
 			self.doc.name)
diff --git a/setup/doctype/backup_manager/backup_googledrive.py b/setup/doctype/backup_manager/backup_googledrive.py
new file mode 100644
index 0000000..b1cb73a
--- /dev/null
+++ b/setup/doctype/backup_manager/backup_googledrive.py
@@ -0,0 +1,134 @@
+import httplib2
+import sys
+import os
+import mimetypes
+import webnotes
+import oauth2client.client
+from webnotes.utils import get_request_site_address, get_base_path
+from webnotes import _, msgprint
+from apiclient.discovery import build
+from apiclient.http import MediaFileUpload
+
+@webnotes.whitelist()
+def get_gdrive_authorize_url():
+	from conf import client_id, client_secret, oauth_scope, redirect_url
+	flow = get_gdrive_flow()
+	authorize_url = flow.step1_get_authorize_url()
+	return_address = get_request_site_address(True) \
+		+ "?cmd=setup.doctype.backup_manager.backup_googledrive.gdrive_callback"
+	return {
+		"authorize_url": authorize_url,
+	}
+
+@webnotes.whitelist(allow_guest=True)
+def gdrive_callback(verification_code = None):
+	flow = get_gdrive_flow()
+	if verification_code:
+		credentials = flow.step2_exchange(verification_code)
+		allowed = 1
+	http = httplib2.Http()
+	http = credentials.authorize(http)
+	final_credentials = credentials.to_json()
+	drive_service = build('drive', 'v2', http=http)
+	erpnext_folder_id = create_erpnext_folder(drive_service)
+	database_folder_id = create_folder('database', drive_service, erpnext_folder_id)
+	files_folder_id = create_folder('files', drive_service, erpnext_folder_id)
+	webnotes.msgprint(_("Google Drive Access Approved."))
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "gdrive_access_allowed", allowed)
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "database_folder_id", database_folder_id)
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "files_folder_id", files_folder_id)
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "gdrive_credentials", final_credentials)
+
+@webnotes.whitelist()
+def upload_files(name, mimetype, service, folder_id):
+	if not webnotes.conn:
+		webnotes.connect()
+	file_name = os.path.basename(name)
+	media_body = MediaFileUpload(name, mimetype=mimetype, resumable=True)
+	body = {
+		'title': file_name,
+		'description': 'Backup File',
+		'mimetype': mimetype,
+		'parents': [{
+			'kind': 'drive#filelink',
+			'id': folder_id
+		}]
+	}
+	request = service.files().insert(body=body, media_body=media_body)
+	response = None
+	while response is None:
+		status, response = request.next_chunk()
+
+def backup_to_gdrive():
+	from webnotes.utils.backups import new_backup
+	found_database = False
+	found_files = False
+	if not webnotes.conn:
+		webnotes.connect()
+	flow = get_gdrive_flow()
+	credentials_json = webnotes.conn.get_value("Backup Manager", None, "gdrive_credentials")
+	credentials = oauth2client.client.Credentials.new_from_json(credentials_json)
+	http = httplib2.Http()
+	http = credentials.authorize(http)
+	drive_service = build('drive', 'v2', http=http)
+
+	# upload database
+	backup = new_backup()
+	filename = os.path.basename(backup.backup_path_db)
+	# upload files to database folder
+	upload_files(filename, 'application/x-gzip', drive_service, webnotes.conn.get_value("Backup Manager", None, "database_folder_id"))
+	# upload files to files folder
+	path = os.path.join(get_base_path(),"public", "files")
+	for files in os.listdir(path):
+		filename = path + "/" + files
+		ext = filename.split('.')[-1]
+		size = os.path.getsize(filename)
+		if ext == 'gz' or ext == 'gzip':
+			mimetype = 'application/x-gzip'
+		else:
+			mimetype = mimetypes.types_map["." + ext]
+		#Compare Local File with Server File
+		param = {}
+	  	children = drive_service.children().list(folderId=webnotes.conn.get_value("Backup Manager", None, "files_folder_id"), **param).execute()
+	  	for child in children.get('items', []):
+			file = drive_service.files().get(fileId=child['id']).execute()
+			if files == file['title'] and size == int(file['fileSize']):
+				found_files = True
+				break
+		if not found_files:
+			upload_files(filename, mimetype, drive_service, webnotes.conn.get_value("Backup Manager", None, "files_folder_id"))
+
+def get_gdrive_flow():
+	from oauth2client.client import OAuth2WebServerFlow
+	try:
+		from conf import client_id, client_secret, oauth_scope, redirect_url
+	except ImportError, e:
+		webnotes.msgprint(_("Please set Google Drive access keys in") + " conf.py", 
+		raise_exception=True)
+	flow = OAuth2WebServerFlow(client_id, client_secret, oauth_scope, redirect_url)
+	return flow
+
+def create_erpnext_folder(service):
+	if not webnotes.conn:
+		webnotes.connect()
+	erpnext = {
+		'title': 'erpnext',
+		'mimeType': 'application/vnd.google-apps.folder'
+	}
+	erpnext = service.files().insert(body=erpnext).execute()
+	return erpnext['id']
+
+def create_folder(name, service, folder_id):
+	database = {
+		'title': name,
+		'mimeType': 'application/vnd.google-apps.folder',
+		'parents': [{
+	       	'kind': 'drive#fileLink',
+	       	'id': folder_id
+	    }]
+	}
+	database = service.files().insert(body=database).execute()
+	return database['id']
+
+if __name__=="__main__":
+	backup_to_gdrive()
\ No newline at end of file
diff --git a/setup/doctype/backup_manager/backup_manager.txt b/setup/doctype/backup_manager/backup_manager.txt
index bdb9c50..9a43f34 100644
--- a/setup/doctype/backup_manager/backup_manager.txt
+++ b/setup/doctype/backup_manager/backup_manager.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-03-15 11:06:59", 
   "docstatus": 0, 
-  "modified": "2013-03-15 16:10:05", 
+  "modified": "2013-03-15 17:27:33", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
