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

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