diff --git a/org.eclipse.userstorage.ui/User Storage IDE.launch b/org.eclipse.userstorage.ui/User Storage IDE.launch
index dccb826..ccf5a46 100644
--- a/org.eclipse.userstorage.ui/User Storage IDE.launch
+++ b/org.eclipse.userstorage.ui/User Storage IDE.launch
@@ -21,6 +21,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.eclipse.userstorage.ui.showServices=false"/>
 <stringAttribute key="pde.version" value="3.3"/>
 <stringAttribute key="product" value="org.eclipse.sdk.ide"/>
 <booleanAttribute key="show_selected_only" value="false"/>
diff --git a/org.eclipse.userstorage.ui/plugin.xml b/org.eclipse.userstorage.ui/plugin.xml
index 6c204d3..bbb7894 100644
--- a/org.eclipse.userstorage.ui/plugin.xml
+++ b/org.eclipse.userstorage.ui/plugin.xml
@@ -21,7 +21,7 @@
       <page category="org.eclipse.ui.preferencePages.Workbench"
             class="org.eclipse.userstorage.ui.internal.ServicesPreferencePage"
             id="org.eclipse.userstorage.ui.ServicesPreferencePage"
-            name="User Storage"/>
+            name="User Storage Service"/>
    </extension>
 
 </plugin>
diff --git a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/ServiceSelectorComposite.java b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/ServiceSelectorComposite.java
index 9b8d98c..5ea99bc 100644
--- a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/ServiceSelectorComposite.java
+++ b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/ServiceSelectorComposite.java
@@ -143,4 +143,15 @@
     IStructuredSelection selection = (IStructuredSelection)viewer.getSelection();
     return (IStorageService)selection.getFirstElement();
   }
+
+  public static boolean isShowServices()
+  {
+    String property = System.getProperty("org.eclipse.userstorage.ui.showServices", "auto");
+    if ("auto".equalsIgnoreCase(property))
+    {
+      return IStorageService.Registry.INSTANCE.getServices().length > 1;
+    }
+  
+    return Boolean.parseBoolean(property);
+  }
 }
diff --git a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/ServicesPreferencePage.java b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/ServicesPreferencePage.java
index d7f1b29..3034d78 100644
--- a/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/ServicesPreferencePage.java
+++ b/org.eclipse.userstorage.ui/src/org/eclipse/userstorage/ui/internal/ServicesPreferencePage.java
@@ -11,9 +11,11 @@
 package org.eclipse.userstorage.ui.internal;
 
 import org.eclipse.userstorage.IStorageService;
+import org.eclipse.userstorage.IStorageService.Registry;
 import org.eclipse.userstorage.internal.Credentials;
 import org.eclipse.userstorage.internal.StorageService;
 import org.eclipse.userstorage.internal.util.StringUtil;
