diff --git a/base/bruno/asyncsocket.h b/base/bruno/asyncsocket.h
index ce06cdf..0e96979 100644
--- a/base/bruno/asyncsocket.h
+++ b/base/bruno/asyncsocket.h
@@ -113,15 +113,19 @@
 
  protected:
   virtual void OnConnectEvent(AsyncSocket* socket) {
+    (void)socket;
     SignalConnectEvent(this);
   }
   virtual void OnReadEvent(AsyncSocket* socket) {
+    (void)socket;
     SignalReadEvent(this);
   }
   virtual void OnWriteEvent(AsyncSocket* socket) {
+    (void)socket;
     SignalWriteEvent(this);
   }
   virtual void OnCloseEvent(AsyncSocket* socket, int err) {
+    (void)socket;
     SignalCloseEvent(this, err);
   }
 
diff --git a/base/bruno/scoped_ptr.h b/base/bruno/scoped_ptr.h
index 9e8a06d..0fa5b36 100644
--- a/base/bruno/scoped_ptr.h
+++ b/base/bruno/scoped_ptr.h
@@ -60,6 +60,8 @@
 
   void reset(T* p = NULL) {
     typedef char type_must_be_complete[sizeof(T)];
+    type_must_be_complete *x;
+    (void)x;
 
     if (ptr != p) {
       T* obj = ptr;
@@ -137,11 +139,15 @@
 
   ~scoped_array() {
     typedef char type_must_be_complete[sizeof(T)];
+    type_must_be_complete *x;
+    (void)x;
     delete[] ptr;
   }
 
   void reset(T* p = NULL) {
     typedef char type_must_be_complete[sizeof(T)];
+    type_must_be_complete *x;
+    (void)x;
 
     if (ptr != p) {
       T* arr = ptr;
diff --git a/base/bruno/socketserver.h b/base/bruno/socketserver.h
index bdeef5b..12e8acc 100644
--- a/base/bruno/socketserver.h
+++ b/base/bruno/socketserver.h
@@ -44,7 +44,7 @@
   // When the socket server is installed into a Thread, this function is
   // called to allow the socket server to use the thread's message queue for
   // any messaging that it might need to perform.
-  virtual void SetMessageQueue(MessageQueue* queue) {}
+  virtual void SetMessageQueue(MessageQueue* queue) { (void)queue; }
 
   // Sleeps until:
   //  1) cms milliseconds have elapsed (unless cms == kForever)
diff --git a/sysmgr/Makefile b/sysmgr/Makefile
index 18a47ef..19e85b7 100644
--- a/sysmgr/Makefile
+++ b/sysmgr/Makefile
@@ -10,14 +10,13 @@
 BINDIR=$(PREFIX)/bin
 LIBDIR=$(PREFIX)/lib
 INCLUDEDIR=$(PREFIX)/include
-PKG_CONFIG?=pkg-config
 
 CC=$(CROSS_COMPILE)gcc
 CXX=$(CROSS_COMPILE)g++
 RM=rm -f
 INCS=-Iperipheral -I../base -I../libstacktrace
 CFLAGS=-Wall -Wimplicit -Wno-unknown-pragmas -W
-CPPFLAGS=$(subst -Wstrict-prototypes,,$(subst -std=c99,,$(shell $(PKG_CONFIG) --cflags brunobase)))
+CXXFLAGS=
 
 all: $(TARGETS)
 
@@ -41,7 +40,6 @@
 install-libs: all
 	mkdir -p $(INCLUDEDIR)/sysmgr $(LIBDIR)/pkgconfig
 	$(INSTALL) -m 0644 platform_peripheral_api.h $(INCLUDEDIR)/sysmgr/
-	$(INSTALL) -m 0644 brunoperipheral.pc $(LIBDIR)/pkgconfig/
 	$(INSTALL) -m 0755 peripheral/libbrunoperipheral.so $(LIBDIR)/
 
 peripheral/libbrunoperipheral.so: peripheral/all
@@ -51,16 +49,12 @@
 
 %: %.o
 	@echo "LINK $@"
-	$(Q)$(CXX) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCS) \
+	$(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(INCS) \
 		-o $@ $^ -lpthread
 
 %.o: %.cc
 	@echo " CXX $@"
-	$(Q)$(CXX) $(CFLAGS) $(CPPFLAGS) $(INCS) -o $@ -c $<
-
-%.o: %.c
-	@echo " CC  $@"
-	$(Q)$(CC) -std=c99 $(CFLAGS) $(CPPFLAGS) $(INCS) -o $@ -c $<
+	$(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(INCS) -o $@ -c $<
 
 %/all:
 	$(MAKE) -C $* all
diff --git a/sysmgr/brunoperipheral.pc b/sysmgr/brunoperipheral.pc
deleted file mode 100644
index 51c7a81..0000000
--- a/sysmgr/brunoperipheral.pc
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=/usr
-exec_prefix=/usr
-libdir=${exec_prefix}/lib
-includedir=${prefix}/include
-
-Name: Bruno Peripheral
-Description: Bruno Peripheral Library
-Version: 1.0.0
-Libs: -L${libdir} -lbrunoperipheral
-Libs.private:
-Cflags:
diff --git a/sysmgr/peripheral/common.cc b/sysmgr/peripheral/common.cc
index f1094b2..9517926 100644
--- a/sysmgr/peripheral/common.cc
+++ b/sysmgr/peripheral/common.cc
@@ -11,130 +11,32 @@
 
 namespace bruno_platform_peripheral {
 
-const std::string Common::kErrorString = "ERROR";
-
-
-std::string Common::ExecCmd(std::string& cmd, std::string *pattern,
-                           enum ExecCmdCompareTypes action) {
-  char buffer[256];
-  std::string result = "";
-  FILE* pipe = popen(cmd.c_str(), "r");
-
-  LOG(LS_INFO) << "ExecCmd: cmd= " << cmd << " action= " << action << std::endl
-               << "pattern= " << ((pattern == NULL)? "NULL": *pattern) << std::endl;
-  if (!pipe) {
-    LOG(LS_ERROR) << "ExecCmd(): ERROR" << std::endl;
-    return kErrorString;
-  }
-  int is_continue = true;
-  size_t found;
-
-  while((!feof(pipe)) && (is_continue)) {
-    if(fgets(buffer, sizeof(buffer), pipe) != NULL) {
-      /* pattern == NULL, read and return all of lines
-       * pattern != NULL, return the line if found the pattern in the line
-       */
-      if (pattern != NULL) {
-        result = std::string(buffer);
-      }
-      switch (action) {
-        case STRING_COMPARE:
-          /* Compare strings when the pattern is in beginning of the
-           * compared string.
-           */
-          if (result.compare(0, pattern->size(), *pattern) == 0) {
-            is_continue = false;  /* Found the pattern. Exit. */
-            break;
-          }
-          result.clear();
-          break;
-        case STRING_FIND:
-          /* Find in the compared string if the starting position is unknown.
-           * More time consuming.
-           */
-          found = result.find(*pattern);
-          if (found != std::string::npos) {
-            LOG(LS_VERBOSE) << "ExecCmd: FOUND **result= " << result << std::endl;
-            is_continue = false;  /* Found the pattern. Exit. */
-            break;
-          }
-          result.clear();
-          break;
-        case STRING_RETRUN_ALL_MSGS:
-          result += buffer;
-          break;
-      }
-    }
-  }
-
-  pclose(pipe);
-  return result;
-}
-
-void Common::Split(const std::string& str,
-            const std::string& delimiters, std::vector<std::string>& tokens) {
-  /* Skip delimiters at beginning. */
-  LOG(LS_VERBOSE) << "Split: str= " << str
-                  << "delimiters= " << delimiters << std::endl;
-  std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
-  /* Find first "non-delimiter". */
-  std::string::size_type pos     = str.find_first_of(delimiters, lastPos);
-
-  while (std::string::npos != pos || std::string::npos != lastPos) {
-      // Found a token, add it to the vector.
-      tokens.push_back(str.substr(lastPos, pos - lastPos));
-      // Skip delimiters.
-      lastPos = str.find_first_not_of(delimiters, pos);
-      // Find next "non-delimiter"
-      pos = str.find_first_of(delimiters, lastPos);
-  }
-
-  /* Debug print only. Remove later. */
-  for (size_t i = 0; i < tokens.size(); i++) {
-    LOG(LS_VERBOSE) << "idx= " << i << " token= " << tokens[i] << std::endl;
-  }
-
-  LOG(LS_VERBOSE) << "Split: exit." << std::endl;
-}
-
-
-bool Common::Reboot() {
-  bool  is_ok = true;
-
+bool Reboot() {
   sync();
   int ret = reboot(LINUX_REBOOT_CMD_RESTART);
   if (ret < 0) {
     LOG(LS_ERROR) << "Reboot: failed (ret=" << ret << ")" << std::endl;
-    is_ok = false;
+    return false;
   }
-  return(is_ok);
+  return true;
 }
 
 
-bool Common::Poweroff() {
-  bool  is_ok = true;
-
+bool Poweroff() {
   sync();
   int ret = system("poweroff-with-message 'poweroff requested by sysmgr'");
   if (ret != 0) {
     LOG(LS_ERROR) << "Poweroff: failed (ret=" << ret << ")" << std::endl;
-    is_ok = false;
+    return false;
   }
-  return(is_ok);
+  return true;
 }
 
 
-void Common::SetLED(LedControl led, const std::string message) {
+void SetLEDOverheat(const std::string& message) {
   std::ofstream file;
-  const char *filename = "/dev/null";
-  const char *led_pattern = "0";
-
-  switch(led) {
-    case OVERHEATING:
-      filename = OVERHEATING_LED_FILE;
-      led_pattern = OVERHEATING_LED_ON;
-      break;
-  }
+  const char *filename = OVERHEATING_LED_FILE;
+  const char *led_pattern = OVERHEATING_LED_ON;
 
   /* Set LED by sending string to GPIO mailbox */
   file.open(filename);
@@ -149,14 +51,8 @@
   }
 }
 
-void Common::ClrLED(LedControl led, const std::string message) {
-  std::string filename = "/dev/null";
-
-  switch(led) {
-    case OVERHEATING:
-      filename = OVERHEATING_LED_FILE;
-      break;
-  }
+void ClrLEDOverheat(const std::string& message) {
+  std::string filename = OVERHEATING_LED_FILE;
 
   unlink(filename.c_str());
 
@@ -170,34 +66,31 @@
 }
 
 /* Convert from string to floating point number */
-bool Common::ConvertStringToFloat(const std::string& value_str, float *value) {
-  bool  rtn = true;
+bool ConvertStringToFloat(const std::string& value_str, float *value) {
   std::stringstream ss(value_str);
 
   if((ss >> *value).fail()) {
     *value = 0.0;
-    rtn = false;
     LOG(LS_ERROR) << "ConvertStringToFloat: Failed to convert" << std::endl;
+    return false;
   }
-  return rtn;
+  return true;
 }
 
 /* Convert from string to integer */
-bool Common::ConvertStringToUint16(const std::string& value_str, uint16_t *value) {
-  bool  rtn = true;
+bool ConvertStringToUint16(const std::string& value_str, uint16_t *value) {
   std::stringstream ss(value_str);
 
   if((ss >> *value).fail()) {
     *value = 0;
-    rtn = false;
     LOG(LS_ERROR) << "ConvertStringToInt: Failed to convert" << std::endl;
+    return false;
   }
-  return rtn;
+  return true;
 }
 
-
 /* Convert from integer to string */
-void Common::ConvertUint16ToString(const uint16_t& value, std::string *value_str) {
+void ConvertUint16ToString(const uint16_t& value, std::string *value_str) {
   std::stringstream ss;
   ss << value;
   *value_str = ss.str();
diff --git a/sysmgr/peripheral/common.h b/sysmgr/peripheral/common.h
index df72ac6..9b21e16 100644
--- a/sysmgr/peripheral/common.h
+++ b/sysmgr/peripheral/common.h
@@ -23,34 +23,13 @@
 
 namespace bruno_platform_peripheral {
 
-class Common {
- public:
-  enum ExecCmdCompareTypes {
-    STRING_COMPARE,
-    STRING_FIND,
-    STRING_RETRUN_ALL_MSGS
-  };
-
-  enum LedControl {
-    OVERHEATING
-  };
-
-  static const std::string kErrorString;
-
-  static std::string ExecCmd(std::string& cmd, std::string *pattern,
-                             enum ExecCmdCompareTypes action);
-  static void Split(const std::string& str,
-              const std::string& delimiters, std::vector<std::string>& tokens);
-  static bool Reboot();
-  static bool Poweroff();
-  static void SetLED(LedControl led, const std::string message);
-  static void ClrLED(LedControl led, const std::string message);
-  static bool ConvertStringToFloat(const std::string& value_str, float *value);
-  static bool ConvertStringToUint16(const std::string& value_str, uint16_t *value);
-  static void ConvertUint16ToString(const uint16_t& value, std::string *value_str);
-
-  DISALLOW_COPY_AND_ASSIGN(Common);
-};
+bool Reboot();
+bool Poweroff();
+void SetLEDOverheat(const std::string& message);
+void ClrLEDOverheat(const std::string& message);
+bool ConvertStringToFloat(const std::string& value_str, float *value);
+bool ConvertStringToUint16(const std::string& value_str, uint16_t *value);
+void ConvertUint16ToString(const uint16_t& value, std::string *value_str);
 
 }  // namespace bruno_platform_peripheral
 
diff --git a/sysmgr/peripheral/fancontrol.h b/sysmgr/peripheral/fancontrol.h
index 4e379ad..ab2eecd 100644
--- a/sysmgr/peripheral/fancontrol.h
+++ b/sysmgr/peripheral/fancontrol.h
@@ -39,7 +39,7 @@
 }FanControlParams;
 
 
-class FanControl: public Mailbox {
+class FanControl : public Mailbox {
  public:
   enum StateType {
     OFF,
diff --git a/sysmgr/peripheral/mailbox.cc b/sysmgr/peripheral/mailbox.cc
index 8bda816..2af9e2e 100644
--- a/sysmgr/peripheral/mailbox.cc
+++ b/sysmgr/peripheral/mailbox.cc
@@ -27,7 +27,7 @@
   *fan_speed = 0;
   rtn = ReadValueString(kMailboxFanSpeedFile, &value_str);
   if (rtn == true) {
-    rtn = Common::ConvertStringToUint16(value_str, fan_speed);
+    rtn = ConvertStringToUint16(value_str, fan_speed);
   }
   return rtn;
 }
@@ -44,7 +44,7 @@
   *soc_temperature = 0.0;
   rtn = ReadValueString(kMailboxCpuTemperatureFile, &value_str);
   if (rtn == true) {
-    rtn = Common::ConvertStringToFloat(value_str, soc_temperature);
+    rtn = ConvertStringToFloat(value_str, soc_temperature);
   }
   return rtn;
 }
@@ -70,7 +70,7 @@
 bool Mailbox::WriteFanDutyCycle(uint16_t duty_cycle) {
   std::string value_str;
 
-  Common::ConvertUint16ToString(duty_cycle, &value_str);
+  ConvertUint16ToString(duty_cycle, &value_str);
   return WriteValueString(kMailboxFanPercentFile, value_str);
 }
 
@@ -87,7 +87,7 @@
 
   rtn = ReadValueString(kMailboxFanPercentFile, &value_str);
   if (rtn == true) {
-    rtn = Common::ConvertStringToUint16(value_str, duty_cycle);
+    rtn = ConvertStringToUint16(value_str, duty_cycle);
   }
   return rtn;
 }
@@ -128,22 +128,16 @@
 
 /* Read value string from the text file */
 bool Mailbox::ReadValueString(const std::string& in_file, std::string *value_str) {
-  bool  rtn = false;
-
   std::ifstream file;
-
   file.open(in_file.c_str(), std::ios::in);
   if (file.is_open()) {
     std::getline(file, *value_str);
     file.close();
-    rtn = true;
-  } else {
-    *value_str = Common::kErrorString;         /* Retrun a default error string */
-    LOG(LS_ERROR) << "ReadValueString: Failed to open: " << in_file;
+    return true;
   }
-
-  LOG(LS_VERBOSE) << "rtn=" << rtn;
-  return rtn;
+  *value_str = "ERROR";
+  LOG(LS_ERROR) << "ReadValueString: Failed to open: " << in_file;
+  return false;
 }
 
 } // ce bruno_platform_peripheral
diff --git a/sysmgr/peripheral/peripheralmon.cc b/sysmgr/peripheral/peripheralmon.cc
index 4e7b123..dbd6f49 100644
--- a/sysmgr/peripheral/peripheralmon.cc
+++ b/sysmgr/peripheral/peripheralmon.cc
@@ -76,7 +76,7 @@
 
   if (soc_temperature < overheat_value) {
     overheating_ = 0;
-    Common::ClrLED(Common::OVERHEATING, "");
+    ClrLEDOverheat("");
   }
   else {
     overheating_ ++;
@@ -84,15 +84,15 @@
     if (overheating_ >= OVERHEATING_COUNT) {
       message << "System power off: SOC overheating " << overheating_;
       LOG(LS_ERROR) << message.str();
-      Common::ClrLED(Common::OVERHEATING, "");
+      ClrLEDOverheat("");
 
       overheating_ = 0;
-      Common::Poweroff();
+      Poweroff();
     }
     else {
       message << "SOC overheating detected " << overheating_;
       LOG(LS_ERROR) << message.str();
-      Common::SetLED(Common::OVERHEATING, message.str());
+      SetLEDOverheat(message.str());
     }
   }
 }
