diff --git a/tutorials/NotepadCodeLab/Notepadv1/Android.mk b/tutorials/NotepadCodeLab/Notepadv1/Android.mk
new file mode 100644
index 0000000..60beb2c
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv1/Android.mk
@@ -0,0 +1,31 @@
+#
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# Only build apk if this package is added to CUSTOM_MODLUES in buildspec.mk
+LOCAL_MODULE_TAGS := optional
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := Notepadv1
+
+# Make the app build against the current SDK
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml
index 33f30da..99023fe 100755
--- a/tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml
+++ b/tutorials/NotepadCodeLab/Notepadv1/AndroidManifest.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.demo.notepad1">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.demo.notepad1">
     <application android:icon="@drawable/icon">
         <activity android:name=".Notepadv1" android:label="@string/app_name">
             <intent-filter>
diff --git a/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java
index 43e7a77..df73f42 100755
--- a/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java
+++ b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/Notepadv1.java
@@ -22,8 +22,8 @@
 import android.view.MenuItem;
 
 public class Notepadv1 extends Activity {
-	private int mNoteNumber = 1;
-    
+    private int mNoteNumber = 1;
+
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
diff --git a/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java
index 6f85bbd..a3295d6 100755
--- a/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java
+++ b/tutorials/NotepadCodeLab/Notepadv1/src/com/android/demo/notepad1/NotesDbAdapter.java
@@ -43,13 +43,13 @@
     private static final String TAG = "NotesDbAdapter";
     private DatabaseHelper mDbHelper;
     private SQLiteDatabase mDb;
-    
+
     /**
      * Database creation sql statement
      */
     private static final String DATABASE_CREATE =
-            "create table notes (_id integer primary key autoincrement, "
-                    + "title text not null, body text not null);";
+        "create table notes (_id integer primary key autoincrement, "
+        + "title text not null, body text not null);";
 
     private static final String DATABASE_NAME = "data";
     private static final String DATABASE_TABLE = "notes";
@@ -102,7 +102,7 @@
         mDb = mDbHelper.getWritableDatabase();
         return this;
     }
-    
+
     public void close() {
         mDbHelper.close();
     }
@@ -158,9 +158,9 @@
 
         Cursor mCursor =
 
-                mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
-                        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
-                        null, null, null, null);
+            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
+                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
+                    null, null, null, null);
         if (mCursor != null) {
             mCursor.moveToFirst();
         }
diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/Android.mk b/tutorials/NotepadCodeLab/Notepadv1Solution/Android.mk
index 5375031..35bc577 100644
--- a/tutorials/NotepadCodeLab/Notepadv1Solution/Android.mk
+++ b/tutorials/NotepadCodeLab/Notepadv1Solution/Android.mk
@@ -17,6 +17,7 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
+# Only build apk if this package is added to CUSTOM_MODLUES in buildspec.mk
 LOCAL_MODULE_TAGS := optional
 
 # Only compile source java files in this apk.
diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml b/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml
index 6b1a65b..f28a41b 100755
--- a/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml
+++ b/tutorials/NotepadCodeLab/Notepadv1Solution/res/layout/notes_row.xml
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<TextView android:id="@+id/text1"
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<TextView android:id="@+id/text1" xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
-    android:layout_height="wrap_content"/>
\ No newline at end of file
+    android:layout_height="wrap_content"/>
diff --git a/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java
index 6f85bbd..a3295d6 100755
--- a/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java
+++ b/tutorials/NotepadCodeLab/Notepadv1Solution/src/com/android/demo/notepad1/NotesDbAdapter.java
@@ -43,13 +43,13 @@
     private static final String TAG = "NotesDbAdapter";
     private DatabaseHelper mDbHelper;
     private SQLiteDatabase mDb;
-    
+
     /**
      * Database creation sql statement
      */
     private static final String DATABASE_CREATE =
