@Override
  public void removeTap(Tap tap) {
    if (mSymbolFilter != null) {
      mSymbolFilter.removeTap(tap);
    }

    if (mCQPSKDemodulator != null) {
      mCQPSKDemodulator.removeTap(tap);
    }

    switch (tap.getName()) {
      case INSTRUMENT_COMPLEX_INPUT:
        removeComplexListener((ComplexTap) tap);
        break;
      case INSTRUMENT_BASEBAND_FILTER_OUTPUT:
        mBasebandFilter.setListener(mAGC);
        break;
      case INSTRUMENT_AGC_OUTPUT:
        mAGC.setListener(mCQPSKDemodulator);
        break;
      case INSTRUMENT_QPSK_DEMODULATOR_OUTPUT:
        mCQPSKDemodulator.setListener(mCQPSKSlicer);
        break;
      case INSTRUMENT_CQPSK_SLICER_OUTPUT:
        mCQPSKSlicer.removeListener((DibitTap) tap);
        break;
      case INSTRUMENT_REAL_INPUT:
        FloatTap inputAGC = (FloatTap) tap;
        removeRealListener(inputAGC);
        addRealSampleListener(mDGC);
        break;
      case INSTRUMENT_DGC_OUTPUT:
        mDGC.setListener(mSymbolFilter);
        break;
      case INSTRUMENT_C4FM_SYMBOL_FILTER_OUTPUT:
        mSymbolFilter.setListener(mC4FMSlicer);
        break;
      case INSTRUMENT_C4FM_SLICER_OUTPUT:
        DibitTap slicerTap = (DibitTap) tap;

        if (mC4FMSlicer != null) {
          mC4FMSlicer.removeListener(slicerTap);
        }
        break;
    }
  }