public synchronized boolean removeSubscription(String clientSessionToken, Long subscriptionId) {
		if (clientSessionToken == null || clientSessionToken.isEmpty())
			return false;
		if (subscriptionId == null)
			return false;

		// Clients subscriptions
		Map<Long, Subscription> clientSubscriptions = retrieveSubscriptionsByToken(clientSessionToken);
		if (clientSubscriptions == null) {
			return false;
		}

		Subscription removedSubscription = clientSubscriptions.remove(subscriptionId);

		// If this client has no more subscriptions, remove his subscription Map to free memory
		if (clientSubscriptions.isEmpty()) {
			clientsSubscriptions.remove(clientSessionToken);
		}

		if (removedSubscription != null) {
			// Topics subscriptions
			Set<Subscription> topicSubscriptions = retrieveSubscriptionsByTopic(removedSubscription.getTopic());
			if (topicSubscriptions != null) {
				topicSubscriptions.remove(removedSubscription);

				// If this topic has no more subscriptions, remove his subscription Set to free memory
				if (topicSubscriptions.isEmpty()) {
					topicsSubscriptions.remove(removedSubscription.getTopic());
				}
			}
		}

		return true;
	}