-            "create table notes (_id integer primary key autoincrement, "
-                    + "title text not null, body text not null);";
+        "create table notes (_id integer primary key autoincrement, "
+        + "title text not null, body text not null);";
 
     private static final String DATABASE_NAME = "data";
     private static final String DATABASE_TABLE = "notes";
@@ -102,7 +102,7 @@
         mDb = mDbHelper.getWritableDatabase();
         return this;
     }
-    
+
     public void close() {
         mDbHelper.close();
     }
@@ -158,9 +158,9 @@
 
         Cursor mCursor =
 
-                mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
-                        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
-                        null, null, null, null);
+            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
+                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
+                    null, null, null, null);
         if (mCursor != null) {
             mCursor.moveToFirst();
         }
diff --git a/tutorials/NotepadCodeLab/Notepadv2/Android.mk b/tutorials/NotepadCodeLab/Notepadv2/Android.mk
new file mode 100644
index 0000000..77a2b47
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv2/Android.mk
@@ -0,0 +1,31 @@
+#
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# Only build apk if this package is added to CUSTOM_MODLUES in buildspec.mk
+LOCAL_MODULE_TAGS := optional
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := Notepadv2
+
+# Make the app build against the current SDK
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java b/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java
index abfc538..c038180 100755
--- a/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java
+++ b/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java
@@ -20,9 +20,11 @@
 import android.content.Intent;
 import android.database.Cursor;
 import android.os.Bundle;
+import android.view.ContextMenu;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
 import android.widget.ListView;
 import android.widget.SimpleCursorAdapter;
 
diff --git a/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java
index 5bf51b1..50994ae 100755
--- a/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java
+++ b/tutorials/NotepadCodeLab/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java
@@ -43,13 +43,13 @@
     private static final String TAG = "NotesDbAdapter";
     private DatabaseHelper mDbHelper;
     private SQLiteDatabase mDb;
-    
+
     /**
      * Database creation sql statement
      */
     private static final String DATABASE_CREATE =
-            "create table notes (_id integer primary key autoincrement, "
-                    + "title text not null, body text not null);";
+        "create table notes (_id integer primary key autoincrement, "
+        + "title text not null, body text not null);";
 
     private static final String DATABASE_NAME = "data";
     private static final String DATABASE_TABLE = "notes";
@@ -102,7 +102,7 @@
         mDb = mDbHelper.getWritableDatabase();
         return this;
     }
-    
+
     public void close() {
         mDbHelper.close();
     }
@@ -158,9 +158,9 @@
 
         Cursor mCursor =
 
-                mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
-                        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
-                        null, null, null, null);
+            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
+                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
+                    null, null, null, null);
         if (mCursor != null) {
             mCursor.moveToFirst();
         }
diff --git a/tutorials/NotepadCodeLab/Notepadv2Solution/Android.mk b/tutorials/NotepadCodeLab/Notepadv2Solution/Android.mk
index 8e48351..63961a3 100644
--- a/tutorials/NotepadCodeLab/Notepadv2Solution/Android.mk
+++ b/tutorials/NotepadCodeLab/Notepadv2Solution/Android.mk
@@ -17,6 +17,7 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
+# Only build apk if this package is added to CUSTOM_MODLUES in buildspec.mk
 LOCAL_MODULE_TAGS := optional
 
 # Only compile source java files in this apk.
diff --git a/tutorials/NotepadCodeLab/Notepadv2Solution/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv2Solution/AndroidManifest.xml
index dbfc9d0..b86a741 100755
--- a/tutorials/NotepadCodeLab/Notepadv2Solution/AndroidManifest.xml
+++ b/tutorials/NotepadCodeLab/Notepadv2Solution/AndroidManifest.xml
@@ -7,6 +7,6 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-    	<activity android:name=".NoteEdit"></activity>
+        <activity android:name=".NoteEdit" />
     </application>
 </manifest> 
