diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index cd40dd3..4614df9 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -82,7 +82,8 @@
 public class LatinIME extends InputMethodService
         implements BaseKeyboardView.OnKeyboardActionListener,
         VoiceInput.UiListener,
-        SharedPreferences.OnSharedPreferenceChangeListener {
+        SharedPreferences.OnSharedPreferenceChangeListener,
+        Tutorial.TutorialListener {
     private static final String TAG = "LatinIME";
     private static final boolean PERF_DEBUG = false;
     static final boolean DEBUG = false;
@@ -162,7 +163,7 @@
     private AlertDialog mOptionsDialog;
     private AlertDialog mVoiceWarningDialog;
 
-    /* package */ KeyboardSwitcher mKeyboardSwitcher;
+    private KeyboardSwitcher mKeyboardSwitcher;
 
     private UserDictionary mUserDictionary;
     private UserBigramDictionary mUserBigramDictionary;
@@ -177,7 +178,7 @@
     private String mSystemLocale;
     private LanguageSwitcher mLanguageSwitcher;
 
-    private StringBuilder mComposing = new StringBuilder();
+    private final StringBuilder mComposing = new StringBuilder();
     private WordComposer mWord = new WordComposer();
     private int mCommittedLength;
     private boolean mPredicting;
@@ -226,21 +227,21 @@
     private long mLastKeyTime;
 
     // Modifier keys state
-    private ModifierKeyState mShiftKeyState = new ModifierKeyState();
-    private ModifierKeyState mSymbolKeyState = new ModifierKeyState();
+    private final ModifierKeyState mShiftKeyState = new ModifierKeyState();
+    private final ModifierKeyState mSymbolKeyState = new ModifierKeyState();
 
     private Tutorial mTutorial;
 
     private AudioManager mAudioManager;
     // Align sound effect volume on music volume
-    private final float FX_VOLUME = -1.0f;
+    private static final float FX_VOLUME = -1.0f;
     private boolean mSilentMode;
 
     /* package */ String mWordSeparators;
     private String mSentenceSeparators;
     private String mSuggestPuncs;
     private VoiceInput mVoiceInput;
-    private VoiceResults mVoiceResults = new VoiceResults();
+    private final VoiceResults mVoiceResults = new VoiceResults();
     private boolean mConfigurationChanging;
 
     // Keeps track of most recently inserted text (multi-character key) for reverting
@@ -248,10 +249,10 @@
     private boolean mRefreshKeyboardRequired;
 
     // For each word, a list of potential replacements, usually from voice.
-    private Map<String, List<CharSequence>> mWordToSuggestions =
+    private final Map<String, List<CharSequence>> mWordToSuggestions =
             new HashMap<String, List<CharSequence>>();
 
-    private ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();
+    private final ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();
 
     private class VoiceResults {
         List<String> candidates;
@@ -319,8 +320,7 @@
                 case MSG_START_TUTORIAL:
                     if (mTutorial == null) {
                         if (mKeyboardSwitcher.isInputViewShown()) {
-                            mTutorial = new Tutorial(
-                                    LatinIME.this, mKeyboardSwitcher.getInputView());
+                            mTutorial = new Tutorial(LatinIME.this, mKeyboardSwitcher);
                             mTutorial.start();
                         } else {
                             // Try again soon if the view is not yet showing
@@ -395,7 +395,7 @@
      * Loads a dictionary or multiple separated dictionary
      * @return returns array of dictionary resource ids
      */
-    /* package */ static int[] getDictionary(Resources res) {
+    public static int[] getDictionary(Resources res) {
         String packageName = LatinIME.class.getPackage().getName();
         XmlResourceParser xrp = res.getXml(R.xml.dictionary);
         ArrayList<Integer> dictionaries = new ArrayList<Integer>();
@@ -2430,20 +2430,22 @@
         mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_TUTORIAL), 500);
     }
 
-    /* package */ void tutorialDone() {
+    // Tutorial.TutorialListener
+    public void onTutorialDone() {
+        sendDownUpKeyEvents(-1); // Inform the setupwizard that tutorial is in last bubble
         mTutorial = null;
     }
 
-    /* package */ void promoteToUserDictionary(String word, int frequency) {
+    public void promoteToUserDictionary(String word, int frequency) {
         if (mUserDictionary.isValidWord(word)) return;
         mUserDictionary.addWord(word, frequency);
     }
 
-    /* package */ WordComposer getCurrentWord() {
+    public WordComposer getCurrentWord() {
         return mWord;
     }
 
-    /* package */ boolean getPopupOn() {
+    public boolean getPopupOn() {
         return mPopupOn;
     }
 
diff --git a/java/src/com/android/inputmethod/latin/Tutorial.java b/java/src/com/android/inputmethod/latin/Tutorial.java
index d3eaf30..f185514 100644
--- a/java/src/com/android/inputmethod/latin/Tutorial.java
+++ b/java/src/com/android/inputmethod/latin/Tutorial.java
@@ -32,20 +32,24 @@
 import android.widget.TextView;
 
 import java.util.ArrayList;
-import java.util.List;
 
 public class Tutorial implements OnTouchListener {
-    
-    private List<Bubble> mBubbles = new ArrayList<Bubble>();
-    private View mInputView;
-    private LatinIME mIme;
-    private int[] mLocation = new int[2];
-    
+
+    public interface TutorialListener {
+        public void onTutorialDone();
+    }
+
+    private final ArrayList<Bubble> mBubbles = new ArrayList<Bubble>();
+    private final KeyboardSwitcher mKeyboardSwitcher;
+    private final View mInputView;
+    private final TutorialListener mListener;
+    private final int[] mLocation = new int[2];
+
     private static final int MSG_SHOW_BUBBLE = 0;
-    
+
     private int mBubbleIndex;
-    
-    Handler mHandler = new Handler() {
+
+    private final Handler mHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -57,20 +61,18 @@
         }
     };
 
-    class Bubble {
-        Drawable bubbleBackground;
-        int x;
-        int y;
-        int width;
-        int gravity;
-        CharSequence text;
-        boolean dismissOnTouch;
-        boolean dismissOnClose;
-        PopupWindow window;
-        TextView textView;
-        View inputView;
-        
-        Bubble(Context context, View inputView,
+    private class Bubble {
+        private final Drawable bubbleBackground;
+        private final int x;
+        private final int y;
+        private final int width;
+        private final int gravity;
+        private final CharSequence text;
+        private final PopupWindow window;
+        private final TextView textView;
+        private final View inputView;
+
+        private Bubble(Context context, View inputView,
                 int backgroundResource, int bx, int by, int textResource1, int textResource2) {
             bubbleBackground = context.getResources().getDrawable(backgroundResource);
             x = bx;
@@ -81,8 +83,6 @@
                 .append(context.getResources().getText(textResource1))
                 .append("\n") 
                 .append(context.getResources().getText(textResource2));
-            this.dismissOnTouch = true;
-            this.dismissOnClose = false;
             this.inputView = inputView;
             window = new PopupWindow(context);
             window.setBackgroundDrawable(null);
@@ -124,7 +124,7 @@
             return l.getHeight();
         }
 
-        void show(int offx, int offy) {
+        private void show(int offx, int offy) {
             int textHeight = chooseSize(window, inputView, text, textView);
             offy -= textView.getPaddingTop() + textHeight;
             if (inputView.getVisibility() == View.VISIBLE 
@@ -144,63 +144,66 @@
                 }
             }
         }
-        
-        void hide() {
+
+        private void hide() {
             if (window.isShowing()) {
                 textView.setOnTouchListener(null);
                 window.dismiss();
             }
         }
-        
-        boolean isShowing() {
+
+        private boolean isShowing() {
             return window.isShowing();
         }
     }
-    
-    public Tutorial(LatinIME ime, LatinKeyboardView inputView) {
+
+    public Tutorial(TutorialListener listener, KeyboardSwitcher keyboardSwitcher) {
+        mListener = listener;
+        mKeyboardSwitcher = keyboardSwitcher;
+        LatinKeyboardView inputView = keyboardSwitcher.getInputView();
+        mInputView = inputView;
         Context context = inputView.getContext();
-        mIme = ime;
         int inputWidth = inputView.getWidth();
         final int x = inputWidth / 20; // Half of 1/10th
+        ArrayList<Bubble> bubbles = mBubbles;
         Bubble bWelcome = new Bubble(context, inputView, 
                 R.drawable.dialog_bubble_step02, x, 0, 
                 R.string.tip_to_open_keyboard, R.string.touch_to_continue);
-        mBubbles.add(bWelcome);
+        bubbles.add(bWelcome);
         Bubble bAccents = new Bubble(context, inputView, 
                 R.drawable.dialog_bubble_step02, x, 0, 
                 R.string.tip_to_view_accents, R.string.touch_to_continue);
-        mBubbles.add(bAccents);
+        bubbles.add(bAccents);
         Bubble b123 = new Bubble(context, inputView, 
                 R.drawable.dialog_bubble_step07, x, 0, 
                 R.string.tip_to_open_symbols, R.string.touch_to_continue);
-        mBubbles.add(b123);
+        bubbles.add(b123);
         Bubble bABC = new Bubble(context, inputView, 
                 R.drawable.dialog_bubble_step07, x, 0, 
                 R.string.tip_to_close_symbols, R.string.touch_to_continue);
-        mBubbles.add(bABC);
+        bubbles.add(bABC);
         Bubble bSettings = new Bubble(context, inputView, 
                 R.drawable.dialog_bubble_step07, x, 0, 
                 R.string.tip_to_launch_settings, R.string.touch_to_continue);
-        mBubbles.add(bSettings);
+        bubbles.add(bSettings);
         Bubble bDone = new Bubble(context, inputView, 
                 R.drawable.dialog_bubble_step02, x, 0, 
                 R.string.tip_to_start_typing, R.string.touch_to_finish);
-        mBubbles.add(bDone);
-        mInputView = inputView;
+        bubbles.add(bDone);
     }
-    
-    void start() {
+
+    public void start() {
         mInputView.getLocationInWindow(mLocation);
         mBubbleIndex = -1;
         mInputView.setOnTouchListener(this);
         next();
     }
 
-    boolean next() {
+    private void next() {
         if (mBubbleIndex >= 0) {
             // If the bubble is not yet showing, don't move to the next.
             if (!mBubbles.get(mBubbleIndex).isShowing()) {
-                return true;
+                return;
             }
             // Hide all previous bubbles as well, as they may have had a delayed show
             for (int i = 0; i <= mBubbleIndex; i++) {
@@ -210,26 +213,25 @@
         mBubbleIndex++;
         if (mBubbleIndex >= mBubbles.size()) {
             mInputView.setOnTouchListener(null);
-            mIme.sendDownUpKeyEvents(-1); // Inform the setupwizard that tutorial is in last bubble
-            mIme.tutorialDone();
-            return false;
+            mListener.onTutorialDone();
+            return;
         }
         if (mBubbleIndex == 3 || mBubbleIndex == 4) {
-            mIme.mKeyboardSwitcher.toggleSymbols();
+            mKeyboardSwitcher.toggleSymbols();
         }
         mHandler.sendMessageDelayed(
                 mHandler.obtainMessage(MSG_SHOW_BUBBLE, mBubbles.get(mBubbleIndex)), 500);
-        return true;
+        return;
     }
-    
-    void hide() {
-        for (int i = 0; i < mBubbles.size(); i++) {
-            mBubbles.get(i).hide();
+
+    private void hide() {
+        for (Bubble bubble : mBubbles) {
+            bubble.hide();
         }
         mInputView.setOnTouchListener(null);
     }
 
-    boolean close() {
+    public boolean close() {
         mHandler.removeMessages(MSG_SHOW_BUBBLE);
         hide();
         return true;
