 		)
 
 	_loadTemplate: ->
-		@el = $(LRSView.templates[@template])
+		_el = document.createElement('div')
+		_el.innerHTML = LRSView.templates[@template]
+		@el = _el.firstChild
 
 	_createViews: ->
-		viewEls = @el.find('[data-view] ')
+		viewEls = @el.querySelectorAll('[data-view]')
 		@views = {}
-		#console.log @, viewEls
-		for view in viewEls
-			$view = $(view)
-			continue unless $view.attr('data-view')
-			info = $view.attr('data-view').split(':')
-			$view.removeAttr('data-view')
-			#console.log info[0] || info[1], viewEls, '1'
-			
-			if (info.length == 1)
+		for viewEl in viewEls
+			continue unless viewEl.hasAttribute('data-view')
+			info = viewEl.getAttribute('data-view').split(':')
+			viewEl.removeAttribute('data-view')
+			
+			if info.length is 1
 				name = info[0]
-				view = new lrs.LRSView($view, null,  @)
+				view = new lrs.LRSView(viewEl, null,  @)
 			else
 				name = info[1]
-				view = new lrs.LRSView.views[info[0]+'View']($view, {subTemplate: info[2]}, @)
+				view = new lrs.LRSView.views[info[0]+'View'](viewEl, {subTemplate: info[2]}, @)
 				
 			if name is 'view'
 				@view = view
-			else
-				if @views[name]
-					unless Array.isArray(@views[name])
-						@views[name] = [@views[name]]
-					@views[name].push(view)
-				else
-					@views[name] = view
+				
+			if @views[name]
+				unless Array.isArray(@views[name])
+					@views[name] = [@views[name]]
+				@views[name].push(view)
+			else
+				@views[name] = view
 
 	_createOutlets: ->
-		outletEls = @el.find('[data-outlet]')
-		if (@el.attr('data-outlet')) then outletEls.push(@el)
-
 		@outlets = {}
-
-		for outlet in outletEls
-			do (outlet) =>
-				$outlet = $(outlet)
-				#info = $outlet.attr('data-view').split(':')
-				#if (info.length == 1)
-				#	info.unshift('default')
-				#@outlets[info[1]] = {type: info[0], el: $outlet}
-				name = $outlet.attr('data-outlet')
-				$outlet.removeAttr('data-outlet')
-				type = (outlet.tagName || '').toLowerCase()
-				if type is 'input' or type is 'textarea'
-					$outlet.on 'change', () => @updateOutletFromDom(name)
-				@outlets[name] = {type: type, el: $outlet}
-
-				@updateOutletFromDom(name)
+		
+		outletEls = @el.querySelectorAll('[data-outlet]')
+		@_createOutlet(@el) if @el.hasAttribute('data-outlet')
+
+		for outletEl in outletEls
+			@_createOutlet(outletEl)
 
 		if (@customOutlets)
 			outlet.type = 'custom' for name, outlet of @customOutlets
-			_.extend(@outlets, @customOutlets)
+			_.extend(@outlets, @customOutlets) # TODO: Update
 
 		@outlets
+		
+	_createOutlet: (outletEl) ->
+		self = @
+		
+		name = outletEl.getAttribute('data-outlet')
+		outletEl.removeAttribute('data-outlet')
+		type = (outletEl.tagName || '').toLowerCase()
+		if type is 'input' or type is 'textarea'
+			outletEl.addEventListener('change', => self.updateOutletFromDom(name))
+		@outlets[name] =
+			type: type
+			el: outletEl
+		
+		@updateOutletFromDom(name)
 
 	_createActions: ->
-		els = @el.find('[data-action]')
-		if (@el.attr('data-action')) then els.push(@el)
-
+		@actions = {}
+		
+		actionEls = @el.querySelectorAll('[data-action]')
+		@_createAction(@el) if @el.hasAttribute('data-action')
+
+		for actionEl in actionEls
+			@_createAction(actionEl)
+
+		@actions
+		
+	_createAction: (actionEl) ->
 		self = @
-
-		@actions = {}
-
-		for el in els
-			$el = $(el)
-			actionStrings = $el.attr('data-action').split(';')
-			$el.removeAttr('data-action')
-			for string in actionStrings
-				action = string.match(LRSView.actionPattern)
-				action.shift()
-				action[2] = action[2].split(',')
-				action[2] = [] if action[2][0] == ''
-
-				if !lrs.LRSView.isTouch && (action[0] == 'tap' or action[0] == 'singleTap')
-					action[0] = 'click'
-
-				if (!@actions[action[0]])
-					@actions[action[0]] = []
-
-				$el.on(action[0], (e) -> self.delegateAction(e, @))
-
-				@actions[action[0]].push({el: $el, function: action[1], parameters: action[2]})
-
-		@actions
+		
+		actionStrings = actionEl.getAttribute('data-action').split(';')
+		actionEl.removeAttribute('data-action')
+		for string in actionStrings
+			action = string.match(LRSView.actionPattern) # TODO: Improve reliability; probably use regex.
+			action.shift()
+			action[2] = action[2].split(',')
+			action[2] = [] if action[2][0] == ''
+		
+			if !lrs.LRSView.isTouch && (action[0] == 'tap' or action[0] == 'singleTap')
+				action[0] = 'click'
+		
+			if (!@actions[action[0]])
+				@actions[action[0]] = []
+		
+			actionEl.addEventListener(action[0], (e) -> self.delegateAction(e, @))
+		
+			@actions[action[0]].push(
+				el: actionEl
+				function: action[1]
+				parameters: action[2]
+			)
 
 	delegateAction: (e, el = false) =>
 		return unless @enabled

					outlet.set(view.el, value)
			input:
				get: (outlet, view) ->
					if outlet.el.attr('type') is 'checkbox'
						outlet.el.prop('checked')
					else
						outlet.el.val()
				set: (outlet, view, value) ->
					if outlet.el.attr('type') is 'checkbox'
						outlet.el.prop('checked', value)
					else
						outlet.el.val(value)
			img:
				get: (outlet, view) ->
					outlet.el.attr('src')
				set: (outlet, view, value) ->
					outlet.el.attr('src', value)
			html:
				get: (outlet, view) ->
					outlet.el.html()
				set: (outlet, view, value) ->
					outlet.el.html(value)
		
		@outletTypes.default = @outletTypes.html
		@outletTypes.textarea = @outletTypes.input

	@views = {}

	@actionPattern = ///^(.*?):(.*?)\((.*?)\)///
	
	# ### `class` parseTemplates
	# Collect all templates from the document. Must be called once, before view initialisation.
	@parseTemplates: ->
		return if @templates
		
		# Define templates
		@templates = {}
