diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index e1e0e5c..82899f0 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -77,7 +77,7 @@
     return CONTAINING_RECORD(iface, EnumMonikerImpl, IEnumMoniker_iface);
 }
 
-static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker,ULONG tabSize,ULONG currentPos,BOOL leftToRigth,IEnumMoniker ** ppmk);
+static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker,ULONG tabSize,ULONG currentPos,BOOL leftToRight,IEnumMoniker ** ppmk);
 
 /*******************************************************************************
  *        CompositeMoniker_QueryInterface
@@ -333,7 +333,7 @@
 {
     HRESULT   res;
     IRunningObjectTable *prot;
-    IMoniker *tempMk,*antiMk,*mostRigthMk;
+    IMoniker *tempMk,*antiMk,*rightMostMk;
     IEnumMoniker *enumMoniker;
 
     TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
@@ -362,17 +362,17 @@
         /* component of the composite, passing the rest of the composite as the pmkToLeft parameter for that call */
 
         IMoniker_Enum(iface,FALSE,&enumMoniker);
-        IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+        IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
         IEnumMoniker_Release(enumMoniker);
 
         res=CreateAntiMoniker(&antiMk);
         res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
         IMoniker_Release(antiMk);
 
-        res=IMoniker_BindToObject(mostRigthMk,pbc,tempMk,riid,ppvResult);
+        res=IMoniker_BindToObject(rightMostMk,pbc,tempMk,riid,ppvResult);
 
         IMoniker_Release(tempMk);
-        IMoniker_Release(mostRigthMk);
+        IMoniker_Release(rightMostMk);
     }
 
     return res;
@@ -386,7 +386,7 @@
                IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
 {
     HRESULT   res;
-    IMoniker *tempMk,*antiMk,*mostRigthMk,*leftMk;
+    IMoniker *tempMk,*antiMk,*rightMostMk,*leftMk;
     IEnumMoniker *enumMoniker;
 
     TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
@@ -405,7 +405,7 @@
         leftMk = iface;
 
     IMoniker_Enum(iface, FALSE, &enumMoniker);
-    IEnumMoniker_Next(enumMoniker, 1, &mostRigthMk, NULL);
+    IEnumMoniker_Next(enumMoniker, 1, &rightMostMk, NULL);
     IEnumMoniker_Release(enumMoniker);
 
     res = CreateAntiMoniker(&antiMk);
@@ -414,11 +414,11 @@
     if (FAILED(res)) return res;
     IMoniker_Release(antiMk);
 
-    res = IMoniker_BindToStorage(mostRigthMk, pbc, tempMk, riid, ppvResult);
+    res = IMoniker_BindToStorage(rightMostMk, pbc, tempMk, riid, ppvResult);
 
     IMoniker_Release(tempMk);
 
-    IMoniker_Release(mostRigthMk);
+    IMoniker_Release(rightMostMk);
 
     if (pmkToLeft)
         IMoniker_Release(leftMk);
@@ -433,7 +433,7 @@
 CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
                IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
 {
-    IMoniker *tempMk,*antiMk,*mostRigthMk,*leftReducedComposedMk,*mostRigthReducedMk;
+    IMoniker *tempMk,*antiMk,*rightMostMk,*leftReducedComposedMk,*rightMostReducedMk;
     IEnumMoniker *enumMoniker;
 
     TRACE("(%p,%p,%d,%p,%p)\n",iface,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
@@ -446,14 +446,14 @@
     if (ppmkToLeft==NULL){
 
         IMoniker_Enum(iface,FALSE,&enumMoniker);
-        IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+        IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
         IEnumMoniker_Release(enumMoniker);
 
         CreateAntiMoniker(&antiMk);
         IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
         IMoniker_Release(antiMk);
 
-        return IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
+        return IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
     }
     else if (*ppmkToLeft==NULL)
 
@@ -463,7 +463,7 @@
 
         /* separate the composite moniker in to left and right moniker */
         IMoniker_Enum(iface,FALSE,&enumMoniker);
-        IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+        IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
         IEnumMoniker_Release(enumMoniker);
 
         CreateAntiMoniker(&antiMk);
@@ -472,11 +472,11 @@
 
         /* If any of the components  reduces itself, the method returns S_OK and passes back a composite */
         /* of the reduced components */
-        if (IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,NULL,&mostRigthReducedMk) &&
-            IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk,&leftReducedComposedMk)
+        if (IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,NULL,&rightMostReducedMk) &&
+            IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk,&leftReducedComposedMk)
            )
 
