diff --git a/src/GetNewStuffModel.cpp b/src/GetNewStuffModel.cpp
index 04a30e77f..2cc6a3ca9 100644
--- a/src/GetNewStuffModel.cpp
+++ b/src/GetNewStuffModel.cpp
@@ -113,11 +113,10 @@ GetNewStuffModel::setData( const QModelIndex &index, const QVariant &value, int
         return false;
 
 
+    Attica::Content resolver = m_contentList[ index.row() ];
+    AtticaManager::ResolverState state = AtticaManager::instance()->resolverState( resolver );
     if ( role == Qt::EditRole )
     {
-        Attica::Content resolver = m_contentList[ index.row() ];
-        AtticaManager::ResolverState state = AtticaManager::instance()->resolverState( resolver );
-
         switch( state )
         {
             case AtticaManager::Uninstalled:
@@ -141,6 +140,11 @@ GetNewStuffModel::setData( const QModelIndex &index, const QVariant &value, int
         };
     } else if ( role == RatingRole )
     {
+        // For now only allow rating if a resolver is installed!
+        if ( state != AtticaManager::Installed && state != AtticaManager::NeedsUpgrade )
+            return false;
+        if ( AtticaManager::userHasRated( resolver ) )
+            return false;
         m_contentList[ index.row() ].setRating( value.toInt() * 20 );
         AtticaManager::instance()->uploadRating( m_contentList[ index.row() ] );
     }
diff --git a/src/libtomahawk/AtticaManager.cpp b/src/libtomahawk/AtticaManager.cpp
index 5f004ce8b..27275532c 100644
--- a/src/libtomahawk/AtticaManager.cpp
+++ b/src/libtomahawk/AtticaManager.cpp
@@ -151,7 +151,20 @@ AtticaManager::pathFromId( const QString& resolverId ) const
 void
 AtticaManager::uploadRating( const Content& c )
 {
-    m_resolverStates[ c.id() ].rating = c.rating();
+    m_resolverStates[ c.id() ].userRating = c.rating();
+
+    for ( int i = 0; i < m_resolvers.count(); i++ )
+    {
+        if ( m_resolvers[ i ].id() == c.id() )
+        {
+            Attica::Content atticaContent = m_resolvers[ i ];
+            atticaContent.setRating( c.rating() );
+            m_resolvers[ i ] = atticaContent;
+            break;
+        }
+    }
+
+    TomahawkSettings::instance()->setAtticaResolverStates( m_resolverStates );
 
     PostJob* job = m_resolverProvider.voteForContent( c.id(), (uint)c.rating() );
     connect( job, SIGNAL( finished( Attica::BaseJob* ) ), job, SLOT( deleteLater() ) );
@@ -161,6 +174,12 @@ AtticaManager::uploadRating( const Content& c )
     emit resolverStateChanged( c.id() );
 }
 
+bool
+AtticaManager::userHasRated( const Content& c ) const
+{
+    return m_resolverStates[ c.id() ].userRating != -1;
+}
+
 
 void
 AtticaManager::providerAdded( const Provider& provider )
@@ -231,14 +250,20 @@ AtticaManager::syncServerData()
     foreach ( const QString& id, m_resolverStates.keys() )
     {
         Resolver r = m_resolverStates[ id ];
-        foreach ( const Content& upstream, m_resolvers )
+        for ( int i = 0; i < m_resolvers.size(); i++ )
         {
+            Attica::Content upstream = m_resolvers[ i ];
             // same resolver
             if ( id != upstream.id() )
                 continue;
 
-            // Update our rating with the server's idea of rating
-            m_resolverStates[ id ].rating = upstream.rating();
+            // Update our rating with the server's idea of rating if we haven't rated it
+            if ( m_resolverStates[ id ].userRating != -1 )
+            {
+                upstream.setRating( m_resolverStates[ id ].userRating );
+                m_resolvers[ i ] = upstream;
+            }
+
             // DO we need to upgrade?
             if ( ( r.state == Installed || r.state == NeedsUpgrade ) &&
                  !upstream.version().isEmpty() )
diff --git a/src/libtomahawk/AtticaManager.h b/src/libtomahawk/AtticaManager.h
index ce2f6af27..4708c2bee 100644
--- a/src/libtomahawk/AtticaManager.h
+++ b/src/libtomahawk/AtticaManager.h
@@ -48,13 +48,13 @@ public:
 
     struct Resolver {
         QString version, scriptPath;
-        int rating; // 0-100
+        int userRating; // 0-100
         ResolverState state;
         QPixmap* pixmap;
 
-        Resolver( const QString& v, const QString& path, int r, ResolverState s )
-            : version( v ), scriptPath( path ), rating( r ), state( s ), pixmap( 0 ) {}
-        Resolver() : state( Uninstalled ), pixmap( 0 ) {}
+        Resolver( const QString& v, const QString& path, int userR, ResolverState s )
+            : version( v ), scriptPath( path ), userRating( userR ), state( s ), pixmap( 0 ) {}
+        Resolver() : userRating( -1 ), state( Uninstalled ), pixmap( 0 ) {}
     };
 
     typedef QHash< QString, AtticaManager::Resolver > StateHash;
@@ -90,6 +90,7 @@ public:
     QString pathFromId( const QString& resolverId ) const;
 
     void uploadRating( const Attica::Content& c );
+    bool userHasRated( const Attica::Content& c ) const;
 
     static bool removeDirectory( const QString& dir );
 
diff --git a/src/libtomahawk/tomahawksettings.cpp b/src/libtomahawk/tomahawksettings.cpp
index bca889326..155457ba5 100644
--- a/src/libtomahawk/tomahawksettings.cpp
+++ b/src/libtomahawk/tomahawksettings.cpp
@@ -45,7 +45,7 @@ inline QDataStream& operator<<(QDataStream& out, const AtticaManager::StateHash&
     foreach( const QString& key, states.keys() )
     {
         AtticaManager::Resolver resolver = states[ key ];
-        out << key << resolver.version << resolver.scriptPath << (qint32)resolver.state << (quint32)resolver.rating;
+        out << key << resolver.version << resolver.scriptPath << (qint32)resolver.state << resolver.userRating;
     }
     return out;
 }
@@ -59,13 +59,13 @@ inline QDataStream& operator>>(QDataStream& in, AtticaManager::StateHash& states
     for ( uint i = 0; i < count; i++ )
     {
         QString key, version, scriptPath;
-        qint32 state, rating;
+        qint32 state, userRating;
         in >> key;
         in >> version;
         in >> scriptPath;
         in >> state;
-        in >> rating;
-        states[ key ] = AtticaManager::Resolver( version, scriptPath, rating, (AtticaManager::ResolverState)state );
+        in >> userRating;
+        states[ key ] = AtticaManager::Resolver( version, scriptPath, userRating, (AtticaManager::ResolverState)state );
     }
     return in;
 }
@@ -183,7 +183,7 @@ TomahawkSettings::doUpgrade( int oldVersion, int newVersion )
         addSipPlugin( "sipzeroconf_legacy" );
     } else if ( oldVersion == 3 )
     {
-        if ( contains( "script/atticaResolverStates" ) )
+        if ( contains( "script/atticaresolverstates" ) )
         {
             // Do messy binary upgrade. remove attica resolvers :(
             setValue( "script/atticaresolverstates", QVariant() );