Put nano generated code into nano package, unless option javanano_use_deprecated_package is set.

Also fix the behaior while java_package is set to empty.
diff --git a/android-interop-testing/app/build.gradle b/android-interop-testing/app/build.gradle
index f0f95db..b51cc98 100644
--- a/android-interop-testing/app/build.gradle
+++ b/android-interop-testing/app/build.gradle
@@ -33,7 +33,7 @@
     }
     plugins {
         grpc {
-            artifact = 'io.grpc:protoc-gen-grpc-java:0.9.0-SNAPSHOT'
+            artifact = 'io.grpc:protoc-gen-grpc-java:0.10.0-SNAPSHOT'
         }
     }
     generateProtoTasks {
@@ -64,10 +64,10 @@
     compile 'com.squareup.okhttp:okhttp:2.2.0'
     testCompile 'junit:junit:4.12'
     // You need to build grpc-java to obtain these libraries below.
-    compile 'io.grpc:grpc-core:0.9.0-SNAPSHOT'
-    compile 'io.grpc:grpc-protobuf-nano:0.9.0-SNAPSHOT'
-    compile 'io.grpc:grpc-okhttp:0.9.0-SNAPSHOT'
-    compile 'io.grpc:grpc-stub:0.9.0-SNAPSHOT'
-    compile 'io.grpc:grpc-testing:0.9.0-SNAPSHOT'
+    compile 'io.grpc:grpc-core:0.10.0-SNAPSHOT'
+    compile 'io.grpc:grpc-protobuf-nano:0.10.0-SNAPSHOT'
+    compile 'io.grpc:grpc-okhttp:0.10.0-SNAPSHOT'
+    compile 'io.grpc:grpc-stub:0.10.0-SNAPSHOT'
+    compile 'io.grpc:grpc-testing:0.10.0-SNAPSHOT'
     compile 'javax.annotation:javax.annotation-api:1.2'
 }
diff --git a/android-interop-testing/app/src/main/java/io/grpc/android/integrationtest/InteropTester.java b/android-interop-testing/app/src/main/java/io/grpc/android/integrationtest/InteropTester.java
index 3824617..b887d33 100644
--- a/android-interop-testing/app/src/main/java/io/grpc/android/integrationtest/InteropTester.java
+++ b/android-interop-testing/app/src/main/java/io/grpc/android/integrationtest/InteropTester.java
@@ -60,6 +60,8 @@
 import io.grpc.android.integrationtest.nano.Messages.StreamingInputCallResponse;
 import io.grpc.android.integrationtest.nano.Messages.StreamingOutputCallRequest;
 import io.grpc.android.integrationtest.nano.Messages.StreamingOutputCallResponse;
+import io.grpc.android.integrationtest.nano.TestServiceGrpc;
+import io.grpc.android.integrationtest.nano.UnimplementedServiceGrpc;
 import io.grpc.okhttp.OkHttpChannelBuilder;
 import io.grpc.stub.StreamObserver;
 import io.grpc.testing.StreamRecorder;
diff --git a/compiler/build.gradle b/compiler/build.gradle
index 3af17a6..4625292 100644
--- a/compiler/build.gradle
+++ b/compiler/build.gradle
@@ -208,7 +208,7 @@
 
 test.dependsOn('testGolden', 'testNanoGolden')
 
