 		if word and (word of @words) then quads = @words[word] else quads = Object.keys @quads
 
 		#empty brain? nothing to say
-		return if quads.length is 0
+		return @defaultReply if quads.length is 0
 
-		quad = middleQuad = quads[@randomInt 0, quads.length-1]
+		#quads are generated differently depending on origin
+		quadHash = quads[@randomInt 0, quads.length-1]
+		quadHash = quadHash.tokens.join(',') if typeof quadHash isnt 'string'
+		quad = middleQuad = @quads[quadHash]
 
-		parts = quad.tokens
+		#shallow copy this guy, otherwise problems happen
+		parts = quad.tokens.slice 0
 
 		#while we don't have an end, generate a next token
-		while not quad?.canEnd
+		while not quad.canEnd
 			nextTokens = @next[quad.hash()]
 
 			#no tokens, no dice -- skip

		quad = middleQuad

		#while we don't have a beginning, generate a previous token
		while not quad?.canStart
			prevTokens = @prev[quad.hash()]
			break if not prevTokens
			prevToken = prevTokens[@randomInt 0, prevTokens.length-1]

			newQuad = new Quad [quad.tokens[0..@markov-1]..., prevToken]
			@addQuad newQuad
			quad = @quads[newQuad.hash()]
			parts.unshift prevToken

		partsLength = parts.length

		#split the tokens into quads of @markov length
		for i in [0...partsLength - (@markov - 1)] by 1

			quad = new Quad [ parts[i..i+3]... ]
			@addQuad quad

