Index: protocols/oscar/oscaraccount.h
===================================================================
--- protocols/oscar/oscaraccount.h	(revision 740626)
+++ protocols/oscar/oscaraccount.h	(working copy)
@@ -92,6 +92,11 @@
 	QTextCodec* contactCodec( const QString& contactName ) const;
 
 	/**
+	 * Updates buddy icon
+	 */
+	void updateBuddyIcon( const QString &path );
+
+	/**
 	 * Add a contact to the server site list
 	 * \param contactName the screen name of the new contact to add
 	 * \param groupName the group of the new contact
@@ -190,6 +195,13 @@
 	/** Sends buddy icon to server */
 	void slotSendBuddyIcon();
 
+	/** Identity changed */
+	void slotIdentityChanged();
+	
+	/** Identity's property changed */
+	void slotIdentityPropertyChanged( Kopete::PropertyContainer *container, const QString &key,
+	                                  const QVariant &oldValue, const QVariant &newValue );
+
 private:
 	OscarAccountPrivate *d;
 
Index: protocols/oscar/oscaraccount.cpp
===================================================================
--- protocols/oscar/oscaraccount.cpp	(revision 740626)
+++ protocols/oscar/oscaraccount.cpp	(working copy)
@@ -145,6 +145,9 @@
 	                  this, SLOT( askIncoming( QString, QString, Oscar::DWORD, QString, QString ) ) );
 	QObject::connect( d->engine, SIGNAL( getTransferManager( Kopete::TransferManager ** ) ),
 	                  this, SLOT( getTransferManager( Kopete::TransferManager ** ) ) );
+
+	QObject::connect( this, SIGNAL(identityChanged()),
+	                  this, SLOT(slotIdentityChanged()) );
 }
 
 OscarAccount::~OscarAccount()
@@ -490,6 +493,40 @@
 	return contactCodec( contact );
 }
 
+void OscarAccount::updateBuddyIcon( const QString &path )
+{
+	if ( path.isEmpty() )
+	{
+		myself()->removeProperty( Kopete::Global::Properties::self()->photo() );
+	}
+	else
+	{
+		QImage image( path );
+		if ( image.isNull() )
+			return;
+		
+		const QSize size = ( d->engine->isIcq() ) ? QSize( 52, 64 ) : QSize( 48, 48 );
+		
+		image = image.scaled( size, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation );
+		if( image.width() > size.width())
+			image = image.copy( ( image.width() - size.width() ) / 2, 0, size.width(), image.height() );
+		
+		if( image.height() > size.height())
+			image = image.copy( 0, ( image.height() - size.height() ) / 2, image.width(), size.height() );
+		
+		QString newlocation( KStandardDirs::locateLocal( "appdata", "oscarpictures/" + accountId() + ".jpg" ) );
+		
+		kDebug(OSCAR_RAW_DEBUG) << "Saving buddy icon: " << newlocation;
+		if ( !image.save( newlocation, "JPEG" ) )
+			return;
+		
+		myself()->setProperty( Kopete::Global::Properties::self()->photo() , newlocation );
+	}
+	
+	d->buddyIconDirty = true;
+	updateBuddyIconInSSI();
+}
+
 bool OscarAccount::addContactToSSI( const QString& contactName, const QString& groupName, bool autoAddGroup )
 {
 	ContactManager* listManager = d->engine->ssiManager();
@@ -775,12 +812,11 @@
 	if ( !engine()->isActive() )
 		return;
 	
-	QString photoPath = identity()->property( Kopete::Global::Properties::self()->photo() ).value().toString();
-	
+	QString photoPath = myself()->property( Kopete::Global::Properties::self()->photo() ).value().toString();
+
 	ContactManager* ssi = engine()->ssiManager();
 	OContact item = ssi->findItemForIconByRef( 1 );
 	
-	// FIXME: we need to resize the photo before sending it
 	if ( photoPath.isEmpty() )
 	{
 		if ( item )
@@ -861,7 +897,7 @@
 {
 	//need to disconnect because we could end up with many connections
 	QObject::disconnect( engine(), SIGNAL( iconServerConnected() ), this, SLOT( slotSendBuddyIcon() ) );
-	QString photoPath = identity()->property( Kopete::Global::Properties::self()->photo() ).value().toString();
+	QString photoPath = myself()->property( Kopete::Global::Properties::self()->photo() ).value().toString();
 	if ( photoPath.isEmpty() )
 		return;
 	
@@ -884,6 +920,25 @@
 	}
 }
 
+void OscarAccount::slotIdentityChanged()
+{
+	QObject::connect( identity(), SIGNAL(propertyChanged(Kopete::PropertyContainer*, const QString&, const QVariant&, const QVariant&)),
+	                  this, SLOT(slotIdentityPropertyChanged(Kopete::PropertyContainer*, const QString&, const QVariant&, const QVariant&)) );
+
+	QString photoPath = identity()->property( Kopete::Global::Properties::self()->photo() ).value().toString();
+	updateBuddyIcon( photoPath );
+}
+
+void OscarAccount::slotIdentityPropertyChanged( Kopete::PropertyContainer*, const QString &key,
+                                                const QVariant&, const QVariant &newValue )
+{
+	kDebug(OSCAR_GEN_DEBUG) << "Identity property changed";
+	if ( key == Kopete::Global::Properties::self()->photo().key() )
+	{
+		updateBuddyIcon( newValue.toString() );
+	}
+}
+
 void OscarAccount::slotGoOffline()
 {
 }
Index: libkopete/kopeteaccount.cpp
===================================================================
--- libkopete/kopeteaccount.cpp	(revision 740626)
+++ libkopete/kopeteaccount.cpp	(working copy)
@@ -426,6 +426,8 @@
 	ident->addAccount( this );
 	d->identity = ident;
 	d->configGroup->writeEntry("Identity", ident->id());
+
+	emit identityChanged();
 }
 
 Contact * Account::myself() const
Index: libkopete/kopeteaccount.h
===================================================================
--- libkopete/kopeteaccount.h	(revision 740626)
+++ libkopete/kopeteaccount.h	(working copy)
@@ -454,6 +454,11 @@
 	 */
 	void isConnectedChanged();
 
+	/**
+	 * Emitted whenever new identity is assigned to this @p account.
+	 */
+	void identityChanged();
+	
 private:
 	/**
 	 * @internal
