diff --git a/RosAria.cpp b/RosAria.cpp
index 77153ffdc74a0378d7378327f94b813ee7c27875..9002b505dceb33dcd475628ea46c903ccfbf644c 100644
--- a/RosAria.cpp
+++ b/RosAria.cpp
@@ -10,6 +10,8 @@
 #include "geometry_msgs/Pose.h"
 #include "geometry_msgs/PoseStamped.h"
 #include <sensor_msgs/PointCloud.h>  //for sonar data
+#include <sensor_msgs/PointCloud2.h>
+#include <sensor_msgs/point_cloud_conversion.h> // can optionally publish sonar as new type pointcloud2
 #include "nav_msgs/Odometry.h"
 #include "rosaria/BumperState.h"
 #include "tf/tf.h"
@@ -53,6 +55,7 @@ class RosAriaNode
     ros::Publisher pose_pub;
     ros::Publisher bumpers_pub;
     ros::Publisher sonar_pub;
+    bool sonar_pointcloud2;
     ros::Publisher voltage_pub;
 
     ros::Publisher recharge_state_pub;
@@ -95,7 +98,7 @@ class RosAriaNode
     std::string frame_id_sonar;
 
     //Sonar support
-    bool use_sonar;  // enable and publish sonars
+    bool sonar_enabled;  // enable and publish sonar data. set to true when first subscriber connects, set to false when last subscriber disconnects.
 
     // Debug Aria
     bool debug_aria;
@@ -123,7 +126,7 @@ void RosAriaNode::readParameters()
   {
     TicksMM = robot->getOrigRobotConfig()->getTicksMM();
     n_.setParam( "TicksMM", TicksMM);
-    ROS_INFO("Setting TicksMM from robot EEPROM: %d", TicksMM);
+    ROS_INFO("Setting TicksMM from robot controller stored configuration: %d", TicksMM);
   }
   
   if (n_.hasParam("DriftFactor"))
@@ -136,7 +139,7 @@ void RosAriaNode::readParameters()
   {
     DriftFactor = robot->getOrigRobotConfig()->getDriftFactor();
     n_.setParam( "DriftFactor", DriftFactor);
-    ROS_INFO("Setting DriftFactor from robot EEPROM: %d", DriftFactor);
+    ROS_INFO("Setting DriftFactor from robot controller stored configuration: %d", DriftFactor);
   }
   
   if (n_.hasParam("RevCount"))
@@ -149,7 +152,7 @@ void RosAriaNode::readParameters()
   {
     RevCount = robot->getOrigRobotConfig()->getRevCount();
     n_.setParam( "RevCount", RevCount);
-    ROS_INFO("Setting RevCount from robot EEPROM: %d", RevCount);
+    ROS_INFO("Setting RevCount from robot controller stored configuration: %d", RevCount);
   }
   robot->unlock();
 }
@@ -237,23 +240,23 @@ void RosAriaNode::sonarConnectCb()
   if (sonar_pub.getNumSubscribers() == 0)
   {
     robot->disableSonar();
-    use_sonar = false;
+    sonar_enabled = false;
   }
   else
   {
     robot->enableSonar();
-    use_sonar = true;
+    sonar_enabled = true;
   }
   robot->unlock();
 }
 
 RosAriaNode::RosAriaNode(ros::NodeHandle nh) : 
