diff --git a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/AbstractDialog.java b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/AbstractDialog.java
index 8e8c18e..6c71027 100644
--- a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/AbstractDialog.java
+++ b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/AbstractDialog.java
@@ -10,24 +10,67 @@
  */
 package org.eclipse.userstorage.ui;
 
-import org.eclipse.userstorage.IStorageService;
+import org.eclipse.userstorage.internal.util.StringUtil;
 import org.eclipse.userstorage.ui.internal.Activator;
 
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.dialogs.TitleAreaDialog;
 import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.FontData;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import java.lang.reflect.Field;
 
 /**
  * @author Eike Stepper
  */
 public abstract class AbstractDialog extends TitleAreaDialog
 {
+  private static final String DIALOG_WIDTH = getDialogConstant("DIALOG_WIDTH", "DIALOG_WIDTH");
+
+  private static final String DIALOG_HEIGHT = getDialogConstant("DIALOG_HEIGHT", "DIALOG_HEIGHT");
+
+  private static final String DIALOG_FONT_DATA = getDialogConstant("DIALOG_FONT_DATA", "DIALOG_FONT_NAME");
+
+  private static final String DIALOG_MESSAGE = "DIALOG_MESSAGE";
+
+  private static final int WIDTH_MIN = 350;
+
+  private static final int WIDTH_MAX = 5000;
+
+  private static final int WIDTH_INC1 = 250;
+
+  private static final int WIDTH_INC2 = WIDTH_INC1 / 10;
+
+  private static final Field messageLabelField;
+
+  static
+  {
+    Field field = null;
+
+    try
+    {
+      field = TitleAreaDialog.class.getDeclaredField("messageLabel");
+      field.setAccessible(true);
+    }
+    catch (Throwable ex)
+    {
+      field = null;
+    }
+
+    messageLabelField = field;
+  }
+
   public AbstractDialog(Shell parentShell)
   {
     super(parentShell);
@@ -35,6 +78,168 @@
   }
 
   @Override
+  public boolean close()
+  {
+    Shell shell = getShell();
+    if (shell != null && !shell.isDisposed())
+    {
+      IDialogSettings settings = getDialogBoundsSettings();
+      if (settings != null)
+      {
+        String message = getMessage();
+
+        int strategy = getDialogBoundsStrategy();
+        if ((strategy & DIALOG_PERSISTSIZE) != 0)
+        {
+          settings.put(DIALOG_MESSAGE, message);
+        }
+      }
+    }
+
+    return super.close();
+  }
+
+  protected IDialogSettings getPluginSettings()
+  {
+    return null;
+  }
+
+  protected String getDialogSettingsName()
+  {
+    return getClass().getSimpleName();
+  }
+
+  @Override
+  protected IDialogSettings getDialogBoundsSettings()
+  {
+    IDialogSettings settings = getPluginSettings();
+    if (settings == null)
+    {
+      return null;
+    }
+
+    String sectionName = getDialogSettingsName();
+    if (sectionName == null)
+    {
+      return null;
+    }
+
+    IDialogSettings section = settings.getSection(sectionName);
+    if (section == null)
+    {
+      section = settings.addNewSection(sectionName);
+    }
+
+    return section;
+  }
+
+  @Override
+  protected int getDialogBoundsStrategy()
+  {
+    return DIALOG_PERSISTSIZE;
+  }
+
+  @Override
+  protected Point getInitialSize()
+  {
+    Shell shell = getShell();
+    Point result = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+
+    Point minimum = getMinimumSize();
+    result.x = Math.max(result.x, minimum.x);
+    result.y = Math.max(result.y, minimum.y);
+
+    if ((getDialogBoundsStrategy() & DIALOG_PERSISTSIZE) != 0)
+    {
+      IDialogSettings settings = getDialogBoundsSettings();
+      if (settings != null)
+      {
+        if (hasSameFont(settings) && hasSameMessage(settings))
+        {
+          try
+          {
+            int width = settings.getInt(DIALOG_WIDTH);
+            if (width != DIALOG_DEFAULT_BOUNDS)
+            {
+              result.x = width;
+            }
+          }
+          catch (NumberFormatException ex)
+          {
+            //$FALL-THROUGH$
+          }
+
+          try
+          {
+            int height = settings.getInt(DIALOG_HEIGHT);
+            if (height != DIALOG_DEFAULT_BOUNDS)
+            {
+              result.y = height;
+            }
+          }
+          catch (NumberFormatException ex)
+          {
+            //$FALL-THROUGH$
+          }
+
+          return result;
+        }
+      }
+    }
+
+    Text messageLabel;
+
+    try
+    {
+      messageLabel = (Text)messageLabelField.get(this);
+    }
+    catch (Throwable ex)
+    {
+      return result;
+    }
+
+    String message = messageLabel.getText();
+    messageLabel.setText("\n\n");
+
+    int messageHeight = messageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
+    messageLabel.setText(message);
+
+    result.x = WIDTH_MIN;
+    while (result.x < WIDTH_MAX)
+    {
+      result.x += WIDTH_INC1;
+      shell.setSize(result);
+
+      Point messageSize = messageLabel.computeSize(messageLabel.getSize().x, SWT.DEFAULT);
+      if (messageSize.y <= messageHeight)
+      {
+        break;
+      }
+    }
+
+    result.x -= WIDTH_INC1;
+    while (result.x < WIDTH_MAX)
+    {
+      result.x += WIDTH_INC2;
+      shell.setSize(result);
+
+      Point messageSize = messageLabel.computeSize(messageLabel.getSize().x, SWT.DEFAULT);
+      if (messageSize.y <= messageHeight)
+      {
+        break;
+      }
+    }
+
+    result = shell.computeSize(result.x + WIDTH_INC2, SWT.DEFAULT, true);
+    return result;
+  }
+
+  protected Point getMinimumSize()
+  {
+    return new Point(WIDTH_MIN, 0);
+  }
+
+  @Override
   protected Control createDialogArea(Composite parent)
   {
     Shell shell = getShell();
@@ -55,16 +260,50 @@
     return super.createDialogArea(parent);
   }
 
-  public static String createShellText(IStorageService service)
+  private boolean hasSameFont(IDialogSettings settings)
   {
-    String shellText = "User Storage Service";
-
-    String authority = service.getServiceURI().getAuthority();
-    if (authority != null && authority.endsWith(".eclipse.org"))
+    String previousFontData = settings.get(DIALOG_FONT_DATA);
+    if (StringUtil.isEmpty(previousFontData))
     {
-      shellText = "Eclipse " + shellText;
+      return false;
     }
 
-    return shellText;
+    FontData[] fontDatas = JFaceResources.getDialogFont().getFontData();
+    if (fontDatas.length == 0)
+    {
+      return false;
+    }
+
+    String currentFontData = fontDatas[0].toString();
+    return previousFontData.equalsIgnoreCase(currentFontData);
+  }
+
+  private boolean hasSameMessage(IDialogSettings settings)
+  {
+    String previousMessage = settings.get(DIALOG_MESSAGE);
+    if (StringUtil.isEmpty(previousMessage))
+    {
+      return false;
+    }
+
+    String currentMessage = getMessage();
+    return previousMessage.equals(currentMessage);
+  }
+
+  private static String getDialogConstant(String name, String defaultValue)
+  {
+    try
+    {
+      Field field = Dialog.class.getDeclaredField(name);
+      field.setAccessible(true);
+
+      return (String)field.get(null);
+    }
+    catch (Throwable ex)
+    {
+      //$FALL-THROUGH$
+    }
+
+    return defaultValue;
   }
 }