\ No newline at end of file
diff --git a/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NoteEdit.java b/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NoteEdit.java
index 6c5e664..8c9dccc 100755
--- a/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NoteEdit.java
+++ b/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NoteEdit.java
@@ -9,7 +9,7 @@
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.savedInstanceState
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
@@ -25,7 +25,7 @@
 
 public class NoteEdit extends Activity {
 
-	private EditText mTitleText;
+    private EditText mTitleText;
     private EditText mBodyText;
     private Long mRowId;
 
@@ -33,19 +33,19 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.note_edit);
-       
+
         mTitleText = (EditText) findViewById(R.id.title);
         mBodyText = (EditText) findViewById(R.id.body);
-      
+
         Button confirmButton = (Button) findViewById(R.id.confirm);
-       
+
         mRowId = null;
         Bundle extras = getIntent().getExtras();
         if (extras != null) {
             String title = extras.getString(NotesDbAdapter.KEY_TITLE);
             String body = extras.getString(NotesDbAdapter.KEY_BODY);
             mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
-          
+
             if (title != null) {
                 mTitleText.setText(title);
             }
@@ -53,24 +53,24 @@
                 mBodyText.setText(body);
             }
         }
-       
+
         confirmButton.setOnClickListener(new View.OnClickListener() {
 
             public void onClick(View view) {
                 Bundle bundle = new Bundle();
-               
+
                 bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
                 bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
                 if (mRowId != null) {
                     bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
                 }
-                
+
                 Intent mIntent = new Intent();
                 mIntent.putExtras(bundle);
                 setResult(RESULT_OK, mIntent);
                 finish();
             }
-            
+
         });
     }
 }
diff --git a/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/Notepadv2.java b/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/Notepadv2.java
index 1b33982..c65806b 100755
--- a/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/Notepadv2.java
+++ b/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/Notepadv2.java
@@ -32,13 +32,13 @@
 public class Notepadv2 extends ListActivity {
     private static final int ACTIVITY_CREATE=0;
     private static final int ACTIVITY_EDIT=1;
-    
+
     private static final int INSERT_ID = Menu.FIRST;
     private static final int DELETE_ID = Menu.FIRST + 1;
 
     private NotesDbAdapter mDbHelper;
     private Cursor mNotesCursor;
-    
+
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -49,68 +49,69 @@
         fillData();
         registerForContextMenu(getListView());
     }
-    
+
     private void fillData() {
         // Get all of the rows from the database and create the item list
         mNotesCursor = mDbHelper.fetchAllNotes();
         startManagingCursor(mNotesCursor);
-        
+
         // Create an array to specify the fields we want to display in the list (only TITLE)
         String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
-        
+
         // and an array of the fields we want to bind those fields to (in this case just text1)
         int[] to = new int[]{R.id.text1};
-        
+
         // Now create a simple cursor adapter and set it to display
         SimpleCursorAdapter notes = 
-        	    new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to);
+            new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to);
         setListAdapter(notes);
     }
-    
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
-        menu.add(0, INSERT_ID,0, R.string.menu_insert);
+        menu.add(0, INSERT_ID, 0, R.string.menu_insert);
         return true;
     }
-    
+
     @Override
     public boolean onMenuItemSelected(int featureId, MenuItem item) {
         switch(item.getItemId()) {
-        case INSERT_ID:
-            createNote();
-            return true;
-	    }        
+            case INSERT_ID:
+                createNote();
+                return true;
+        }
+
         return super.onMenuItemSelected(featureId, item);
     }
 
     @Override
-	public void onCreateContextMenu(ContextMenu menu, View v,
-			ContextMenuInfo menuInfo) {
-		super.onCreateContextMenu(menu, v, menuInfo);
+    public void onCreateContextMenu(ContextMenu menu, View v,
+            ContextMenuInfo menuInfo) {
+        super.onCreateContextMenu(menu, v, menuInfo);
         menu.add(0, DELETE_ID, 0, R.string.menu_delete);
-	}
+    }
 
     @Override
