diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 8ae35f3..f03d7af 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -540,7 +540,7 @@
 {
   float threshold = 6.0;
 
-  return detectRACHBurst(burst, threshold, mSPSRx, &amp, &toa);
+  return detectRACHBurst(burst, threshold, mSPSRx, amp, toa);
 }
 
 /*
@@ -569,8 +569,8 @@
   }
 
   /* Detect normal burst midambles */
-  success = analyzeTrafficBurst(burst, mTSC, threshold, mSPSRx, &amp,
-                                &toa, mMaxExpectedDelay, estimateChan,
+  success = analyzeTrafficBurst(burst, mTSC, threshold, mSPSRx, amp,
+                                toa, mMaxExpectedDelay, estimateChan,
                                 &chanResp, &chanOffset);
   if (success <= 0) {
     return success;
diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp
index 4355fce..b5160ca 100644
--- a/Transceiver52M/sigProcLib.cpp
+++ b/Transceiver52M/sigProcLib.cpp
@@ -1386,26 +1386,25 @@
     return max;
 }
 
-/* 
- * RACH burst detection
+/*
+ * RACH/Normal burst detection with clipping detection
  *
  * Correlation window parameters:
- *   target: Tail bits + RACH length (reduced from 41 to a multiple of 4)
- *   head: Search 4 symbols before target 
- *   tail: Search 10 symbols after target
+ *   target: Tail bits + burst length
+ *   head: Search symbols before target
+ *   tail: Search symbols after target
  */
-int detectRACHBurst(signalVector &rxBurst,
-		    float thresh,
-		    int sps,
-		    complex *amp,
-		    float *toa)
+int detectGeneralBurst(signalVector &rxBurst,
+                       float thresh,
+                       int sps,
+                       complex &amp,
+                       float &toa,
+                       int target, int head, int tail,
+                       CorrelationSequence *sync)
 {
-  int rc, start, target, head, tail, len;
+  int rc, start, len;
   bool clipping = false;
-  float _toa;
-  complex _amp;
   signalVector *corr;
-  CorrelationSequence *sync;
 
   if ((sps != 1) && (sps != 4))
     return -SIGERR_UNSUPPORTED;
@@ -1419,38 +1418,57 @@
     clipping = true;
   }
 
-  target = 8 + 40;
-  head = 4;
-  tail = 10;
-
   start = (target - head) * sps - 1;
   len = (head + tail) * sps;
-  sync = gRACHSequence;
   corr = new signalVector(len);
 
   rc = detectBurst(rxBurst, *corr, sync,
-                   thresh, sps, &_amp, &_toa, start, len);
+                   thresh, sps, &amp, &toa, start, len);
   delete corr;
 
   if (rc < 0) {
     return -SIGERR_INTERNAL;
   } else if (!rc) {
-    if (amp)
-      *amp = 0.0f;
-    if (toa)
-      *toa = 0.0f;
+    amp = 0.0f;
+    toa = 0.0f;
     return clipping?-SIGERR_CLIP:SIGERR_NONE;
   }
 
   /* Subtract forward search bits from delay */
-  if (toa)
-    *toa = _toa - head * sps;
-  if (amp)
-    *amp = _amp;
+  toa -= head * sps;
 
   return 1;
 }
 