diff --git a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/AddServiceDialog.java b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/AddServiceDialog.java
index 6118c21..acaf415 100644
--- a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/AddServiceDialog.java
+++ b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/AddServiceDialog.java
@@ -15,6 +15,7 @@
 import org.eclipse.userstorage.ui.AbstractDialog;
 
 import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
@@ -98,7 +99,13 @@
   }
 
   @Override
-  protected Point getInitialSize()
+  protected IDialogSettings getPluginSettings()
+  {
+    return Activator.getDefault().getDialogSettings();
+  }
+
+  @Override
+  protected Point getMinimumSize()
   {
     return new Point(600, 350);
   }
diff --git a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/CredentialsComposite.java b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/CredentialsComposite.java
index 5d9faa4..db0fa0f 100644
--- a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/CredentialsComposite.java
+++ b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/CredentialsComposite.java
@@ -37,7 +37,7 @@
  */
 public class CredentialsComposite extends Composite
 {
-  public static final Point INITIAL_SIZE = new Point(500, 350);
+  public static final Point INITIAL_SIZE = new Point(600, 500);
 
   private final Callable<URI> createAccountURIProvider = new Callable<URI>()
   {
@@ -72,7 +72,7 @@
     public void modifyText(ModifyEvent e)
     {
       credentials = new Credentials(usernameText.getText(), passwordText.getText());
-      validate();
+      updateEnablement();
     }
   };
 
@@ -82,14 +82,6 @@
 
   private Credentials credentials;
 
-  private boolean termsOfUseAgreed;
-
-  private Button termsOfUseButton;
-
-  private MultiLink termsOfUseMultiLink;
-
-  private Label spacer;
-
   private Label usernameLabel;
 
   private Text usernameText;
@@ -98,12 +90,24 @@
 
   private Text passwordText;
 
+  private Label horizontalSpacer;
+
+  private boolean termsOfUseAgreed;
+
+  private Button termsOfUseButton;
+
+  private MultiLink termsOfUseMultiLink;
+
+  private Label verticalSpacer;
+
   private Link createAccountLink;
 
   private Link editAccountLink;
 
   private Link recoverPasswordLink;
 
+  private boolean valid;
+
   public CredentialsComposite(Composite parent, int style, int marginWidth, int marginHeight, boolean showServiceCredentials)
   {
     super(parent, style);
@@ -137,15 +141,18 @@
       {
         int columns = getGridColumns();
 
+        horizontalSpacer.setVisible(true);
+        horizontalSpacer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
+
         termsOfUseButton.setVisible(true);
         termsOfUseButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
 
-        termsOfUseMultiLink.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, columns - 1, 1));
+        termsOfUseMultiLink.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, columns - 2, 1));
         termsOfUseMultiLink.setVisible(true);
         termsOfUseMultiLink.setText(termsOfUse);
 
