public boolean start() {
        synchronized (optOutLock) {
            // Did we opt out?
            if (isOptOut()) {
                return false;
            }

            // Is metrics already running?
            if (taskId >= 0) {
                return true;
            }

            // Begin hitting the server with glorious data
            taskId = plugin.getServer().getScheduler()
                    .scheduleAsyncRepeatingTask(plugin, new Runnable() {

                        private boolean firstPost = true;

                        @Override
                        public void run() {
                            try {
                                // This has to be synchronized or it can collide
                                // with the disable method.
                                synchronized (optOutLock) {
                                    // Disable Task, if it is running and the
                                    // server owner decided to opt-out
                                    if (isOptOut() && taskId > 0) {
                                        plugin.getServer().getScheduler()
                                                .cancelTask(taskId);
                                        taskId = -1;
                                        // Tell all plotters to stop gathering
                                        // information.
                                        for (Graph graph : graphs) {
                                            graph.onOptOut();
                                        }
                                    }
                                }

                                // We use the inverse of firstPost because if it
                                // is the first time we are posting,
                                // it is not a interval ping, so it evaluates to
                                // FALSE
                                // Each time thereafter it will evaluate to
                                // TRUE, i.e PING!
                                postPlugin(!firstPost);

                                // After the first post we set firstPost to
                                // false
                                // Each post thereafter will be a ping
                                firstPost = false;
                            } catch (IOException e) {
                                Bukkit.getLogger().log(Level.INFO,
                                        "[Metrics] " + e.getMessage());
                            }
                        }
                    }, 0, PING_INTERVAL * 1200);

            return true;
        }
    }