function Save($id, $data = null) {
		if (!$id)
			return;

		$this->LoadSchema();

		if (is_array($id)) {
			$data = $id;
			if (!isset($data[$this->schema['_id']['field']])) // Incomming data has no ID to address by
				return;
			$id = $data[$this->schema['_id']['field']];
		} else {
			$data[$this->schema['_id']['field']] = $id;
		}

		if (!$data)
			return;

		if ($this->enforceTypes)
			foreach ($this->schema as $key => $props)
				if (isset($data[$key]) || $props['type'] == 'json-import')
					$data[$key] = $this->UnCastType($props['type'], isset($data[$key]) ? $data[$key] : null, $data);

		$this->ResetQuery(array(
			'method' => 'save',
			'table' => $this->table,
			'where' => array(
				$this->schema['_id']['field'] => $id,
			),
			'data' => $data,
		));

		$this->Trigger('access', $data);
		if (!$this->continue)
			return FALSE;

		$this->Trigger('push', $data);
		if (!$this->continue)
			return FALSE;

		unset($data[$this->schema['_id']['field']]); // Remove ID from saving data (it will only be removed during filtering anyway as PKs can never be saved)

		$this->trigger('save', $id, $data);
		if (!$this->continue)
			return FALSE;

		if (! $data = $this->FilterFields($data, 'set')) // Nothing to save
			return FALSE;
		if (!$this->continue)
			return FALSE;

		$this->db->where("{$this->table}.{$this->schema['_id']['field']}", $id);
		$this->db->update($this->table, $data);

		$this->Trigger('saved', $id, $save);
		$this->ClearCache('get', $id); // Wipe the cache so the next get() doesn't return cached data

		return $this->returnRow ? $this->Get($id) : $save;
	}