-	public boolean onContextItemSelected(MenuItem item) {
-		switch(item.getItemId()) {
-    	case DELETE_ID:
-    		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
-	        mDbHelper.deleteNote(info.id);
-	        fillData();
-	        return true;
-		}
-		return super.onContextItemSelected(item);
-	}
-
-	private void createNote() {
-    	Intent i = new Intent(this, NoteEdit.class);
-    	 startActivityForResult(i, ACTIVITY_CREATE);
+    public boolean onContextItemSelected(MenuItem item) {
+        switch(item.getItemId()) {
+            case DELETE_ID:
+                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
+                mDbHelper.deleteNote(info.id);
+                fillData();
+                return true;
+        }
+        return super.onContextItemSelected(item);
     }
-    
+
+    private void createNote() {
+        Intent i = new Intent(this, NoteEdit.class);
+        startActivityForResult(i, ACTIVITY_CREATE);
+    }
+
     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
-    	super.onListItemClick(l, v, position, id);
+        super.onListItemClick(l, v, position, id);
         Cursor c = mNotesCursor;
         c.moveToPosition(position);
         Intent i = new Intent(this, NoteEdit.class);
@@ -127,21 +128,21 @@
         super.onActivityResult(requestCode, resultCode, intent);
         Bundle extras = intent.getExtras();
         switch(requestCode) {
-        case ACTIVITY_CREATE:
-            String title = extras.getString(NotesDbAdapter.KEY_TITLE);
-            String body = extras.getString(NotesDbAdapter.KEY_BODY);
-            mDbHelper.createNote(title, body);
-            fillData();
-            break;
-        case ACTIVITY_EDIT:
-            Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
-            if (rowId != null) {
-                String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
-                String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
-                mDbHelper.updateNote(rowId, editTitle, editBody);
-            }
-            fillData();
-            break;
+            case ACTIVITY_CREATE:
+                String title = extras.getString(NotesDbAdapter.KEY_TITLE);
+                String body = extras.getString(NotesDbAdapter.KEY_BODY);
+                mDbHelper.createNote(title, body);
+                fillData();
+                break;
+            case ACTIVITY_EDIT:
+                Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+                if (rowId != null) {
+                    String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
+                    String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
+                    mDbHelper.updateNote(rowId, editTitle, editBody);
+                }
+                fillData();
+                break;
         }
     }
 }
diff --git a/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NotesDbAdapter.java
index 5bf51b1..50994ae 100755
--- a/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NotesDbAdapter.java
+++ b/tutorials/NotepadCodeLab/Notepadv2Solution/src/com/android/demo/notepad2/NotesDbAdapter.java
@@ -43,13 +43,13 @@
     private static final String TAG = "NotesDbAdapter";
     private DatabaseHelper mDbHelper;
     private SQLiteDatabase mDb;
-    
+
     /**
      * Database creation sql statement
      */
     private static final String DATABASE_CREATE =
-            "create table notes (_id integer primary key autoincrement, "
-                    + "title text not null, body text not null);";
+        "create table notes (_id integer primary key autoincrement, "
+        + "title text not null, body text not null);";
 
     private static final String DATABASE_NAME = "data";
     private static final String DATABASE_TABLE = "notes";
@@ -102,7 +102,7 @@
         mDb = mDbHelper.getWritableDatabase();
         return this;
     }
-    
+
     public void close() {
         mDbHelper.close();
     }
@@ -158,9 +158,9 @@
 
         Cursor mCursor =
 
-                mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
-                        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
-                        null, null, null, null);
+            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
+                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
+                    null, null, null, null);
         if (mCursor != null) {
             mCursor.moveToFirst();
         }