+
+/* 
+ * RACH burst detection
+ *
+ * Correlation window parameters:
+ *   target: Tail bits + RACH length (reduced from 41 to a multiple of 4)
+ *   head: Search 4 symbols before target 
+ *   tail: Search 10 symbols after target
+ */
+int detectRACHBurst(signalVector &rxBurst,
+            float thresh,
+            int sps,
+            complex &amp,
+            float &toa)
+{
+  int rc, target, head, tail;
+  CorrelationSequence *sync;
+
+  target = 8 + 40;
+  head = 4;
+  tail = 10;
+  sync = gRACHSequence;
+
+  rc = detectGeneralBurst(rxBurst, thresh, sps, amp, toa,
+                          target, head, tail, sync);
+
+  return rc;
+}
+
 /* 
  * Normal burst detection
  *
@@ -1460,67 +1478,32 @@
  *   tail: Search 4 symbols + maximum expected delay
  */
 int analyzeTrafficBurst(signalVector &rxBurst, unsigned tsc, float thresh,
-                        int sps, complex *amp, float *toa, unsigned max_toa,
+                        int sps, complex &amp, float &toa, unsigned max_toa,
                         bool chan_req, signalVector **chan, float *chan_offset)
 {
-  int rc, start, target, head, tail, len;
-  bool clipping = false;
-  complex _amp;
-  float _toa;
-  signalVector *corr;
+  int rc, target, head, tail;
   CorrelationSequence *sync;
 
-  if ((tsc < 0) || (tsc > 7) || ((sps != 1) && (sps != 4)))
+  if ((tsc < 0) || (tsc > 7))
     return -SIGERR_UNSUPPORTED;
 
-  // Detect potential clipping
-  // We still may be able to demod the burst, so we'll give it a try
-  // and only report clipping if we can't demod.
-  float maxAmpl = maxAmplitude(rxBurst);
-  if (maxAmpl > CLIP_THRESH) {
-    LOG(DEBUG) << "max burst amplitude: " << maxAmpl << " is above the clipping threshold: " << CLIP_THRESH << std::endl;
-    clipping = true;
-  }
-
   target = 3 + 58 + 16 + 5;
   head = 4;
   tail = 4 + max_toa;
-
-  start = (target - head) * sps - 1;
-  len = (head + tail) * sps;
   sync = gMidambles[tsc];
-  corr = new signalVector(len);
 
-  rc = detectBurst(rxBurst, *corr, sync,
-                   thresh, sps, &_amp, &_toa, start, len);
-  delete corr;
-
-  if (rc < 0) {
-    return -SIGERR_INTERNAL;
-  } else if (!rc) {
-    if (amp)
-      *amp = 0.0f;
-    if (toa)
-      *toa = 0.0f;
-    return clipping?-SIGERR_CLIP:SIGERR_NONE;
-  }
-
-  /* Subtract forward search bits from delay */
-  _toa -= head * sps;
-  if (toa)
-    *toa = _toa;
-  if (amp)
-    *amp = _amp;
+  rc = detectGeneralBurst(rxBurst, thresh, sps, amp, toa,
+                          target, head, tail, sync);
 
   /* Equalization not currently supported */
-  if (chan_req) {
+  if (rc > 0 && chan_req) {
     *chan = new signalVector(6 * sps);
 
     if (chan_offset)
       *chan_offset = 0.0;
   }
 
-  return 1;
+  return rc;
 }
 
 signalVector *decimateVector(signalVector &wVector, size_t factor)
diff --git a/Transceiver52M/sigProcLib.h b/Transceiver52M/sigProcLib.h
index f7f6259..8685f2d 100644
--- a/Transceiver52M/sigProcLib.h
+++ b/Transceiver52M/sigProcLib.h
@@ -192,8 +192,8 @@
 int detectRACHBurst(signalVector &rxBurst,
                     float detectThreshold,
                     int sps,
-                    complex *amplitude,
-                    float* TOA);
+                    complex &amplitude,
+                    float &TOA);
 
 /**
         Normal burst correlator, detector, channel estimator.
@@ -210,15 +210,15 @@
         @return positive if threshold value is reached, negative on error, zero otherwise
 */
 int analyzeTrafficBurst(signalVector &rxBurst,
-			unsigned TSC,
-			float detectThreshold,
-			int sps,
-			complex *amplitude,
-			float *TOA,
+                        unsigned TSC,
+                        float detectThreshold,
+                        int sps,
+                        complex &amplitude,
+                        float &TOA,
                         unsigned maxTOA,
                         bool requestChannel = false,
-			signalVector** channelResponse = NULL,
-			float *channelResponseOffset = NULL);
+                        signalVector** channelResponse = NULL,
+                        float *channelResponseOffset = NULL);
 
 /**
 	Decimate a vector.