-        spacer.setVisible(true);
-        spacer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, columns, 1));
+        verticalSpacer.setVisible(true);
+        verticalSpacer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, columns, 1));
       }
 
       if (showServiceCredentials)
@@ -203,12 +210,18 @@
 
   public int getGridColumns()
   {
-    return 2;
+    return 3;
+  }
+
+  public boolean isValid()
+  {
+    return valid;
   }
 
   @Override
   public void setEnabled(boolean enabled)
   {
+    super.setEnabled(true);
     usernameLabel.setEnabled(enabled);
     usernameText.setEnabled(enabled);
     passwordLabel.setEnabled(enabled);
@@ -220,6 +233,19 @@
 
   protected void createUI(Composite parent, int columns)
   {
+    usernameLabel = new Label(parent, SWT.NONE);
+    usernameLabel.setText("User name:");
+    usernameText = new Text(parent, SWT.BORDER);
+    usernameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, columns - 1, 1));
+    usernameText.addModifyListener(modifyListener);
+
+    passwordLabel = new Label(parent, SWT.NONE);
+    passwordLabel.setText("Password:");
+    passwordText = new Text(parent, SWT.BORDER | SWT.PASSWORD);
+    passwordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, columns - 1, 1));
+    passwordText.addModifyListener(modifyListener);
+
+    horizontalSpacer = new Label(parent, SWT.NONE);
     termsOfUseButton = new Button(parent, SWT.CHECK);
     termsOfUseButton.addSelectionListener(new SelectionAdapter()
     {
@@ -228,37 +254,49 @@
       {
         termsOfUseAgreed = termsOfUseButton.getSelection();
         updateEnablement();
-        validate();
       }
     });
 
     termsOfUseMultiLink = new MultiLink.ForSystemBrowser(parent, SWT.WRAP);
-    spacer = new Label(parent, SWT.NONE);
-    hideTermsOfUse();
-
-    usernameLabel = new Label(parent, SWT.NONE);
-    usernameLabel.setText("User name:");
-
-    usernameText = new Text(parent, SWT.BORDER);
-    usernameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, columns - 1, 1));
-    usernameText.addModifyListener(modifyListener);
-
-    passwordLabel = new Label(parent, SWT.NONE);
-    passwordLabel.setText("Password:");
-
-    passwordText = new Text(parent, SWT.BORDER | SWT.PASSWORD);
-    passwordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, columns - 1, 1));
-    passwordText.addModifyListener(modifyListener);
+    verticalSpacer = new Label(parent, SWT.NONE);
 
     createAccountLink = createLink(parent, columns, "Create an account", createAccountURIProvider);
     editAccountLink = createLink(parent, columns, "Edit your account", editAccountURIProvider);
     recoverPasswordLink = createLink(parent, columns, "Recover your password", recoverPasswordURIProvider);
+
+    hideTermsOfUse();
   }
 
   protected void validate()
   {
   }
 
+  private void updateEnablement()
+  {
+    boolean enabled = isEnabled() && service != null;
+
+    enableLink(createAccountLink, createAccountURIProvider, enabled);
+    enableLink(editAccountLink, editAccountURIProvider, enabled);
+    enableLink(recoverPasswordLink, recoverPasswordURIProvider, enabled);
+
+    if (enabled)
+    {
+      String termsOfUseLink = service.getTermsOfUseLink();
+      if (!StringUtil.isEmpty(termsOfUseLink))
+      {
+        if (!termsOfUseAgreed)
+        {
+          valid = false;
+          validate();
+          return;
+        }
+      }
+    }
+
+    valid = enabled;
+    validate();
+  }
+
   private Link createLink(Composite parent, int columns, final String label, final Callable<URI> uriProvider)
   {
     new Label(parent, SWT.NONE); // Skip first column.
@@ -301,47 +339,20 @@
     }
   }
 