diff --git a/tutorials/NotepadCodeLab/Notepadv3/Android.mk b/tutorials/NotepadCodeLab/Notepadv3/Android.mk
new file mode 100644
index 0000000..c9f319e
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/Android.mk
@@ -0,0 +1,31 @@
+#
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# Only build apk if this package is added to CUSTOM_MODLUES in buildspec.mk
+LOCAL_MODULE_TAGS := optional
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := Notepadv3
+
+# Make the app build against the current SDK
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml
index adb07ff..06e1645 100755
--- a/tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml
+++ b/tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml
@@ -7,6 +7,6 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".NoteEdit"/>
+        <activity android:name=".NoteEdit" />
     </application>
 </manifest> 
\ No newline at end of file
diff --git a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java
index af3a234..dee7ff4 100755
--- a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java
+++ b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java
@@ -25,7 +25,7 @@
 
 public class NoteEdit extends Activity {
 
-	private EditText mTitleText;
+    private EditText mTitleText;
     private EditText mBodyText;
     private Long mRowId;
 
@@ -33,19 +33,19 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.note_edit);
-       
+
         mTitleText = (EditText) findViewById(R.id.title);
         mBodyText = (EditText) findViewById(R.id.body);
-      
+
         Button confirmButton = (Button) findViewById(R.id.confirm);
-       
+
         mRowId = null;
         Bundle extras = getIntent().getExtras();
         if (extras != null) {
             String title = extras.getString(NotesDbAdapter.KEY_TITLE);
             String body = extras.getString(NotesDbAdapter.KEY_BODY);
             mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
-          
+
             if (title != null) {
                 mTitleText.setText(title);
             }
@@ -53,24 +53,24 @@
                 mBodyText.setText(body);
             }
         }
-       
+
         confirmButton.setOnClickListener(new View.OnClickListener() {
 
             public void onClick(View view) {
                 Bundle bundle = new Bundle();
-               
+
                 bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
                 bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
                 if (mRowId != null) {
                     bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
                 }
-               
+
                 Intent mIntent = new Intent();
                 mIntent.putExtras(bundle);
                 setResult(RESULT_OK, mIntent);
                 finish();
             }
-          
+
         });
     }
 }
diff --git a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java
index f50f371..0ed8ed6 100755
--- a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java
+++ b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2008 Google Inc.
  *
- * Licensed under the Apache License, Version 2.0 (the "License")savedInstanceState;
+ * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -32,13 +32,13 @@
 public class Notepadv3 extends ListActivity {
     private static final int ACTIVITY_CREATE=0;
     private static final int ACTIVITY_EDIT=1;
-    
+
     private static final int INSERT_ID = Menu.FIRST;
     private static final int DELETE_ID = Menu.FIRST + 1;
 
     private NotesDbAdapter mDbHelper;
     private Cursor mNotesCursor;
-    
+
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -49,24 +49,24 @@
         fillData();
         registerForContextMenu(getListView());
     }
-    
+
     private void fillData() {
         // Get all of the rows from the database and create the item list
         mNotesCursor = mDbHelper.fetchAllNotes();
         startManagingCursor(mNotesCursor);
-        
+
         // Create an array to specify the fields we want to display in the list (only TITLE)
         String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
-        
+
         // and an array of the fields we want to bind those fields to (in this case just text1)
         int[] to = new int[]{R.id.text1};
-        
+
         // Now create a simple cursor adapter and set it to display
         SimpleCursorAdapter notes = 
-        	    new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to);
+            new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to);
         setListAdapter(notes);
     }
-    
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
@@ -77,38 +77,38 @@
     @Override
     public boolean onMenuItemSelected(int featureId, MenuItem item) {
         switch(item.getItemId()) {
-        case INSERT_ID:
-            createNote();
-            return true;
+            case INSERT_ID:
+                createNote();
+                return true;
         }
-       
+
         return super.onMenuItemSelected(featureId, item);
     }
-	
-    @Override
-	public void onCreateContextMenu(ContextMenu menu, View v,
-			ContextMenuInfo menuInfo) {
-		super.onCreateContextMenu(menu, v, menuInfo);
-        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
-	}
 
     @Override
