1. I have a drawsquare method that I call 54 times. It simply binds a texture to a square. (And it takes parameters to indicate which picture and which portion (ninth) of the picture I'm using. 2. Prior to calling drawsquare, I have already glTranslated and glRotated so that my face is where I need to be. 3. In drawsquare, I glTranslate to the correct ninth, glRotatef to the correct orientation, and paste ONE texture onto ONE square. 4. When I rotate a side, I set a global angle flag (which I called "a") = -90. I also set certain flags to certain stickers to indicate that they are to abide by the a. I have a data structure (which for me is a 3-dimensional array of pointers) essentially containing 54 flags (and other things I deemed relevant) When I rotate a side I set 21 of these flags to true. I also have three global ints (sx, sy, sz) to indicate the axis of rotation: this axis depends on the side I'm rotating. 5. The rotation stuff just happens as part of the NORMAL EVENT LOOP. If my angle (a) is anything other than zero, I know that I'm in the middle of animating a side. In drawsquare, this boils down to one additional line of code: "if (p->flag) glRotatef (a,sx,sy,sz);" 6. The stickers are moved "instantly" as soon as I press the key. BUT since the angle is initially set to -90, the flagged stickers are moved 90 degrees backward before drawing them, i.e. back to their previous location. Each time the event loop encounters a negative angle, it slightly moves that angle toward zero.