-  private void updateEnablement()
-  {
-    boolean enabled = isValid();
-
-    usernameLabel.setEnabled(enabled);
-    usernameText.setEnabled(enabled);
-    passwordLabel.setEnabled(enabled);
-    passwordText.setEnabled(enabled);
-
-    enableLink(createAccountLink, createAccountURIProvider, enabled);
-    enableLink(editAccountLink, editAccountURIProvider, enabled);
-    enableLink(recoverPasswordLink, recoverPasswordURIProvider, enabled);
-  }
-
-  private boolean isValid()
-  {
-    if (service == null)
-    {
-      return false;
-    }
-
-    String termsOfUseLink = service.getTermsOfUseLink();
-    if (StringUtil.isEmpty(termsOfUseLink))
-    {
-      return true;
-    }
-
-    return termsOfUseAgreed;
-  }
-
   private void hideTermsOfUse()
   {
+    horizontalSpacer.setVisible(false);
+    horizontalSpacer.setLayoutData(emptyGridData(1, 1));
+
     termsOfUseButton.setVisible(false);
     termsOfUseButton.setLayoutData(emptyGridData(1, 1));
 
     termsOfUseMultiLink.setVisible(false);
-    termsOfUseMultiLink.setLayoutData(emptyGridData(getGridColumns() - 1, 1));
+    termsOfUseMultiLink.setLayoutData(emptyGridData(getGridColumns() - 2, 1));
     termsOfUseMultiLink.setText(StringUtil.EMPTY);
 
-    spacer.setVisible(false);
-    spacer.setLayoutData(emptyGridData(getGridColumns(), 1));
+    verticalSpacer.setVisible(false);
+    verticalSpacer.setLayoutData(emptyGridData(getGridColumns(), 1));
   }
 
   private static GridData emptyGridData(int horizontalSpan, int verticalSpan)
diff --git a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/CredentialsDialog.java b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/CredentialsDialog.java
similarity index 83%
rename from org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/CredentialsDialog.java
rename to org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/CredentialsDialog.java
index 72cf073..33f11e7 100644
--- a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/CredentialsDialog.java
+++ b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/CredentialsDialog.java
@@ -8,17 +8,18 @@
  * Contributors:
  *    Eike Stepper - initial API and implementation
  */
-package org.eclipse.userstorage.ui;
+package org.eclipse.userstorage.ui.internal;
 
 import org.eclipse.userstorage.IStorageService;
+import org.eclipse.userstorage.internal.StorageService;
 import org.eclipse.userstorage.internal.util.StringUtil;
 import org.eclipse.userstorage.spi.Credentials;
-import org.eclipse.userstorage.ui.internal.CredentialsComposite;
+import org.eclipse.userstorage.ui.AbstractDialog;
 
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
@@ -58,9 +59,9 @@
   }
 
   @Override
-  protected Point getInitialSize()
+  protected IDialogSettings getPluginSettings()
   {
-    return CredentialsComposite.INITIAL_SIZE;
+    return Activator.getDefault().getDialogSettings();
   }
 
   @Override
@@ -68,14 +69,21 @@
   {
     super.configureShell(newShell);
 
-    String shellText = AbstractDialog.createShellText(service);
+    String shellText = "User Storage Service";
+
+    String authority = service.getServiceURI().getAuthority();
+    if (authority != null && authority.endsWith(".eclipse.org"))
+    {
+      shellText = "Eclipse " + shellText;
+    }
+
     newShell.setText(shellText);
   }
 
   @Override
   protected Control createDialogArea(Composite parent)
   {
-    setTitle("LogIn");
+    setTitle("Login");
     if (reauthentication)
     {
       setErrorMessage("You could not be logged in to your " + service.getServiceLabel() + " account. Please try again.");
@@ -115,6 +123,7 @@
   @Override
   protected void okPressed()
   {
+    ((StorageService)service).setTermsOfUseAgreed(credentialsComposite.isTermsOfUseAgreed());
     credentials = credentialsComposite.getCredentials();
     super.okPressed();
   }
@@ -154,7 +163,7 @@
   {
     if (okButton != null)
     {
-      boolean valid = isPageValid();
+      boolean valid = credentialsComposite.isValid();
       okButton.setEnabled(valid);
     }
   }
diff --git a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/DialogCredentialsProvider.java b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/DialogCredentialsProvider.java
index a8b6740..0594865 100644
--- a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/DialogCredentialsProvider.java
+++ b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/DialogCredentialsProvider.java
@@ -13,7 +13,6 @@
 import org.eclipse.userstorage.IStorageService;
 import org.eclipse.userstorage.spi.Credentials;
 import org.eclipse.userstorage.spi.ICredentialsProvider;
-import org.eclipse.userstorage.ui.CredentialsDialog;
 
 import org.eclipse.swt.widgets.Shell;
 