-	public boolean onContextItemSelected(MenuItem item) {
-		switch(item.getItemId()) {
-    	case DELETE_ID:
-    		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
-	        mDbHelper.deleteNote(info.id);
-	        fillData();
-	        return true;
-		}
-		return super.onContextItemSelected(item);
-	}
-	
+    public void onCreateContextMenu(ContextMenu menu, View v,
+            ContextMenuInfo menuInfo) {
+        super.onCreateContextMenu(menu, v, menuInfo);
+        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
+    }
+
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+        switch(item.getItemId()) {
+            case DELETE_ID:
+                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
+                mDbHelper.deleteNote(info.id);
+                fillData();
+                return true;
+        }
+        return super.onContextItemSelected(item);
+    }
+
     private void createNote() {
         Intent i = new Intent(this, NoteEdit.class);
         startActivityForResult(i, ACTIVITY_CREATE);
     }
-    
+
     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
         super.onListItemClick(l, v, position, id);
@@ -117,9 +117,9 @@
         Intent i = new Intent(this, NoteEdit.class);
         i.putExtra(NotesDbAdapter.KEY_ROWID, id);
         i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
-        		c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
+                c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
         i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
-        		c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
+                c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
         startActivityForResult(i, ACTIVITY_EDIT);
     }
 
@@ -128,21 +128,21 @@
         super.onActivityResult(requestCode, resultCode, intent);
         Bundle extras = intent.getExtras();
         switch(requestCode) {
-        case ACTIVITY_CREATE:
-            String title = extras.getString(NotesDbAdapter.KEY_TITLE);
-            String body = extras.getString(NotesDbAdapter.KEY_BODY);
-            mDbHelper.createNote(title, body);
-            fillData();
-            break;
-        case ACTIVITY_EDIT:
-            Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
-            if (rowId != null) {
-                String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
-                String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
-                mDbHelper.updateNote(rowId, editTitle, editBody);
-            }
-            fillData();
-            break;
+            case ACTIVITY_CREATE:
+                String title = extras.getString(NotesDbAdapter.KEY_TITLE);
+                String body = extras.getString(NotesDbAdapter.KEY_BODY);
+                mDbHelper.createNote(title, body);
+                fillData();
+                break;
+            case ACTIVITY_EDIT:
+                Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+                if (rowId != null) {
+                    String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
+                    String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
+                    mDbHelper.updateNote(rowId, editTitle, editBody);
+                }
+                fillData();
+                break;
         }
     }
 }
diff --git a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java
index 61ad046..38ee1c0 100755
--- a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java
+++ b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java
@@ -43,13 +43,13 @@
     private static final String TAG = "NotesDbAdapter";
     private DatabaseHelper mDbHelper;
     private SQLiteDatabase mDb;
-    
+
     /**
      * Database creation sql statement
      */
     private static final String DATABASE_CREATE =
-            "create table notes (_id integer primary key autoincrement, "
-                    + "title text not null, body text not null);";
+        "create table notes (_id integer primary key autoincrement, "
+        + "title text not null, body text not null);";
 
     private static final String DATABASE_NAME = "data";
     private static final String DATABASE_TABLE = "notes";
@@ -102,7 +102,7 @@
         mDb = mDbHelper.getWritableDatabase();
         return this;
     }
-    
+
     public void close() {
         mDbHelper.close();
     }
@@ -158,9 +158,9 @@
 
         Cursor mCursor =
 
-                mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
-                        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
-                        null, null, null, null);
+            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
+                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
+                    null, null, null, null);
         if (mCursor != null) {
             mCursor.moveToFirst();
         }