-def configureTestTask(Task task, String suffix) {
+def configureTestTask(Task task, String suffix, String extraPackage) {
   task.dependsOn "generateTest${suffix}Proto"
   if (osdetector.os != 'windows') {
     task.executable "diff"
@@ -217,11 +217,11 @@
   }
   // File isn't found on Windows if last slash is forward-slash
   def slash = System.getProperty("file.separator")
-  task.args "$buildDir/generated/source/proto/test${suffix}/grpc/io/grpc/testing/integration${slash}TestServiceGrpc.java",
+  task.args "$buildDir/generated/source/proto/test${suffix}/grpc/io/grpc/testing/integration${extraPackage}${slash}TestServiceGrpc.java",
        "$projectDir/src/test/golden/TestService${suffix}.java.txt"
 }
 
 task testGolden(type: Exec)
 task testNanoGolden(type: Exec)
-configureTestTask(testGolden, '')
-configureTestTask(testNanoGolden, 'Nano')
+configureTestTask(testGolden, '', '')
+configureTestTask(testNanoGolden, 'Nano', '/nano')
diff --git a/compiler/src/java_plugin/cpp/java_generator.cpp b/compiler/src/java_plugin/cpp/java_generator.cpp
index e8f3e7c..bda2f12 100644
--- a/compiler/src/java_plugin/cpp/java_generator.cpp
+++ b/compiler/src/java_plugin/cpp/java_generator.cpp
@@ -61,6 +61,10 @@
   if (nano && !desc->file()->options().javanano_use_deprecated_package()) {
     // XXX: Add "nano" to the original package
     // (https://github.com/grpc/grpc-java/issues/900)
+    if (isupper(name[0])) {
+      // No java package specified.
+      return "nano." + name;
+    }
     for (int i = 0; i < name.size(); ++i) {
       if ((name[i] == '.') && (i < (name.size() - 1)) && isupper(name[i + 1])) {
         return name.substr(0, i + 1) + "nano." + name.substr(i + 1);
@@ -624,10 +628,12 @@
   vars["ExperimentalApi"] = "io.grpc.ExperimentalApi";
 
   Printer printer(out, '$');
-  string package_name = ServiceJavaPackage(service->file());
-  printer.Print(
-      "package $package_name$;\n\n",
-      "package_name", package_name);
+  string package_name = ServiceJavaPackage(service->file(), generate_nano);
+  if (!package_name.empty()) {
+    printer.Print(
+        "package $package_name$;\n\n",
+        "package_name", package_name);
+  }
   PrintImports(&printer, generate_nano);
 
   // Package string is used to fully qualify method names.
@@ -638,11 +644,19 @@
   PrintService(service, &vars, &printer, generate_nano);
 }
 
-string ServiceJavaPackage(const FileDescriptor* file) {
+string ServiceJavaPackage(const FileDescriptor* file, bool nano) {
   string result = google::protobuf::compiler::java::ClassName(file);
   size_t last_dot_pos = result.find_last_of('.');
   if (last_dot_pos != string::npos) {
     result.resize(last_dot_pos);
+  } else {
+    result = "";
+  }
+  if (nano && !file->options().javanano_use_deprecated_package()) {
+    if (!result.empty()) {
+      result += ".";
+    }
+    result += "nano";
   }
   return result;
 }
diff --git a/compiler/src/java_plugin/cpp/java_generator.h b/compiler/src/java_plugin/cpp/java_generator.h
index f75376e..96b3b8a 100644
--- a/compiler/src/java_plugin/cpp/java_generator.h
+++ b/compiler/src/java_plugin/cpp/java_generator.h
@@ -39,7 +39,7 @@
 namespace java_grpc_generator {
 
 // Returns the package name of the gRPC services defined in the given file.
-string ServiceJavaPackage(const google::protobuf::FileDescriptor* file);
+string ServiceJavaPackage(const google::protobuf::FileDescriptor* file, bool nano);
 
 // Returns the name of the outer class that wraps in all the generated code for
 // the given service.
diff --git a/compiler/src/java_plugin/cpp/java_plugin.cpp b/compiler/src/java_plugin/cpp/java_plugin.cpp
index 41c8999..8f9a2e8 100644
--- a/compiler/src/java_plugin/cpp/java_plugin.cpp
+++ b/compiler/src/java_plugin/cpp/java_plugin.cpp
@@ -8,8 +8,8 @@
 #include "java_generator.h"
 #include <google/protobuf/compiler/code_generator.h>
 #include <google/protobuf/compiler/plugin.h>
-#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/descriptor.h>
+#include <google/protobuf/io/zero_copy_stream.h>
 
 static string JavaPackageToDir(const string& package_name) {
   string package_dir = package_name;
@@ -41,7 +41,7 @@
       }
     }
 
-    string package_name = java_grpc_generator::ServiceJavaPackage(file);
+    string package_name = java_grpc_generator::ServiceJavaPackage(file, generate_nano);
     string package_filename = JavaPackageToDir(package_name);
     for (int i = 0; i < file->service_count(); ++i) {
       const google::protobuf::ServiceDescriptor* service = file->service(i);
diff --git a/compiler/src/test/golden/TestServiceNano.java.txt b/compiler/src/test/golden/TestServiceNano.java.txt
index 4012e40..0314a8d 100644
--- a/compiler/src/test/golden/TestServiceNano.java.txt
+++ b/compiler/src/test/golden/TestServiceNano.java.txt
@@ -1,4 +1,4 @@
-package io.grpc.testing.integration;
+package io.grpc.testing.integration.nano;
 
 import static io.grpc.stub.ClientCalls.asyncUnaryCall;
 import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;