+import org.eclipse.userstorage.ui.ServiceSelectorComposite;
 
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.layout.TableColumnLayout;
@@ -48,6 +50,8 @@
 {
   public static final String ID = "org.eclipse.userstorage.ui.ServicesPreferencePage";
 
+  private static final Registry REGISTRY = IStorageService.Registry.INSTANCE;
+
   private Map<IStorageService, Credentials> credentialsMap = new HashMap<IStorageService, Credentials>();
 
   private TableViewer servicesViewer;
@@ -62,7 +66,7 @@
 
   public ServicesPreferencePage()
   {
-    super("User Storage");
+    super("User Storage Service");
   }
 
   @Override
@@ -91,39 +95,42 @@
   @Override
   protected Control createContents(final Composite parent)
   {
+    final ServicesContentProvider contentProvider = ServiceSelectorComposite.isShowServices() ? new ServicesContentProvider() : null;
+
     final Composite mainArea = createArea(parent, 2);
     mainArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
     Composite leftArea = createArea(mainArea, 1);
     leftArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
-    Label servicesLabel = new Label(leftArea, SWT.NONE);
-    servicesLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-    servicesLabel.setText("Services:");
-
-    final ServicesContentProvider contentProvider = new ServicesContentProvider();
-
-    TableColumnLayout tableLayout = new TableColumnLayout();
-    Composite tableComposite = new Composite(leftArea, SWT.NONE);
-    tableComposite.setLayout(tableLayout);
-    tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-    servicesViewer = new TableViewer(tableComposite, SWT.BORDER);
-    servicesViewer.setContentProvider(contentProvider);
-    servicesViewer.setLabelProvider(new ServicesLabelProvider());
-    servicesViewer.setInput(IStorageService.Registry.INSTANCE);
-    servicesViewer.addSelectionChangedListener(new ISelectionChangedListener()
+    if (contentProvider != null)
     {
-      @Override
-      public void selectionChanged(SelectionChangedEvent event)
-      {
-        IStructuredSelection selection = (IStructuredSelection)event.getSelection();
-        setSelectedService((IStorageService)selection.getFirstElement());
-      }
-    });
+      Label servicesLabel = new Label(leftArea, SWT.NONE);
+      servicesLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+      servicesLabel.setText("Services:");
 
-    TableColumn tableColumn = new TableColumn(servicesViewer.getTable(), SWT.LEFT);
-    tableLayout.setColumnData(tableColumn, new ColumnWeightData(100));
+      TableColumnLayout tableLayout = new TableColumnLayout();
+      Composite tableComposite = new Composite(leftArea, SWT.NONE);
+      tableComposite.setLayout(tableLayout);
+      tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+      servicesViewer = new TableViewer(tableComposite, SWT.BORDER);
+      servicesViewer.setContentProvider(contentProvider);
+      servicesViewer.setLabelProvider(new ServicesLabelProvider());
+      servicesViewer.setInput(REGISTRY);
+      servicesViewer.addSelectionChangedListener(new ISelectionChangedListener()
+      {
+        @Override
+        public void selectionChanged(SelectionChangedEvent event)
+        {
+          IStructuredSelection selection = (IStructuredSelection)event.getSelection();
+          setSelectedService((IStorageService)selection.getFirstElement());
+        }
+      });
+
+      TableColumn tableColumn = new TableColumn(servicesViewer.getTable(), SWT.LEFT);
+      tableLayout.setColumnData(tableColumn, new ColumnWeightData(100));
+    }
 
     credentialsComposite = new CredentialsComposite(leftArea, SWT.NONE, 0, 0, false)
     {
@@ -141,108 +148,112 @@
 
     credentialsComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
 
-    Composite rightArea = createArea(mainArea, 1);
-    rightArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-
-    new Label(rightArea, SWT.NONE);
-
-    addButton = new Button(rightArea, SWT.NONE);
-    addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-    addButton.setText("Add...");
-    addButton.addSelectionListener(new SelectionAdapter()
+    if (contentProvider != null)
     {
-      @Override
-      public void widgetSelected(SelectionEvent e)
+      Composite rightArea = createArea(mainArea, 1);
+      rightArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+      new Label(rightArea, SWT.NONE);
+
+      addButton = new Button(rightArea, SWT.NONE);
+      addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+      addButton.setText("Add...");
+      addButton.addSelectionListener(new SelectionAdapter()
       {
-        AddServiceDialog dialog = new AddServiceDialog(getShell());
-        if (dialog.open() == AddServiceDialog.OK)
+        @Override
+        public void widgetSelected(SelectionEvent e)
         {
-          String serviceLabel = dialog.getServiceLabel();
-          URI serviceURI = dialog.getServiceURI();
-          URI createAccountURI = dialog.getCreateAccountURI();
-          URI editAccountURI = dialog.getEditAccountURI();
-          URI recoverPasswordURI = dialog.getRecoverPasswordURI();
-
-          IStorageService.Registry.INSTANCE.addService(serviceLabel, serviceURI, createAccountURI, editAccountURI, recoverPasswordURI);
-        }
-      }
-    });
-
-    removeButton = new Button(rightArea, SWT.NONE);
-    removeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-    removeButton.setText("Remove");
-    removeButton.addSelectionListener(new SelectionAdapter()
-    {
-      @Override
-      public void widgetSelected(SelectionEvent e)
-      {
-        if (selectedService instanceof IStorageService.Dynamic)
-        {
-          IStorageService.Dynamic dynamicService = (IStorageService.Dynamic)selectedService;
-          Object[] elements = contentProvider.getElements(null);
-          final int currentIndex = getCurrentIndex(elements, dynamicService);
-
-          if (MessageDialog.openQuestion(getShell(), "Remove Service", "Do you really want to remove the '" + dynamicService.getServiceLabel() + "' service?"))
+          AddServiceDialog dialog = new AddServiceDialog(getShell());
+          if (dialog.open() == AddServiceDialog.OK)
           {
-            dynamicService.remove();
+            String serviceLabel = dialog.getServiceLabel();
+            URI serviceURI = dialog.getServiceURI();
+            URI createAccountURI = dialog.getCreateAccountURI();
+            URI editAccountURI = dialog.getEditAccountURI();
+            URI recoverPasswordURI = dialog.getRecoverPasswordURI();
 
-            final Control control = servicesViewer.getControl();
-            control.getDisplay().asyncExec(new Runnable()
+            REGISTRY.addService(serviceLabel, serviceURI, createAccountURI, editAccountURI, recoverPasswordURI);
+          }
+        }
+      });
+
+      removeButton = new Button(rightArea, SWT.NONE);
+      removeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+      removeButton.setText("Remove");
+      removeButton.addSelectionListener(new SelectionAdapter()
+      {
+        @Override
+        public void widgetSelected(SelectionEvent e)
+        {
+          if (selectedService instanceof IStorageService.Dynamic)
+          {
+            IStorageService.Dynamic dynamicService = (IStorageService.Dynamic)selectedService;
+            Object[] elements = contentProvider.getElements(null);
+            final int currentIndex = getCurrentIndex(elements, dynamicService);
+
+            if (MessageDialog.openQuestion(getShell(), "Remove Service",
+                "Do you really want to remove the '" + dynamicService.getServiceLabel() + "' service?"))
             {
-              @Override
-              public void run()
-              {
-                if (!control.isDisposed())
-                {
-                  Object[] elements = contentProvider.getElements(null);
-                  if (elements.length != 0)
-                  {
-                    int newIndex = currentIndex;
-                    if (newIndex >= elements.length)
-                    {
-                      newIndex = elements.length - 1;
-                    }
+              dynamicService.remove();
 
-                    setSelectedService((IStorageService)elements[newIndex]);
+              final Control control = servicesViewer.getControl();
+              control.getDisplay().asyncExec(new Runnable()
+              {
+                @Override
+                public void run()
+                {
+                  if (!control.isDisposed())
+                  {
+                    Object[] elements = contentProvider.getElements(null);
+                    if (elements.length != 0)
+                    {
+                      int newIndex = currentIndex;
+                      if (newIndex >= elements.length)
+                      {
+                        newIndex = elements.length - 1;
+                      }
+
+                      setSelectedService((IStorageService)elements[newIndex]);
+                    }
                   }
                 }
-              }
-            });
+              });
+            }
           }
         }
-      }
 
-      private int getCurrentIndex(Object[] elements, IStorageService service)
-      {
-        for (int i = 0; i < elements.length; i++)
+        private int getCurrentIndex(Object[] elements, IStorageService service)
         {
-          Object element = elements[i];
-          if (element == service)
+          for (int i = 0; i < elements.length; i++)
           {
-            return i;
+            Object element = elements[i];
+            if (element == service)
+            {
+              return i;
+            }
           }
+
+          return 0;
         }
+      });
 
-        return 0;
-      }
-    });
-
-    Button refreshButton = new Button(rightArea, SWT.NONE);
-    refreshButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-    refreshButton.setText("Refresh");
-    refreshButton.addSelectionListener(new SelectionAdapter()
-    {
-      @Override
-      public void widgetSelected(SelectionEvent e)
+      Button refreshButton = new Button(rightArea, SWT.NONE);
+      refreshButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+      refreshButton.setText("Refresh");
+      refreshButton.addSelectionListener(new SelectionAdapter()
       {
-        IStorageService.Registry.INSTANCE.refresh();
-      }
-    });
+        @Override
+        public void widgetSelected(SelectionEvent e)
+        {
+          REGISTRY.refresh();
+        }
+      });
 
-    Object[] elements = contentProvider.getElements(null);
-    if (elements.length != 0)
-    {
-      setSelectedService((IStorageService)elements[0]);
+      Object[] elements = contentProvider.getElements(null);
+      if (elements.length != 0)
+      {
+        setSelectedService((IStorageService)elements[0]);
+      }
     }
 
     return mainArea;
@@ -321,7 +332,7 @@
   private void updateEnablement()
   {
     boolean dirty = false;
-    for (IStorageService service : IStorageService.Registry.INSTANCE.getServices())
+    for (IStorageService service : REGISTRY.getServices())
     {
       Credentials localCredentials = credentialsMap.get(service);
       String localUsername = "";