diff --git a/tutorials/NotepadCodeLab/Notepadv3Solution/Android.mk b/tutorials/NotepadCodeLab/Notepadv3Solution/Android.mk
index 177164e..d8a6ea5 100644
--- a/tutorials/NotepadCodeLab/Notepadv3Solution/Android.mk
+++ b/tutorials/NotepadCodeLab/Notepadv3Solution/Android.mk
@@ -17,6 +17,7 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
+# Only build apk if this package is added to CUSTOM_MODLUES in buildspec.mk
 LOCAL_MODULE_TAGS := optional
 
 # Only compile source java files in this apk.
diff --git a/tutorials/NotepadCodeLab/Notepadv3Solution/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv3Solution/AndroidManifest.xml
index adb07ff..06e1645 100755
--- a/tutorials/NotepadCodeLab/Notepadv3Solution/AndroidManifest.xml
+++ b/tutorials/NotepadCodeLab/Notepadv3Solution/AndroidManifest.xml
@@ -7,6 +7,6 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".NoteEdit"/>
+        <activity android:name=".NoteEdit" />
     </application>
 </manifest> 
\ No newline at end of file
diff --git a/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NoteEdit.java b/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NoteEdit.java
index f5eb6c4..eabb07a 100755
--- a/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NoteEdit.java
+++ b/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NoteEdit.java
@@ -25,7 +25,7 @@
 
 public class NoteEdit extends Activity {
 
-	private EditText mTitleText;
+    private EditText mTitleText;
     private EditText mBodyText;
     private Long mRowId;
     private NotesDbAdapter mDbHelper;
@@ -36,63 +36,62 @@
         mDbHelper = new NotesDbAdapter(this);
         mDbHelper.open();
         setContentView(R.layout.note_edit);
-        
-       
+
+
         mTitleText = (EditText) findViewById(R.id.title);
         mBodyText = (EditText) findViewById(R.id.body);
-      
+
         Button confirmButton = (Button) findViewById(R.id.confirm);
-       
         mRowId = (savedInstanceState == null) ? null :
             (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
 		if (mRowId == null) {
-			Bundle extras = getIntent().getExtras();            
-			mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) 
+			Bundle extras = getIntent().getExtras();
+			mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
 									: null;
 		}
 
 		populateFields();
-		
+
         confirmButton.setOnClickListener(new View.OnClickListener() {
 
-        	public void onClick(View view) {
-        	    setResult(RESULT_OK);
-        	    finish();
-        	}
-          
+            public void onClick(View view) {
+                setResult(RESULT_OK);
+                finish();
+            }
+
         });
     }
-    
+
     private void populateFields() {
         if (mRowId != null) {
             Cursor note = mDbHelper.fetchNote(mRowId);
             startManagingCursor(note);
             mTitleText.setText(note.getString(
-    	            note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
+                    note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
             mBodyText.setText(note.getString(
                     note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
         }
     }
-    
+
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         saveState();
         outState.putSerializable(NotesDbAdapter.KEY_ROWID, mRowId);
     }
-    
+
     @Override
     protected void onPause() {
         super.onPause();
         saveState();
     }
-    
+
     @Override
     protected void onResume() {
         super.onResume();
         populateFields();
     }
-    
+
     private void saveState() {
         String title = mTitleText.getText().toString();
         String body = mBodyText.getText().toString();
@@ -106,5 +105,5 @@
             mDbHelper.updateNote(mRowId, title, body);
         }
     }
-    
+
 }
diff --git a/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/Notepadv3.java b/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/Notepadv3.java
index 7f99037..1e15694 100755
--- a/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/Notepadv3.java
+++ b/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/Notepadv3.java
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2008 Google Inc.
  *
- * Licensed under the Apache License, Version 2.0 (the "License")savedInstanceState;
+ * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -32,12 +32,12 @@
 public class Notepadv3 extends ListActivity {
     private static final int ACTIVITY_CREATE=0;
     private static final int ACTIVITY_EDIT=1;
-    
+
     private static final int INSERT_ID = Menu.FIRST;
     private static final int DELETE_ID = Menu.FIRST + 1;
 
     private NotesDbAdapter mDbHelper;
-    
+
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -48,23 +48,23 @@
         fillData();
         registerForContextMenu(getListView());
     }
-    
+
     private void fillData() {
         Cursor notesCursor = mDbHelper.fetchAllNotes();
         startManagingCursor(notesCursor);
-        
+
         // Create an array to specify the fields we want to display in the list (only TITLE)
         String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
-        
+
         // and an array of the fields we want to bind those fields to (in this case just text1)
         int[] to = new int[]{R.id.text1};
-        
+
         // Now create a simple cursor adapter and set it to display
         SimpleCursorAdapter notes = 
-        	    new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to);
+            new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to);
         setListAdapter(notes);
     }
