diff --git a/icons/object_planet_co2.png b/icons/object_planet_co2.png
new file mode 100644
index 0000000..d8c1183
Binary files /dev/null and b/icons/object_planet_co2.png differ
diff --git a/icons/object_planet_dwarf.png b/icons/object_planet_dwarf.png
index 9e8cfdc..0ad6b80 100644
Binary files a/icons/object_planet_dwarf.png and b/icons/object_planet_dwarf.png differ
diff --git a/icons/object_planet_large_gas_giant.png b/icons/object_planet_large_gas_giant.png
index bb2d8d1..13e6f7a 100644
Binary files a/icons/object_planet_large_gas_giant.png and b/icons/object_planet_large_gas_giant.png differ
diff --git a/icons/object_planet_medium_gas_giant.png b/icons/object_planet_medium_gas_giant.png
index 108c35b..90c424a 100644
Binary files a/icons/object_planet_medium_gas_giant.png and b/icons/object_planet_medium_gas_giant.png differ
diff --git a/icons/object_planet_methane.png b/icons/object_planet_methane.png
new file mode 100644
index 0000000..24f6e62
Binary files /dev/null and b/icons/object_planet_methane.png differ
diff --git a/icons/object_planet_small.png b/icons/object_planet_small.png
index 41c5b1e..ee4ae2f 100644
Binary files a/icons/object_planet_small.png and b/icons/object_planet_small.png differ
diff --git a/icons/object_planet_small_gas_giant.png b/icons/object_planet_small_gas_giant.png
index e94ca63..0699b7c 100644
Binary files a/icons/object_planet_small_gas_giant.png and b/icons/object_planet_small_gas_giant.png differ
diff --git a/icons/object_planet_volcanic.png b/icons/object_planet_volcanic.png
new file mode 100644
index 0000000..3febd57
Binary files /dev/null and b/icons/object_planet_volcanic.png differ
diff --git a/icons/object_planet_water_n2.png b/icons/object_planet_water_n2.png
new file mode 100644
index 0000000..c104f3f
Binary files /dev/null and b/icons/object_planet_water_n2.png differ
diff --git a/src/body.h b/src/body.h
index 18c5c45..d04b925 100644
--- a/src/body.h
+++ b/src/body.h
@@ -15,6 +15,7 @@ public:
   virtual Object::Type GetType(void) { return Object::BODY; }
   virtual void SetPosition(vector3d p) = 0;
   virtual vector3d GetPosition(void) = 0; /* Within frame. */
+  virtual double GetRadius(void) const = 0 ;
   virtual void Render(const Frame* camFrame) = 0;
   virtual void SetFrame(Frame* f) { m_frame = f; }
   /* return true if to we do collision response and apply damage. */
diff --git a/src/libs.h b/src/libs.h
index 0681a54..aa24c19 100644
--- a/src/libs.h
+++ b/src/libs.h
@@ -7,6 +7,7 @@
 #include <SDL_image.h>
 #include <ode/ode.h>
 #include <float.h>
+#include <limits>
 
 #ifdef _WIN32
 #include <windows.h>