-            return CreateGenericComposite(leftReducedComposedMk,mostRigthReducedMk,ppmkReduced);
+            return CreateGenericComposite(leftReducedComposedMk,rightMostReducedMk,ppmkReduced);
 
         else{
             /* If no reduction occurred, the method passes back the same moniker and returns MK_S_REDUCED_TO_SELF.*/
@@ -626,7 +626,7 @@
 {
     IRunningObjectTable* rot;
     HRESULT res;
-    IMoniker *tempMk,*antiMk,*mostRigthMk;
+    IMoniker *tempMk,*antiMk,*rightMostMk;
     IEnumMoniker *enumMoniker;
 
     TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
@@ -678,17 +678,17 @@
             else{
 
                 IMoniker_Enum(iface,FALSE,&enumMoniker);
-                IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+                IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
                 IEnumMoniker_Release(enumMoniker);
 
                 res=CreateAntiMoniker(&antiMk);
                 res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
                 IMoniker_Release(antiMk);
 
-                res=IMoniker_IsRunning(mostRigthMk,pbc,tempMk,pmkNewlyRunning);
+                res=IMoniker_IsRunning(rightMostMk,pbc,tempMk,pmkNewlyRunning);
 
                 IMoniker_Release(tempMk);
-                IMoniker_Release(mostRigthMk);
+                IMoniker_Release(rightMostMk);
 
                 return res;
             }
@@ -703,7 +703,7 @@
                IMoniker* pmkToLeft, FILETIME* pCompositeTime)
 {
     HRESULT res;
-    IMoniker *tempMk,*antiMk,*mostRigthMk,*leftMk;
+    IMoniker *tempMk,*antiMk,*rightMostMk,*leftMk;
     IEnumMoniker *enumMoniker;
 
     TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pCompositeTime);
@@ -740,17 +740,17 @@
         leftMk = iface;
 
     IMoniker_Enum(iface, FALSE, &enumMoniker);
-    IEnumMoniker_Next(enumMoniker, 1, &mostRigthMk, NULL);
+    IEnumMoniker_Next(enumMoniker, 1, &rightMostMk, NULL);
     IEnumMoniker_Release(enumMoniker);
 
     res = CreateAntiMoniker(&antiMk);
     res = IMoniker_ComposeWith(leftMk, antiMk, 0, &tempMk);
     IMoniker_Release(antiMk);
 
-    res = IMoniker_GetTimeOfLastChange(mostRigthMk, pbc, tempMk, pCompositeTime);
+    res = IMoniker_GetTimeOfLastChange(rightMostMk, pbc, tempMk, pCompositeTime);
 
     IMoniker_Release(tempMk);
-    IMoniker_Release(mostRigthMk);
+    IMoniker_Release(rightMostMk);
 
     if (pmkToLeft)
         IMoniker_Release(leftMk);
@@ -765,7 +765,7 @@
 CompositeMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
 {
     HRESULT res;
-    IMoniker *tempMk,*antiMk,*mostRigthMk,*tempInvMk,*mostRigthInvMk;
+    IMoniker *tempMk,*antiMk,*rightMostMk,*tempInvMk,*rightMostInvMk;
     IEnumMoniker *enumMoniker;
 
     TRACE("(%p,%p)\n",iface,ppmk);
@@ -794,18 +794,18 @@
     else{
 
         IMoniker_Enum(iface,FALSE,&enumMoniker);
-        IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+        IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
         IEnumMoniker_Release(enumMoniker);
 
-        IMoniker_Inverse(mostRigthMk,&mostRigthInvMk);
+        IMoniker_Inverse(rightMostMk,&rightMostInvMk);
         CompositeMonikerImpl_Inverse(tempMk,&tempInvMk);
 
-        res=CreateGenericComposite(mostRigthInvMk,tempInvMk,ppmk);
+        res=CreateGenericComposite(rightMostInvMk,tempInvMk,ppmk);
 
         IMoniker_Release(tempMk);
-        IMoniker_Release(mostRigthMk);
+        IMoniker_Release(rightMostMk);
         IMoniker_Release(tempInvMk);
-        IMoniker_Release(mostRigthInvMk);
+        IMoniker_Release(rightMostInvMk);
 
         return res;
     }
@@ -1153,13 +1153,13 @@
                IMoniker** ppmkOut)
 {
     IEnumMoniker *enumMoniker;
-    IMoniker *tempMk,*mostRigthMk,*antiMk;
+    IMoniker *tempMk,*rightMostMk,*antiMk;
     /* This method recursively calls IMoniker::ParseDisplayName on the rightmost component of the composite,*/
     /* passing everything else as the pmkToLeft parameter for that call. */
 
     /* get the most right moniker */
     IMoniker_Enum(iface,FALSE,&enumMoniker);
-    IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
+    IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
     IEnumMoniker_Release(enumMoniker);
 
     /* get the left moniker */
@@ -1167,7 +1167,7 @@
     IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
     IMoniker_Release(antiMk);
 
-    return IMoniker_ParseDisplayName(mostRigthMk,pbc,tempMk,pszDisplayName,pchEaten,ppmkOut);
+    return IMoniker_ParseDisplayName(rightMostMk,pbc,tempMk,pszDisplayName,pchEaten,ppmkOut);
 }
 
 /******************************************************************************