-    
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
@@ -75,38 +75,38 @@
     @Override
     public boolean onMenuItemSelected(int featureId, MenuItem item) {
         switch(item.getItemId()) {
-        case INSERT_ID:
-            createNote();
-            return true;
+            case INSERT_ID:
+                createNote();
+                return true;
         }
-       
+
         return super.onMenuItemSelected(featureId, item);
     }
-	
-    @Override
-	public void onCreateContextMenu(ContextMenu menu, View v,
-			ContextMenuInfo menuInfo) {
-		super.onCreateContextMenu(menu, v, menuInfo);
-        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
-	}
 
     @Override
-	public boolean onContextItemSelected(MenuItem item) {
-		switch(item.getItemId()) {
-    	case DELETE_ID:
-    		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
-	        mDbHelper.deleteNote(info.id);
-	        fillData();
-	        return true;
-		}
-		return super.onContextItemSelected(item);
-	}
-	
+    public void onCreateContextMenu(ContextMenu menu, View v,
+            ContextMenuInfo menuInfo) {
+        super.onCreateContextMenu(menu, v, menuInfo);
+        menu.add(0, DELETE_ID, 0, R.string.menu_delete);
+    }
+
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+        switch(item.getItemId()) {
+            case DELETE_ID:
+                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
+                mDbHelper.deleteNote(info.id);
+                fillData();
+                return true;
+        }
+        return super.onContextItemSelected(item);
+    }
+
     private void createNote() {
         Intent i = new Intent(this, NoteEdit.class);
         startActivityForResult(i, ACTIVITY_CREATE);
     }
-    
+
     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
         super.onListItemClick(l, v, position, id);
@@ -116,8 +116,7 @@
     }
 
     @Override
-    protected void onActivityResult(int requestCode, int resultCode, 
-                                    Intent intent) {
+    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
         super.onActivityResult(requestCode, resultCode, intent);
         fillData();
     }
diff --git a/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NotesDbAdapter.java
index 61ad046..38ee1c0 100755
--- a/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NotesDbAdapter.java
+++ b/tutorials/NotepadCodeLab/Notepadv3Solution/src/com/android/demo/notepad3/NotesDbAdapter.java
@@ -43,13 +43,13 @@
     private static final String TAG = "NotesDbAdapter";
     private DatabaseHelper mDbHelper;
     private SQLiteDatabase mDb;
-    
+
     /**
      * Database creation sql statement
      */
     private static final String DATABASE_CREATE =
-            "create table notes (_id integer primary key autoincrement, "
-                    + "title text not null, body text not null);";
+        "create table notes (_id integer primary key autoincrement, "
+        + "title text not null, body text not null);";
 
     private static final String DATABASE_NAME = "data";
     private static final String DATABASE_TABLE = "notes";
@@ -102,7 +102,7 @@
         mDb = mDbHelper.getWritableDatabase();
         return this;
     }
-    
+
     public void close() {
         mDbHelper.close();
     }
@@ -158,9 +158,9 @@
 
         Cursor mCursor =
 
-                mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
-                        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
-                        null, null, null, null);
+            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
+                    KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
+                    null, null, null, null);
         if (mCursor != null) {
             mCursor.moveToFirst();
         }
