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;
				
				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;
							}
						}
						
						// 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;
		}
	}