diff --git a/src/main.cpp b/src/main.cpp
index 1bcc534..d1dd989 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -154,7 +154,7 @@ void L3D::HandleEvents(void) {
     case SDL_KEYDOWN:
       if(event.key.keysym.sym == SDLK_q) L3D::Quit();
       if(event.key.keysym.sym == SDLK_F11) SDL_WM_ToggleFullScreen(L3D::scrSurface);
-      if(event.key.keysym.sym == SDLK_F12) L3D::SetView(L3D::objectViewerView);
+      if(event.key.keysym.sym == SDLK_F10) L3D::SetView(L3D::objectViewerView);
       L3D::keyState[event.key.keysym.sym] = 1;
       L3D::onKeyPress.emit(&event.key.keysym);
       break;
diff --git a/src/model_body.cpp b/src/model_body.cpp
index 0cbaea7..4a40e5f 100644
--- a/src/model_body.cpp
+++ b/src/model_body.cpp
@@ -62,6 +62,32 @@ vector3d ModelBody::GetPosition(void) {
   return vector3d(pos[0], pos[1], pos[2]);
 }
 
+double ModelBody::GetRadius(void) const {
+  /* Calculate single AABB containing all geoms. */
+  dReal aabbAll[6] = {
+    std::numeric_limits<double>::max(),
+    std::numeric_limits<double>::min(),
+    std::numeric_limits<double>::max(),
+    std::numeric_limits<double>::min(),
+    std::numeric_limits<double>::max(),
+    std::numeric_limits<double>::min()
+  };
+
+  for(size_t i = 0; i < geoms.size(); ++i) {
+    dReal aabbGeom[6];
+    dGeomGetAABB(geoms[i], aabbGeom);
+    aabbAll[0] = std::min(aabbAll[0], aabbGeom[0]);
+    aabbAll[1] = std::max(aabbAll[1], aabbGeom[1]);
+    aabbAll[2] = std::min(aabbAll[2], aabbGeom[2]);
+    aabbAll[3] = std::max(aabbAll[3], aabbGeom[3]);
+    aabbAll[4] = std::min(aabbAll[4], aabbGeom[4]);
+    aabbAll[5] = std::max(aabbAll[5], aabbGeom[5]);
+  }
+
+  /* Return size of largest dimension. */
+  return std::max(aabbAll[1] - aabbAll[0], std::max(aabbAll[3] - aabbAll[2], aabbAll[5] - aabbAll[4]));
+}
+
 void ModelBody::SetRotation(const matrix4x4d& r) {
   dMatrix3 _m;
   r.SaveToOdeMatrix(_m);
diff --git a/src/model_body.h b/src/model_body.h
index ea7b9e1..d772ba6 100644
--- a/src/model_body.h
+++ b/src/model_body.h
@@ -15,6 +15,7 @@ public:
   virtual void SetRotation(const matrix4x4d& r);
   /* Not valid to SetVelocity on these. If you want them to move, use a DynamicBody. */
   vector3d GetPosition(void);
+  virtual double GetRadius(void) const;
   void TransformToModelCoords(const Frame* camFrame);
   void ViewingRotation(void);
   void GetRotMatrix(matrix4x4d& m);
diff --git a/src/object_viewer_view.cpp b/src/object_viewer_view.cpp
index a7a5152..70f1f61 100644
--- a/src/object_viewer_view.cpp
+++ b/src/object_viewer_view.cpp
@@ -60,6 +60,11 @@ void ObjectViewerView::Update(void) {
 
   char buf[128];
   Body* body = L3D::player->GetNavTarget();
+  if(body && body != lastTarget) {
+    /* Reset view distance for new target. */
+    viewingDist = body->GetRadius() * 2.0f;
+    lastTarget = body;
+  }
   snprintf(buf, sizeof(buf), "View dist: %.2f   Object: %s", viewingDist, (body ? body->GetLabel().c_str() : "<none>"));
   m_infoLabel->SetText(buf);
 }
diff --git a/src/object_viewer_view.h b/src/object_viewer_view.h
index cad105b..c2dfae7 100644
--- a/src/object_viewer_view.h
+++ b/src/object_viewer_view.h
@@ -15,5 +15,6 @@ private:
   matrix4x4d viewingRotation;
   float viewingDist;
   Gui::Label* m_infoLabel;
+  const Body* lastTarget;
 };
 
diff --git a/src/planet.h b/src/planet.h
index a66fc28..218b59b 100644
--- a/src/planet.h
+++ b/src/planet.h
@@ -10,7 +10,7 @@ public:
   virtual void SetPosition(vector3d p);
   virtual vector3d GetPosition(void);
   void SetRadius(double radius);
-  double GetRadius(void) { return sbody.radius; }
+  virtual double GetRadius(void) const { return sbody.radius; }
   virtual void Render(const Frame* camFrame);
   virtual void SetFrame(Frame* f);
   virtual bool OnCollision(Body* b, Uint32 flags) { return true; }
diff --git a/src/star.h b/src/star.h
index 077e502..5251dc0 100644
--- a/src/star.h
+++ b/src/star.h
@@ -11,7 +11,7 @@ public:
   virtual void SetPosition(vector3d p);
   virtual vector3d GetPosition(void);
   void SetRadius(double radius) { this->radius = radius; }
-  double GetRadius(void) { return radius; }
+  virtual double GetRadius(void) const { return radius; }
   virtual void Render(const Frame* camFrame);
 
 private: