def startInitialContact(self):
        # If all the conditions are right, start connection procedure

        CHECK(not (self.icm or self.osm))

        dcall_discard(self, 'reconnect_dcall')

        def cb(result):
            self.icm = None
            result, node_ipps = result

            if result == 'good':
                self.startNodeSync(node_ipps)

            elif result == 'banned_ip':
                self.showLoginStatus(
                    "Your IP seems to be banned from this network.")
                self.shutdown(reconnect='max')

            elif result == 'foreign_ip':
                try:
                    my_ip = self.selectMyIP(allow_bad=True).getTextIP()
                except ValueError:
                    my_ip = "?"

                self.showLoginStatus(
                    "Your IP address (%s) is not authorized to use "
                    "this network." % my_ip)
                self.shutdown(reconnect='max')

            elif result == 'dead_port':
                self.needPortForward()

            elif result == 'no_nodes':
                self.showLoginStatus(
                    "No online nodes found.")
                self.shutdown(reconnect='normal')

                # If we receive an IQ packet after finding no nodes, then
                # assume we're a root node and form an empty network
                if not self.hide_node:
                    self.accept_IQ_trigger = True

            else:
                # Impossible result
                CHECK(False)

        self.ph.remap_ip = None
        self.icm = InitialContactManager(self)
        self.icm.start().addCallback(cb)