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

			// Is metrics already running?
			if (task != null) {
				return true;
			}

			// Begin hitting the server with glorious data
			task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(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() && task != null) {
								task.cancel();
								task = null;
								// 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) {
						if (debug) {
							Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage());
						}
					}
				}
			}, 0, PING_INTERVAL * 1200);

			return true;
		}
	}