diff --git include/libgadu.h.in include/libgadu.h.in
index 910c5b0..a9dcc8e 100644
--- include/libgadu.h.in
+++ include/libgadu.h.in
@@ -247,6 +247,8 @@ struct gg_session {
 
 	int protocol_version;	/**< Wersja protokołu (bez flag) */
 	char *client_version;	/**< Wersja klienta */
+	char *client_name;		/**< Pełna nazwa klienta */
+	char *client_lang;		/**< Język klienta */
 	int last_sysmsg;	/**< Numer ostatniej wiadomości systemowej */
 
 	char *initial_descr;	/**< Początkowy opis statusu */
@@ -566,6 +568,8 @@ enum gg_check_t {
 	GG_CHECK_READ = 2		/**< Sprawdź możliwość odczytu */
 };
 
+#define GG_LOGIN_PARAMS_ABI 1
+
 /**
  * Parametry połączenia z serwerem Gadu-Gadu. Parametry zostały przeniesione
  * do struktury, by uniknąć zmian API po rozszerzeniu protokołu i dodaniu
@@ -586,8 +590,8 @@ struct gg_login_params {
 	uint32_t client_addr;		/**< Adres połączeń bezpośrednich (nieaktualne) */
 	uint16_t client_port;		/**< Port połączeń bezpośrednich (nieaktualne) */
 #endif
-	int protocol_version;		/**< Wersja protokołu wysyłana do serwera (domyślnie najnowsza obsługiwana) */
-	char *client_version;		/**< Wersja klienta wysyłana do serwera (domyślnie najnowsza znana) */
+	int protocol_version;		/**< Wykorzystywana wersja protokołu (domyślnie najnowsza obsługiwana) */
+	char *client_version;		/**< Wersja klienta wysyłana do serwera hub (domyślnie najnowsza znana) */
 	int has_audio;			/**< Flaga obsługi połączeń głosowych */
 	int last_sysmsg;		/**< Numer ostatnio odebranej wiadomości systemowej */
 	uint32_t external_addr;		/**< Adres publiczny dla połączeń bezpośrednich (6.x) */
@@ -604,13 +608,9 @@ struct gg_login_params {
 	gg_resolver_t resolver;		/**< Sposób rozwiązywania nazw (patrz \ref build-resolver) */
 	int protocol_features;		/**< Opcje protokołu (flagi GG_FEATURE_*). */
 	int status_flags;		/**< Flagi statusu (flagi GG_STATUS_FLAG_*, patrz \ref status). */
-
-#ifndef DOXYGEN
-	char dummy[1 * sizeof(int)];	/**< \internal Miejsce na kilka kolejnych
-					  parametrów, żeby wraz z dodawaniem kolejnych
-					  parametrów nie zmieniał się rozmiar struktury */
-#endif
-
+	int version;			/**< GG_LOGIN_PARAMS_ABI */	/* XXX, Windows-like, sizeof(struct gg_login_params)? */
+	char *client_name;		/**< Nazwa klienta wysyłana podczas logowania na serwer (domyślnie Gadu-Gadu Client Build w najnowszej znanej wersji) */
+	char *client_lang;		/**< Język klienta wysyłany podczas logowania na serwer (domyślnie: pl) */
 };
 
 struct gg_session *gg_login(const struct gg_login_params *p);
diff --git src/handlers.c src/handlers.c
index a305cb5..c3e8f45 100644
--- src/handlers.c
+++ src/handlers.c
@@ -160,13 +160,12 @@ static int gg_session_handle_welcome(struct gg_session *gs, uint32_t type, const
 
 	if (GG_SESSION_IS_PROTOCOL_8_0(gs)) {
 		struct gg_login80 l80;
-		const char *version, *descr;
+		const char *name, *version, *descr;
 		uint32_t version_len, descr_len;
 
 		memset(&l80, 0, sizeof(l80));
 		gg_debug_session(gs, GG_DEBUG_MISC, "// gg_watch_fd() sending GG_LOGIN80 packet\n");
 		l80.uin = gg_fix32(gs->uin);
-		memcpy(l80.language, GG8_LANG, sizeof(l80.language));
 		l80.hash_type = gs->hash_type;
 		memcpy(l80.hash, hash_buf, sizeof(l80.hash));
 		l80.status = gg_fix32(gs->initial_status ? gs->initial_status : GG_STATUS_AVAIL);
@@ -175,8 +174,20 @@ static int gg_session_handle_welcome(struct gg_session *gs, uint32_t type, const
 		l80.image_size = gs->image_size;
 		l80.dunno2 = 0x64;
 
-		version = (gs->client_version != NULL) ? gs->client_version : GG_DEFAULT_CLIENT_VERSION;
-		version_len = gg_fix32(strlen(GG8_VERSION) + strlen(version));
+		if (gs->client_lang != NULL)
+			memcpy(l80.language, gs->client_lang, sizeof(l80.language));
+		else
+			memcpy(l80.language, GG8_LANG, sizeof(l80.language));
+
+		if (gs->client_name != NULL) {
+			name = gs->client_name;
+			version = "";
+		} else {
+			name = GG8_VERSION;
+			version = GG_DEFAULT_CLIENT_VERSION;
+		}
+
+		version_len = gg_fix32(strlen(name) + strlen(version));
 
 		descr = (gs->initial_descr != NULL) ? gs->initial_descr : "";
 		descr_len = (gs->initial_descr != NULL) ? gg_fix32(strlen(gs->initial_descr)) : 0;
diff --git src/libgadu.c src/libgadu.c
index 0dafb39..8cada41 100644
--- src/libgadu.c
+++ src/libgadu.c
@@ -813,6 +813,12 @@ struct gg_session *gg_login(const struct gg_login_params *p)
 	sess->pid = -1;
 	sess->encoding = p->encoding;
 
+	if (p->version >= 1 && p->client_name != NULL)
+		sess->client_name = strdup(p->client_name);
+
+	if (p->version >= 1 && p->client_lang != NULL && strlen(p->client_lang) == 2)	/* XXX sprytniej? */
+		sess->client_lang = strdup(p->client_lang);
+
 	if (gg_session_set_resolver(sess, p->resolver) == -1) {
 		gg_debug(GG_DEBUG_MISC, "// gg_login() invalid arguments. unsupported resolver type (%d)\n", p->resolver);
 		errno = EFAULT;
@@ -1129,6 +1135,8 @@ void gg_free_session(struct gg_session *sess)
 	free(sess->password);
 	free(sess->initial_descr);
 	free(sess->client_version);
+	free(sess->client_name);
+	free(sess->client_lang);
 	free(sess->header_buf);
 
 #ifdef GG_CONFIG_HAVE_OPENSSL