-  myPublishCB(this, &RosAriaNode::publish), serial_port(""), serial_baud(0), use_sonar(false)
+  myPublishCB(this, &RosAriaNode::publish), serial_port(""), serial_baud(0), sonar_enabled(false), sonar_pointcloud2(false)
 {
-  // read in config options
+  // read in runtime parameters
   n = nh;
 
-  // !!! port !!!
+  // port and baud
   n.param( "port", serial_port, std::string("/dev/ttyUSB0") );
   ROS_INFO( "RosAria: using port: [%s]", serial_port.c_str() );
 
@@ -265,6 +268,9 @@ RosAriaNode::RosAriaNode(ros::NodeHandle nh) :
   n.param( "debug_aria", debug_aria, false ); // default not to debug
   n.param( "aria_log_filename", aria_log_filename, std::string("Aria.log") );
 
+  // sonar options
+  n.param("sonar_pointcloud2", sonar_pointcloud2, false);
+
   // Figure out what frame_id's to use. if a tf_prefix param is specified,
   // it will be added to the beginning of the frame_ids.
   //
@@ -286,9 +292,18 @@ RosAriaNode::RosAriaNode(ros::NodeHandle nh) :
   // See ros::NodeHandle API docs.
   pose_pub = n.advertise<nav_msgs::Odometry>("pose",1000);
   bumpers_pub = n.advertise<rosaria::BumperState>("bumper_state",1000);
-  sonar_pub = n.advertise<sensor_msgs::PointCloud>("sonar", 50,
-    boost::bind(&RosAriaNode::sonarConnectCb, this),
-    boost::bind(&RosAriaNode::sonarConnectCb, this));
+  if(sonar_pointcloud2)
+  {
+    sonar_pub = n.advertise<sensor_msgs::PointCloud2>("sonar", 50, 
+      boost::bind(&RosAriaNode::sonarConnectCb, this),
+      boost::bind(&RosAriaNode::sonarConnectCb, this));
+  }
+  else
+  {
+    sonar_pub = n.advertise<sensor_msgs::PointCloud>("sonar", 50,
+      boost::bind(&RosAriaNode::sonarConnectCb, this),
+      boost::bind(&RosAriaNode::sonarConnectCb, this));
+  }
 
   voltage_pub = n.advertise<std_msgs::Float64>("battery_voltage", 1000);
   recharge_state_pub = n.advertise<std_msgs::Int8>("battery_recharge_state", 5, true /*latch*/ );
@@ -566,16 +581,16 @@ void RosAriaNode::publish()
   }
 
   // Publish sonar information, if enabled.
-  if (use_sonar) {
+  if (sonar_enabled) {
     sensor_msgs::PointCloud cloud;	//sonar readings.
     cloud.header.stamp = position.header.stamp;	//copy time.
     // sonar sensors relative to base_link
     cloud.header.frame_id = frame_id_sonar;
-    
+  
 
-    // Log debugging info
-    std::stringstream sonar_debug_info;
+    std::stringstream sonar_debug_info; // Log debugging info
     sonar_debug_info << "Sonar readings: ";
+
     for (int i = 0; i < robot->getNumSonar(); i++) {
       ArSensorReading* reading = NULL;
       reading = robot->getSonarReading(i);
@@ -583,7 +598,7 @@ void RosAriaNode::publish()
         ROS_WARN("RosAria: Did not receive a sonar reading.");
         continue;
       }
-      
+    
       // getRange() will return an integer between 0 and 5000 (5m)
       sonar_debug_info << reading->getRange() << " ";
 
@@ -597,7 +612,7 @@ void RosAriaNode::publish()
       //                  << ", " << reading->getLocalY()
       //                  << ") from (" << sensor.getX() << ", " 
       //                  << sensor.getY() << ") ;; " ;
-      
+    
       //add sonar readings (robot-local coordinate frame) to cloud
       geometry_msgs::Point32 p;
       p.x = reading->getLocalX() / 1000.0;
@@ -607,9 +622,24 @@ void RosAriaNode::publish()
     }
     ROS_DEBUG_STREAM(sonar_debug_info.str());
     
-    sonar_pub.publish(cloud);
-  }
-
+    // publish data. convert to pointcloud2 first if requested.
+    if(sonar_pointcloud2)
+    {
+      sensor_msgs::PointCloud2 cloud2;
+      if(!sensor_msgs::convertPointCloudToPointCloud2(cloud, cloud2))
+      {
+        ROS_WARN("Error converting sonar point cloud message to point_cloud2 type before publishing! Not publishing this time.");
+      }
+      else
+      {
+        sonar_pub.publish(cloud2);
+      }
+    }
+    else
+    {
+      sonar_pub.publish(cloud);
+    }
+  } // end if sonar_enabled
 }
 
 bool RosAriaNode::enable_motors_cb(std_srvs::Empty::Request& request, std_srvs::Empty::Response& response)