def extendProtocol(lexicalFactory, syntaxFactory):
	# j == join
	# p == part
	# l == lookup
	# a == lookup answer
	regex = "group:(({0})|({1})|({2})|({3}))".format(
			"(j|l|p):{0}".format(GroupNameRegex),
			"a:{0}(:{1}(,[1-9][0-9]?)+)+".format(GroupNameRegex, IPHostRegex),
			"msg:{0}:[0-9]+:(s|a):.+".format(GroupNameRegex),
			"e:.*"
	)

	if ExtensionLoader().isActive("BasicOverlay"):
		BProtocol = ExtensionLoader().getExtension("BasicOverlay")
		BProtocol.addBootstrapFunction(joinGroups)

		establishedState = lexicalFactory.getState('established')
		establishedState.addTransition('established', regex,
										lambda t: t.split(':'))

		startState = lexicalFactory.getState('start')
		startState.addTransition('start', regex, lambda t: t.split(':'))

		syntaxFactory.addToken('group', groupTokenParser)
		overlayAHF(removeFromGroups, True)

		for g in CommandLineParser().getArguments().groupsToJoin:
			groups[g] = Group(g, True, None,
								CommandLineParser().getArguments().PeerName)

		return True

	return False