diff --git a/gnuradio-core/src/lib/general/gr_firdes.cc b/gnuradio-core/src/lib/general/gr_firdes.cc
index 4c72371..98faa41 100644
--- a/gnuradio-core/src/lib/general/gr_firdes.cc
+++ b/gnuradio-core/src/lib/general/gr_firdes.cc
@@ -26,7 +26,9 @@
 
 #include <gr_firdes.h>
 #include <stdexcept>
-
+#if 0
+#include <cstdio>  // fprintf(),printf()
+#endif
 
 using std::vector;
 
@@ -727,6 +729,7 @@ gr_firdes::window (win_type type, int ntaps, double beta)
   case WIN_RECTANGULAR:
     for (int n = 0; n < ntaps; n++)
       taps[n] = 1;
+    break;
 
   case WIN_HAMMING:
     for (int n = 0; n < ntaps; n++)
@@ -743,7 +746,7 @@ gr_firdes::window (win_type type, int ntaps, double beta)
       taps[n] = 0.42 - 0.50 * cos ((2*M_PI * n) / (M-1)) - 0.08 * cos ((4*M_PI * n) / (M-1));
     break;
 
-  case WIN_BLACKMAN_hARRIS:
+  case WIN_BLACKMAN_HARRIS:
     for (int n = -ntaps/2; n < ntaps/2; n++)
       taps[n+ntaps/2] = 0.35875 + 0.48829*cos((2*M_PI * n) / (float)M) +
 	0.14128*cos((4*M_PI * n) / (float)M) + 0.01168*cos((6*M_PI * n) / (float)M);
@@ -763,12 +766,23 @@ gr_firdes::window (win_type type, int ntaps, double beta)
       double temp;
       //fprintf(stderr, "IBeta = %g; inm1 = %g\n", IBeta, inm1);
 
-      for (int i=0; i<ntaps; i++) {
+      for (int i=0; i<ntaps/2; i++) {
 	temp = i * inm1;
 	//fprintf(stderr, "temp = %g\n", temp);
 	taps[i] = Izero(beta*sqrt(1.0-temp*temp)) * IBeta;
 	//fprintf(stderr, "taps[%d] = %g\n", i, taps[i]);
       }
+
+      for(int i= ntaps/2; i<ntaps; i++) {
+	taps[i]=taps[i-ntaps/2];  // move the right half rightward
+      }
+      for(int i= ntaps/2; i<ntaps; i++) {
+	taps[ntaps-i]=taps[i];  // copy the reflected right half to left
+      }
+
+      temp = (1+ntaps/2) * inm1;
+      taps[0] = Izero(beta*sqrt(1.0-temp*temp)) * IBeta;
+      // taps[0] = 0 ?? or two 1.0 values in the middle?
     }
     break;
 
@@ -792,7 +806,7 @@ gr_firdes::sanity_check_1f (double sampling_freq,
     throw std::out_of_range ("gr_firdes check failed: 0 < fa <= sampling_freq / 2");
 
   if (transition_width <= 0)
-    throw std::out_of_range ("gr_dirdes check failed: transition_width > 0");
+    throw std::out_of_range ("gr_firdes check failed: transition_width > 0");
 }
 
 void
diff --git a/gr-filter/lib/firdes.cc b/gr-filter/lib/firdes.cc
index 5c3320d..3b990fe 100644
--- a/gr-filter/lib/firdes.cc
+++ b/gr-filter/lib/firdes.cc
@@ -26,6 +26,9 @@
 
 #include <filter/firdes.h>
 #include <stdexcept>
+#if 0
+#include <cstdio>  // fprintf(),printf()
+#endif
 
 using std::vector;
 
@@ -746,6 +749,7 @@ namespace gr {
       case WIN_RECTANGULAR:
 	for(int n = 0; n < ntaps; n++)
 	  taps[n] = 1;
+	break;
 
       case WIN_HAMMING:
 	for(int n = 0; n < ntaps; n++)
@@ -763,7 +767,7 @@ namespace gr {
 	    - 0.08 * cos((4*M_PI * n) / (M-1));
 	break;
 
-      case WIN_BLACKMAN_hARRIS:
+      case WIN_BLACKMAN_HARRIS:
 	for(int n = -ntaps/2; n < ntaps/2; n++)
 	  taps[n+ntaps/2] = 0.35875 + 0.48829*cos((2*M_PI * n) / (float)M) +
 	    0.14128*cos((4*M_PI * n) / (float)M) + 0.01168*cos((6*M_PI * n) / (float)M);
@@ -776,14 +780,25 @@ namespace gr {
 	  double temp;
 	  //fprintf(stderr, "IBeta = %g; inm1 = %g\n", IBeta, inm1);
 	  
-	  for(int i=0; i<ntaps; i++) {
+	  for(int i= 0; i<ntaps/2; i++) {
 	    temp = i * inm1;
 	    //fprintf(stderr, "temp = %g\n", temp);
 	    taps[i] = Izero(beta*sqrt(1.0-temp*temp)) * IBeta;
 	    //fprintf(stderr, "taps[%d] = %g\n", i, taps[i]);
 	  }
+
+	  for(int i= ntaps/2; i<ntaps; i++) {
+	      taps[i]=taps[i-ntaps/2];  // move the right half rightward
+	  }
+	  for(int i= ntaps/2; i<ntaps; i++) {
+	      taps[ntaps-i]=taps[i];  // copy the reflected right half to left
+	  }
+
+	  temp = (1+ntaps/2) * inm1;
+	  taps[0] = Izero(beta*sqrt(1.0-temp*temp)) * IBeta;
+	  // taps[0] = 0 ?? or two 1.0 values in the middle?
 	}
-      break;
+	break;
 
       default:
 	throw std::out_of_range("firdes:window: type out of range");
@@ -804,7 +819,7 @@ namespace gr {
 	throw std::out_of_range("firdes check failed: 0 < fa <= sampling_freq / 2");
 
       if(transition_width <= 0)
-	throw std::out_of_range("gr_dirdes check failed: transition_width > 0");
+	throw std::out_of_range("gr_firdes check failed: transition_width > 0");
     }
 
     void
