diff --git a/dlls/x11drv/clipboard.c b/dlls/x11drv/clipboard.c
index 55847b5..9901701 100644
--- a/dlls/x11drv/clipboard.c
+++ b/dlls/x11drv/clipboard.c
@@ -98,21 +98,6 @@
 #define S_PRIMARY        1
 #define S_CLIPBOARD      2
 
-/* CLIPBOARD atom names */
-#define _CLIPBOARD     "CLIPBOARD"
-#define _TARGETS      "TARGETS"
-#define _MULTIPLE     "MULTIPLE"
-#define _SELECTIONDATA "SELECTION_DATA"
-#define _TEXT          "TEXT"
-#define _COMPOUNDTEXT  "COMPOUND_TEXT"
-
-Atom xaClipboard = None;
-Atom xaTargets = None;
-Atom xaMultiple = None;
-Atom xaSelectionData = None;
-Atom xaText = None;
-Atom xaCompoundText = None;
-
 static int selectionAcquired = 0;              /* Contains the current selection masks */
 static Window selectionWindow = None;          /* The top level X window which owns the selection */
 static BOOL clearAllSelections = FALSE;        /* Always lose all selections */
@@ -138,7 +123,7 @@
     Atom rprop, LPWINE_CLIPDATA lpdata, LPDWORD lpBytes);
 HANDLE X11DRV_CLIPBOARD_ExportEnhMetaFile(Window requestor, Atom aTarget,
     Atom rprop, LPWINE_CLIPDATA lpdata, LPDWORD lpBytes);
-UINT X11DRV_CLIPBOARD_InsertClipboardFormat(LPCSTR FormatName, LPCSTR PropertyName);
+static UINT X11DRV_CLIPBOARD_InsertClipboardFormat(LPCSTR FormatName, Atom prop);
 static BOOL X11DRV_CLIPBOARD_ReadSelection(LPWINE_CLIPFORMAT lpData, Window w, Atom prop);
 static BOOL X11DRV_CLIPBOARD_RenderSynthesizedText(UINT wFormatID);
 static void X11DRV_CLIPBOARD_FreeData(LPWINE_CLIPDATA lpData);
@@ -154,7 +139,7 @@
  * WARNING: This data ordering is dependent on the WINE_CLIPFORMAT structure
  * declared in clipboard.h
  */
-WINE_CLIPFORMAT ClipFormats[]  =
+static WINE_CLIPFORMAT ClipFormats[]  =
 {
     { CF_TEXT, "WCF_TEXT",  0, CF_FLAG_BUILTINFMT, X11DRV_CLIPBOARD_ImportClipboardData,
         X11DRV_CLIPBOARD_ExportClipboardData, NULL, &ClipFormats[1]},
@@ -223,25 +208,34 @@
         X11DRV_CLIPBOARD_ExportClipboardData, &ClipFormats[20], NULL}
 };
 
+#define GET_ATOM(prop)  (((prop) < FIRST_XATOM) ? (Atom)(prop) : X11DRV_Atoms[(prop) - FIRST_XATOM])
 
 /* Maps X properties to Windows formats */
