def commit(self):
		with open(os.path.join(self.config['IMAGE_HOME'], "gui", "lib", "Frontend", "conf", "unveillance.secrets.json"), 'rb') as u:
			frontend_config = json.loads(u.read())
		
		# add remaining frontend templates
		# write .git_as.sh and .ssh_as.sh
		ssh_cmd = ['exec ssh -i %(ssh_key_priv)s -o PubkeyAuthentication=yes -o IdentitiesOnly=yes "[email protected]"' % frontend_config]
		git_cmd = ['GIT_SSH=%s/.ssh_as.sh exec git "[email protected]"' % self.config['IMAGE_HOME']]

		for c in [("git_as", git_cmd), ("ssh_as", ssh_cmd)]:
			with open(os.path.join(self.config['IMAGE_HOME'], ".%s.sh" % c[0]), 'wb+') as g:
				g.write("#! /bin/bash")
				g.write("\n")
				g.write("\n".join(c[1]))

		# say hello to annex
		# git remote add docker image
		routine = [
			"chmod +x %(IMAGE_HOME)s/.git_as.sh %(IMAGE_HOME)s/.ssh_as.sh" % self.config,
			"sleep 5",
			"ssh -f -p %(annex_remote_port)d -o IdentitiesOnly=yes -o PubkeyAuthentication=yes -i %(ssh_key_priv)s %(server_user)[email protected]%(server_host)s 'echo \"\"'" % frontend_config,
			"cd %(IMAGE_HOME)s/annex" % self.config,
			"git config alias.unveillance \\!\"%(IMAGE_HOME)s/.git_as.sh\"" % self.config,
			"git remote add origin ssh://%(server_user)[email protected]%(server_host)s:%(annex_remote_port)d/~/unveillance" % frontend_config
		]

		return build_routine(routine, dst=self.config['IMAGE_HOME'])
	def attach(self):
		with open(os.path.join(self.config['IMAGE_HOME'], "gui", "lib", "Frontend", "conf", "unveillance.secrets.json"), 'rb') as u:
			frontend_config = json.loads(u.read())

		routine = [
			"ssh -p %(annex_remote_port)d -o IdentitiesOnly=yes -o PubkeyAuthentication=yes -i %(ssh_key_priv)s %(server_user)[email protected]%(server_host)s" % frontend_config
		]

		return build_routine(routine, dst=self.config['IMAGE_HOME'])
	def update(self):
		with open(os.path.join(self.config['IMAGE_HOME'], "gui", "lib", "Frontend", "conf", "unveillance.secrets.json"), 'rb') as u:
			frontend_config = json.loads(u.read())

		routine = [
			"ssh -f -p %(annex_remote_port)d -o IdentitiesOnly=yes -o PubkeyAuthentication=yes -i %(ssh_key_priv)s %(server_user)[email protected]%(server_host)s 'source ~/.bash_profile && cd ~/unveillance && git reset --hard HEAD && ./unveillance.sh update'" % frontend_config
		]

		return build_routine(routine, dst=self.config['IMAGE_HOME'])
	def stop(self):
		with open(os.path.join(self.config['IMAGE_HOME'], "gui", "lib", "Frontend", "conf", "unveillance.secrets.json"), 'rb') as u:
			frontend_config = json.loads(u.read())

		routine = [
			"ssh -f -p %(annex_remote_port)d -o IdentitiesOnly=yes -o PubkeyAuthentication=yes -i %(ssh_key_priv)s %(server_user)[email protected]%(server_host)s 'source ~/.bash_profile && cd ~/unveillance/lib/Annex && ./shutdown.sh'&" % frontend_config,
			"sleep 3",
			"%(DOCKER_EXE)s stop %(PROJECT_NAME)s" % self.config
		]

		return build_routine(routine, dst=self.config['IMAGE_HOME'])
	def remove(self):
		with open(os.path.join(self.config['IMAGE_HOME'], "gui", "lib", "Frontend", "conf", "unveillance.secrets.json"), 'rb') as u:
			frontend_config = json.loads(u.read())

		routine = [
			"rm %(ssh_key_priv)s %(ssh_key_priv)s.pub" % frontend_config,
			"%(DOCKER_EXE)s stop %(PROJECT_NAME)s",
			"%(DOCKER_EXE)s rm %(PROJECT_NAME)s",
			"%(DOCKER_EXE)s rmi %(IMAGE_NAME)s:%(PROJECT_NAME)s",
			"cd ../",
			"rm -rf %(IMAGE_HOME)s"
		]

		return build_routine([r % self.config for r in routine], dst=self.config['IMAGE_HOME'])
	def model(self, *args):
		new_model = self.__parse_asset(args[0]) if type(args) is list else {}
		new_model['root'] = os.path.join(self.config['IMAGE_HOME'], "annex", "Models")

		if "name" not in new_model.keys():
			new_model['name'] = prompt("New model name: ")

		if not self.__tr(new_model['name']):
			return False

		new_model['path'] = os.path.join(new_model['root'], "%s.py" % new_model['name'])

		routine = [
			"sed 's/NAME_OF_MODEL/%(name)s/g' $UNVEILLANCE_BUILD_HOME/tmpl/annex.model.py > %(path)s"
		]

		return build_routine([r % new_model for r in routine], dst=self.config['IMAGE_HOME'])
	def task(self, *args):
		new_task = self.__parse_asset(args[0]) if type(args) is list else {}
		new_task['root'] = os.path.join(self.config['IMAGE_HOME'], "annex", "Tasks")

		if "name" not in new_task.keys():
			new_task['name'] = prompt("New task name: ")
		
		if not self.__tr(new_task['name']):
			return False
		
		if "dir" not in new_task.keys():
			print "Which group should this task belong to? "
			for _, d, _ in os.walk(new_task['root']):
				if len(d) > 0:
					print "Choose one from these groups:"
					print ", ".join(d)
					print "or create a new one here."
				else:
					print "No groups yet! Create one here."

				break
			
			new_task['dir'] = prompt("Task group: ")

		if not self.__tr(new_task['dir']):
			return False

		new_task['dir'] = new_task['dir'].capitalize()
		
		with open(os.path.join(self.config['IMAGE_HOME'], "annex", "vars.json"), 'rb') as M:
			annex_vars = json.loads(M.read())

		if "apply" not in new_task.keys():
			new_task['apply'] = False

			if prompt("Apply mime-type to this task? Y|n: ") not in ["n", "N"]:
				new_task['apply'] = "mime_type"
			else:
				if prompt("Run task at project start? Y|n: ") not in ["n", "N"]:
					new_task['apply'] = "init"

		if new_task['apply'] == "mime_type":
			for m in ["MIME_TYPES", "MIME_TYPE_MAP", "MIME_TYPE_TASKS"]:
				if m not in annex_vars.keys():
					annex_vars[m] = {}

			if "mime_type" not in new_task.keys():
				if len(annex_vars['MIME_TYPES'].keys()) > 0:
					print "Choose from one of these mime types"
					print ", ".join(annex_vars['MIME_TYPES'].keys())
					print "or create a new one here."
				else:
					print "No mime types yes! Create on here."

				new_task['mime_type'] = prompt("Mime type: ")
			
			if not self.__tr(new_task['mime_type']):
				return False

			if new_task['mime_type'] not in annex_vars['MIME_TYPES'].keys():
				if "short_code" not in new_task.keys():
					new_task['short_code'] = prompt("Short code for new mime type %s (i.e. \"my_json\"): " \
						% new_task['mime_type'])

				if not self.__tr(new_task['short_code']):
					return False

				annex_vars['MIME_TYPES'].update({ new_task['mime_type'] : new_task['short_code'] })
				annex_vars['MIME_TYPE_MAP'].update({ new_task['short_code'] : new_task['mime_type'] })

			if new_task['mime_type'] not in annex_vars['MIME_TYPE_TASKS'].keys():
				annex_vars['MIME_TYPE_TASKS'][new_task['mime_type']] = []

			annex_vars['MIME_TYPE_TASKS'][new_task['mime_type']].append("%(dir)s.%(name)s.%(name)s" % new_task)

		elif new_task['apply'] == "init":
				if "INITIAL_TASKS" not in annex_vars.keys():
					annex_vars['INITIAL_TASKS'] = []

				annex_vars['INITIAL_TASKS'].append("%(dir)s.%(name)s.%(name)s" % new_task)		

		if "TASK_POOL" not in annex_vars.keys():
			annex_vars['TASK_POOL'] = []

		annex_vars['TASK_POOL'].append("%(dir)s.%(name)s.%(name)s" % new_task)

		new_task['dir'] = os.path.join(new_task['root'], new_task['dir'])
		new_task['path'] = os.path.join(new_task['dir'], "%s.py" % new_task['name'])

		with open(os.path.join(self.config['IMAGE_HOME'], "annex", "vars.json"), 'wb+') as M:
			M.write(json.dumps(annex_vars, indent=4))

		routine = [
			"mkdir -p %(dir)s" ,
			"if [ ! -f %(dir)s/__init__.py ]; then touch %(dir)s/__init__.py; fi",
			"sed 's/NAME_OF_TASK/%(name)s/g' $UNVEILLANCE_BUILD_HOME/tmpl/annex.task.py > %(path)s"
		]

		return build_routine([r % new_task for r in routine], dst=self.config['IMAGE_HOME'])