diff --git a/ibis/ibisclient.h b/ibis/ibisclient.h
--- a/ibis/ibisclient.h
+++ b/ibis/ibisclient.h
@@ -34,6 +34,7 @@
 
 #include <hasl.h>
 
+#include "ibisfeatures.h"
 #include "ibismessage.h"
 #include "ibisversion.h"
 
@@ -179,6 +180,20 @@
 GError *ibis_client_get_error(IbisClient *client);
 
 /**
+ * ibis_client_get_features:
+ * @client: The instance.
+ *
+ * Gets the [class@Ibis.Features] from @client.
+ *
+ * Returns: (transfer none): The features object if @client is connected,
+ *          otherwise %NULL.
+ *
+ * Since: 0.4
+ */
+IBIS_AVAILABLE_IN_0_4
+IbisFeatures *ibis_client_get_features(IbisClient *client);
+
+/**
  * ibis_client_get_hasl_context:
  * @client: The instance.
  *
# HG changeset patch
# Node ID 9d3b8d529493eb4c3f08d4bfcf3ef3c18ebed687
# Parent  b0d4265ddccfcf56d75a9ecbd89c5f2367325ada
diff --git a/ibis/ibisclient.c b/ibis/ibisclient.c
--- a/ibis/ibisclient.c
+++ b/ibis/ibisclient.c
@@ -36,6 +36,7 @@
 	PROP_CAPABILITIES,
 	PROP_CONNECTED,
 	PROP_ERROR,
+	PROP_FEATURES,
 	PROP_NICK,
 	PROP_REALNAME,
 	PROP_USERNAME,
@@ -59,6 +60,7 @@
 	IbisCapabilities *capabilities;
 	gboolean connected;
 	GError *error;
+	IbisFeatures *features;
 
 	GIOStream *stream;
 	GDataInputStream *input;
@@ -287,11 +289,20 @@
 }
 
 static gboolean
+ibis_client_handle_rpl_isupport(IbisClient *client, IbisMessage *message) {
+	ibis_features_parse(client->features, message);
+
+	return TRUE;
+}
+
+static gboolean
 ibis_client_default_message_handler(IbisClient *client, const char *command,
                                     IbisMessage *message)
 {
-	if(ibis_str_equal(command, "PING")) {
+	if(ibis_str_equal(command, IBIS_MSG_PING)) {
 		return ibis_client_handle_ping(client, message);
+	} else if(ibis_str_equal(command, IBIS_RPL_ISUPPORT)) {
+		return ibis_client_handle_rpl_isupport(client, message);
 	}
 
 	return FALSE;
@@ -313,6 +324,7 @@
 	g_clear_object(&client->cancellable);
 	g_clear_object(&client->capabilities);
 	g_clear_error(&client->error);
+	g_clear_object(&client->features);
 
 	g_clear_pointer(&client->alt_nick, g_free);
 	g_clear_pointer(&client->nick, g_free);
@@ -344,6 +356,9 @@
 	case PROP_ERROR:
 		g_value_set_boxed(value, ibis_client_get_error(client));
 		break;
+	case PROP_FEATURES:
+		g_value_set_object(value, ibis_client_get_features(client));
+		break;
 	case PROP_NICK:
 		g_value_set_string(value, ibis_client_get_nick(client));
 		break;
@@ -393,6 +408,7 @@
 static void
 ibis_client_init(IbisClient *client) {
 	client->capabilities = ibis_capabilities_new();
+	client->features = ibis_features_new();
 }
 
 static void
@@ -464,6 +480,20 @@
 		G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
 
 	/**
+	 * IbisClient:features:
+	 *
+	 * The [class@Features] for this connection.
+	 *
+	 * This property will be %NULL if the client is not currently connected.
+	 *
+	 * Since: 0.4
+	 */
+	properties[PROP_FEATURES] = g_param_spec_object(
+		"features", NULL, NULL,
+		IBIS_TYPE_FEATURES,
+		G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+	/**
 	 * IbisClient:nick:
 	 *
 	 * The primary nick to use.
@@ -693,6 +723,8 @@
 
 	ibis_client_set_connected(client, FALSE);
 
+	ibis_features_clear(client->features);
+
 	g_cancellable_cancel(client->cancellable);
 	g_clear_object(&client->cancellable);
 	g_clear_object(&client->input);
@@ -746,6 +778,13 @@
 	return client->error;
 }
 
+IbisFeatures *
+ibis_client_get_features(IbisClient *client) {
+	g_return_val_if_fail(IBIS_IS_CLIENT(client), NULL);
+
+	return client->features;
+}
+
 HaslContext *
 ibis_client_get_hasl_context(IbisClient *client) {
 	g_return_val_if_fail(IBIS_IS_CLIENT(client), NULL);
@@ -843,6 +882,9 @@
 		client->cancellable = g_cancellable_new();
 	}
 
+	/* Clear the features object. */
+	ibis_features_clear(client->features);
+
 	/* Clear any previous error. */
 	ibis_client_set_error(client, NULL);
 
diff --git a/ibis/ibisfeatures.h b/ibis/ibisfeatures.h
--- a/ibis/ibisfeatures.h
+++ b/ibis/ibisfeatures.h
@@ -56,7 +56,7 @@
  *
  * Since: 0.4
  */
-IBIS_AVAILABLE_IN_ALL
+IBIS_AVAILABLE_IN_0_4
 void ibis_features_clear(IbisFeatures *features);
 
 /**
diff --git a/ibis/tests/test_client.c b/ibis/tests/test_client.c
--- a/ibis/tests/test_client.c
+++ b/ibis/tests/test_client.c
@@ -27,6 +27,7 @@
 test_ibis_client_properties(void) {
 	IbisCapabilities *capabilities = NULL;
 	IbisClient *client = NULL;
+	IbisFeatures *features = NULL;
 	GCancellable *cancellable = NULL;
 	GError *error = NULL;
 	char *alt_nick = NULL;
@@ -50,6 +51,7 @@
 		"capabilities", &capabilities,
 		"connected", &connected,
 		"error", &error,
+		"features", &features,
 		"nick", &nick,
 		"realname", &realname,
 		"username", &username,
@@ -67,6 +69,9 @@
 
 	g_assert_no_error(error);
 
+	g_assert_true(IBIS_IS_FEATURES(features));
+	g_clear_object(&features);
+
 	g_assert_cmpstr(nick, ==, "nick");
 	g_clear_pointer(&nick, g_free);
 