-PROPERTYFORMATMAP PropertyFormatMap[] =
-{ 
-    { "text/rtf", "Rich Text Format" },
+static const struct
+{
+    LPCSTR lpszFormat;
+    UINT   prop;
+} PropertyFormatMap[] =
+{
+    { "Rich Text Format", XATOM_text_rtf },
     /* Temporarily disable text/html because Evolution incorrectly pastes strings with extra nulls */
     /*{ "text/html", "HTML Format" },*/
-    { "image/gif", "GIF" },
+    { "GIF", XATOM_image_gif }
 };
 
 
 /* Maps equivalent X properties. It is assumed that lpszProperty must already 
    be in ClipFormats or PropertyFormatMap. */
-PROPERTYALIASMAP PropertyAliasMap[] =
-{ 
-    /* lpszProperty, Alias */
-    { "text/rtf", 0, "text/richtext", 0 },
-    { "XAString", XA_STRING, _COMPOUNDTEXT, 0 },
-    { "XAString", XA_STRING, _TEXT, 0 },
+static const struct
+{
+    UINT drvDataProperty;
+    UINT drvDataAlias;
+} PropertyAliasMap[] =
+{
+    /* DataProperty,   DataAlias */
+    { XATOM_text_rtf,  XATOM_text_richtext },
+    { XA_STRING,       XATOM_COMPOUND_TEXT },
+    { XA_STRING,       XATOM_TEXT },
 };
 
 
@@ -254,7 +248,7 @@
 /*
  * Clipboard sequence number
  */
-UINT wSeqNo = 0;
+static UINT wSeqNo = 0;
 
 /**************************************************************************
  *                Internal Clipboard implementation methods
@@ -263,20 +257,12 @@
 /**************************************************************************
  *		X11DRV_InitClipboard
  */
-BOOL X11DRV_InitClipboard(Display *display)
+void X11DRV_InitClipboard(Display *display)
 {
     INT i;
     HKEY hkey;
-    PROPERTYALIASMAP *lpalias;
     LPWINE_CLIPFORMAT lpFormat = ClipFormats;
 
-    xaClipboard = TSXInternAtom( display, _CLIPBOARD, FALSE );
-    xaTargets = TSXInternAtom( display, _TARGETS, FALSE );
-    xaMultiple = TSXInternAtom(display, _MULTIPLE, False);
-    xaSelectionData = TSXInternAtom(display, _SELECTIONDATA, False);
-    xaText = TSXInternAtom(display, _TEXT, False);
-    xaCompoundText = TSXInternAtom(display, _COMPOUNDTEXT, False);
-
     if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Clipboard", &hkey))
     {
 	char buffer[20];
@@ -299,21 +285,9 @@
     }
 
     /* Register known mapping between window formats and X properties */
-    for (i = 0; i < sizeof(PropertyFormatMap)/sizeof(PROPERTYFORMATMAP); i++)
-        X11DRV_CLIPBOARD_InsertClipboardFormat(PropertyFormatMap[i].lpszFormat, 
-            PropertyFormatMap[i].lpszProperty);
-
-    /* Register known mapping between X properties */
-    for (i = 0; i < sizeof(PropertyAliasMap)/sizeof(PROPERTYALIASMAP); i++)
-    {
-        lpalias = &PropertyAliasMap[i];
-        if (!lpalias->drvDataProperty)
-        lpalias->drvDataProperty = TSXInternAtom(display, lpalias->lpszProperty, False);
-        if (!lpalias->drvDataAlias)
-        lpalias->drvDataAlias = TSXInternAtom(display, lpalias->lpszAlias, False);
-    }
-
-    return TRUE;
+    for (i = 0; i < sizeof(PropertyFormatMap)/sizeof(PropertyFormatMap[0]); i++)
+        X11DRV_CLIPBOARD_InsertClipboardFormat(PropertyFormatMap[i].lpszFormat,
+                                               GET_ATOM(PropertyFormatMap[i].prop));
 }
 
 
@@ -363,11 +337,11 @@
     unsigned int i;
     LPWINE_CLIPFORMAT lpFormat = NULL;
 
-    for (i = 0; i < sizeof(PropertyAliasMap)/sizeof(PROPERTYALIASMAP); i++)
+    for (i = 0; i < sizeof(PropertyAliasMap)/sizeof(PropertyAliasMap[0]); i++)
     {
-        if (PropertyAliasMap[i].drvDataAlias == drvDataAlias)
+        if (GET_ATOM(PropertyAliasMap[i].drvDataAlias) == drvDataAlias)
         {
-            lpFormat = X11DRV_CLIPBOARD_LookupProperty(PropertyAliasMap[i].drvDataProperty);
+            lpFormat = X11DRV_CLIPBOARD_LookupProperty(GET_ATOM(PropertyAliasMap[i].drvDataProperty));
             break;
         }
    }
@@ -384,11 +358,11 @@
     unsigned int i;
     UINT alias = 0;
 
-    for (i = 0; i < sizeof(PropertyAliasMap)/sizeof(PROPERTYALIASMAP); i++)
+    for (i = 0; i < sizeof(PropertyAliasMap)/sizeof(PropertyAliasMap[0]); i++)
     {
-        if (PropertyAliasMap[i].drvDataProperty == drvDataProperty)
+        if (GET_ATOM(PropertyAliasMap[i].drvDataProperty) == drvDataProperty)
         {
-            alias = PropertyAliasMap[i].drvDataAlias;
+            alias = GET_ATOM(PropertyAliasMap[i].drvDataAlias);
             break;
         }
    }
@@ -426,7 +400,7 @@
 /**************************************************************************
  *		InsertClipboardFormat
  */
-UINT X11DRV_CLIPBOARD_InsertClipboardFormat(LPCSTR FormatName, LPCSTR PropertyName)
+static UINT X11DRV_CLIPBOARD_InsertClipboardFormat(LPCSTR FormatName, Atom prop)
 {
     LPWINE_CLIPFORMAT lpFormat;
     LPWINE_CLIPFORMAT lpNewFormat;
@@ -451,7 +425,7 @@
     strcpy(lpNewFormat->Name, FormatName);
     lpNewFormat->wFlags = 0;
     lpNewFormat->wFormatID = GlobalAddAtomA(lpNewFormat->Name);
-    lpNewFormat->drvData = TSXInternAtom(thread_display(), PropertyName, False);
+    lpNewFormat->drvData = prop;
     lpNewFormat->lpDrvImportFunc = X11DRV_CLIPBOARD_ImportClipboardData;
     lpNewFormat->lpDrvExportFunc = X11DRV_CLIPBOARD_ExportClipboardData;
 
@@ -465,11 +439,8 @@
     lpFormat->NextFormat = lpNewFormat;
     lpNewFormat->PrevFormat = lpFormat;
 
-    TRACE("Registering format(%d): %s drvData(%d): %s\n", 
-        lpNewFormat->wFormatID, 
-        FormatName,
-        lpNewFormat->drvData, 
-        PropertyName);
+    TRACE("Registering format(%d): %s drvData %d\n",
+        lpNewFormat->wFormatID, FormatName, lpNewFormat->drvData);
 
     return lpNewFormat->wFormatID;
 }
@@ -1154,7 +1125,7 @@
 
     if (lpstr)
     {
-        if (aTarget == xaCompoundText)
+        if (aTarget == x11drv_atom(COMPOUND_TEXT))
            style = XCompoundTextStyle;
         else
            style = XStdICCTextStyle;
@@ -1186,7 +1157,7 @@
     {
         if (aTarget == XA_STRING)
             return X11DRV_CLIPBOARD_ExportXAString(lpData, lpBytes);
-        else if (aTarget == xaCompoundText || aTarget == xaText)
+        else if (aTarget == x11drv_atom(COMPOUND_TEXT) || aTarget == x11drv_atom(TEXT))
             return X11DRV_CLIPBOARD_ExportCompoundText(requestor, aTarget,
                 rprop, lpData, lpBytes);
         else
@@ -1275,7 +1246,8 @@
     Bool res;
 
     wine_tsx11_lock();
-    XConvertSelection(display, selection, xaTargets, xaSelectionData, w, CurrentTime);
+    XConvertSelection(display, selection, x11drv_atom(TARGETS),
+                      x11drv_atom(SELECTION_DATA), w, CurrentTime);
     wine_tsx11_unlock();
 
     /*
@@ -1292,7 +1264,7 @@
     }
 
     /* Verify that the selection returned a valid TARGETS property */
-    if ((xe->xselection.target != xaTargets) || (xe->xselection.property == None))
+    if ((xe->xselection.target != x11drv_atom(TARGETS)) || (xe->xselection.property == None))
     {
         /* Selection owner failed to respond or we missed the SelectionNotify */
         WARN("Failed to retrieve TARGETS for selection %ld.\n", selection);
@@ -1332,7 +1304,7 @@
         if (TSXGetSelectionOwner(display,XA_PRIMARY) == selectionWindow)
 	    selectionAcquired |= S_PRIMARY;
 
-        if (TSXGetSelectionOwner(display,xaClipboard) == selectionWindow)
+        if (TSXGetSelectionOwner(display,x11drv_atom(CLIPBOARD)) == selectionWindow)
 	    selectionAcquired |= S_CLIPBOARD;
 
         if (!(selectionAcquired == (S_PRIMARY | S_CLIPBOARD)))
@@ -1365,12 +1337,12 @@
      * Query the selection owner for the TARGETS property
      */
     if (TSXGetSelectionOwner(display,XA_PRIMARY) ||
-        TSXGetSelectionOwner(display,xaClipboard))
+        TSXGetSelectionOwner(display,x11drv_atom(CLIPBOARD)))
     {
     if (X11DRV_CLIPBOARD_QueryTargets(display, w, XA_PRIMARY, &xe))
         selectionCacheSrc = XA_PRIMARY;
-    else if (X11DRV_CLIPBOARD_QueryTargets(display, w, xaClipboard, &xe))
-        selectionCacheSrc = xaClipboard;
+    else if (X11DRV_CLIPBOARD_QueryTargets(display, w, x11drv_atom(CLIPBOARD), &xe))
+        selectionCacheSrc = x11drv_atom(CLIPBOARD);
     else
             return -1;
     }
@@ -1392,7 +1364,7 @@
         * The TARGETS property should have returned us a list of atoms
         * corresponding to each selection target format supported.
         */
-       if ((atype == XA_ATOM || atype == xaTargets) && aformat == 32)
+       if ((atype == XA_ATOM || atype == x11drv_atom(TARGETS)) && aformat == 32)
        {
           INT i;
 
@@ -1478,7 +1450,7 @@
 
             wine_tsx11_lock();
             XConvertSelection(display, selectionCacheSrc, lpFormat->drvData,
-                              xaSelectionData, w, CurrentTime);
+                              x11drv_atom(SELECTION_DATA), w, CurrentTime);
             wine_tsx11_unlock();
 
             /* wait until SelectionNotify is received */
@@ -1498,7 +1470,7 @@
 	    {
                 wine_tsx11_lock();
                 XConvertSelection(display, selectionCacheSrc, alias,
-                                  xaSelectionData, w, CurrentTime);
+                                  x11drv_atom(SELECTION_DATA), w, CurrentTime);
                 wine_tsx11_unlock();
 
                 /* wait until SelectionNotify is received */
@@ -1726,7 +1698,7 @@
              * dictate that *all* selections should be cleared on loss of a selection,
              * we must give up all the selections we own.
              */
-            if (clearAllSelections || (selType == xaClipboard))
+            if (clearAllSelections || (selType == x11drv_atom(CLIPBOARD)))
             {
                 CLIPBOARDINFO cbinfo;
 
@@ -1752,7 +1724,7 @@
                     if (OpenClipboard(hwnd))
                     {
                       /* We really lost CLIPBOARD but want to voluntarily lose PRIMARY */
-                      if ((selType == xaClipboard) && (selectionAcquired & S_PRIMARY))
+                      if ((selType == x11drv_atom(CLIPBOARD)) && (selectionAcquired & S_PRIMARY))
                       {
 		          TRACE("Lost clipboard. Check if we need to release PRIMARY\n");
                           if (selectionWindow == TSXGetSelectionOwner(display,XA_PRIMARY))
@@ -1768,10 +1740,10 @@
                       if ((selType == XA_PRIMARY) && (selectionAcquired & S_CLIPBOARD))
                       {
 		          TRACE("Lost PRIMARY. Check if we need to release CLIPBOARD\n");
-                          if (selectionWindow == TSXGetSelectionOwner(display,xaClipboard))
+                          if (selectionWindow == TSXGetSelectionOwner(display,x11drv_atom(CLIPBOARD)))
                           {
 		              TRACE("We still own CLIPBOARD. Releasing CLIPBOARD.\n");
-                              XSetSelectionOwner(display, xaClipboard, None, CurrentTime);
+                              XSetSelectionOwner(display, x11drv_atom(CLIPBOARD), None, CurrentTime);
                           }
 		          else
 		              TRACE("We no longer own CLIPBOARD\n");
@@ -1835,6 +1807,7 @@
 INT X11DRV_RegisterClipboardFormat(LPCSTR FormatName)
 {
     LPWINE_CLIPFORMAT lpFormat = ClipFormats;
+    Atom prop;
 
     if (FormatName == NULL) 
         return 0;
@@ -1854,7 +1827,8 @@
 	lpFormat = lpFormat->NextFormat;
     }
 
-    return X11DRV_CLIPBOARD_InsertClipboardFormat(FormatName, FormatName);
+    prop = TSXInternAtom( thread_display(), FormatName, False );
+    return X11DRV_CLIPBOARD_InsertClipboardFormat(FormatName, prop);
 }
 
 
@@ -1919,12 +1893,12 @@
 
         /* Grab CLIPBOARD selection if not owned */
         if (!(selectionAcquired & S_CLIPBOARD))
-            TSXSetSelectionOwner(display, xaClipboard, owner, CurrentTime);
+            TSXSetSelectionOwner(display, x11drv_atom(CLIPBOARD), owner, CurrentTime);
 
         if (TSXGetSelectionOwner(display,XA_PRIMARY) == owner)
 	    selectionAcquired |= S_PRIMARY;
 
-        if (TSXGetSelectionOwner(display,xaClipboard) == owner)
+        if (TSXGetSelectionOwner(display,x11drv_atom(CLIPBOARD)) == owner)
 	    selectionAcquired |= S_CLIPBOARD;
 
         if (selectionAcquired)
@@ -1942,7 +1916,7 @@
         if (TSXGetSelectionOwner(display,XA_PRIMARY) == selectionWindow)
 	    selectionAcquired |= S_PRIMARY;
 
-        if (TSXGetSelectionOwner(display,xaClipboard) == selectionWindow)
+        if (TSXGetSelectionOwner(display,x11drv_atom(CLIPBOARD)) == selectionWindow)
 	    selectionAcquired |= S_CLIPBOARD;
 
         if (!(selectionAcquired == (S_PRIMARY | S_CLIPBOARD)))
@@ -2225,7 +2199,7 @@
         if (saveSelectionState & S_PRIMARY)
             TSXSetSelectionOwner(display, XA_PRIMARY, selectionWindow, CurrentTime);
 
-        TSXSetSelectionOwner(display, xaClipboard, selectionWindow, CurrentTime);
+        TSXSetSelectionOwner(display, x11drv_atom(CLIPBOARD), selectionWindow, CurrentTime);
 
         /* Restore the selection masks */
         selectionAcquired = saveSelectionState;
@@ -2233,7 +2207,7 @@
         /* Lose the selection if something went wrong */
         if (((saveSelectionState & S_PRIMARY) &&
            (TSXGetSelectionOwner(display, XA_PRIMARY) != selectionWindow)) || 
-           (TSXGetSelectionOwner(display, xaClipboard) != selectionWindow))
+           (TSXGetSelectionOwner(display, x11drv_atom(CLIPBOARD)) != selectionWindow))
         {
             bLostSelection = TRUE;
         }
