diff --git a/LCS/MSLofar/include/MSLofar/CMakeLists.txt b/LCS/MSLofar/include/MSLofar/CMakeLists.txt
index 70fadb214da25fa3f5359db536ebfef13b31847d..497be378c53e42780929669e737cf03224b1f8cd 100644
--- a/LCS/MSLofar/include/MSLofar/CMakeLists.txt
+++ b/LCS/MSLofar/include/MSLofar/CMakeLists.txt
@@ -12,6 +12,10 @@ set (inst_HEADERS
   MSAntennaFieldColumns.h
   MSElementFailure.h
   MSElementFailureColumns.h
+  MSLofarAntenna.h
+  MSLofarAntennaColumns.h
+  MSLofarObservation.h
+  MSLofarObsColumns.h
   MSStation.h
   MSStationColumns.h
   BeamTables.h
diff --git a/LCS/MSLofar/include/MSLofar/MSLofarAntenna.h b/LCS/MSLofar/include/MSLofar/MSLofarAntenna.h
new file mode 100644
index 0000000000000000000000000000000000000000..fca81f065cdc394c786ca3ad1d72df4ab3e65e01
--- /dev/null
+++ b/LCS/MSLofar/include/MSLofar/MSLofarAntenna.h
@@ -0,0 +1,65 @@
+//# MSLofarAntenna.h: LOFAR MS ANTENNA_FIELD subtable
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#ifndef MSLOFAR_MSLOFARANTENNA_H
+#define MSLOFAR_MSLOFARANTENNA_H
+
+#include <ms/MeasurementSets/MSAntenna.h>
+#include <MSLofar/MSLofarTable.h>
+
+namespace LOFAR {
+
+  class MSLofarAntenna: public casa::MSAntenna
+  {
+  public:
+
+    // Default constructor creates an unusable object.
+    MSLofarAntenna();
+
+    // Create from an existing table.
+    MSLofarAntenna (const casa::String& tableName,
+                    casa::Table::TableOption option);
+
+    // Create a new table.
+    MSLofarAntenna (casa::SetupNewTable& newTab, casa::uInt nrrow,
+                    casa::Bool initialize);
+
+    // Create from an existing Table object.
+    MSLofarAntenna (const casa::Table& table);
+
+    // Copy constructor (reference semnatics).
+    MSLofarAntenna (const MSLofarAntenna& that);
+
+    // The destructor flushes the table if not done yet.
+    ~MSLofarAntenna();
+
+    // Assignment (reference semantics).
+    MSLofarAntenna& operator= (const MSLofarAntenna& that);
+  
+    // Create the table description containing the required columns. 
+    static casa::TableDesc requiredTableDesc();
+  };
+
+} //# end namespace
+
+#endif
diff --git a/LCS/MSLofar/include/MSLofar/MSLofarAntennaColumns.h b/LCS/MSLofar/include/MSLofar/MSLofarAntennaColumns.h
new file mode 100644
index 0000000000000000000000000000000000000000..41d00434c57c48742a05920ad028fe0f500a4b37
--- /dev/null
+++ b/LCS/MSLofar/include/MSLofar/MSLofarAntennaColumns.h
@@ -0,0 +1,153 @@
+//# MSLofarAntennaColumns.h: provides easy access to LOFAR's MSAntenna columns
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#ifndef MSLOFAR_MSLOFARANTENNACOLUMNS_H
+#define MSLOFAR_MSLOFARANTENNACOLUMNS_H
+
+#include <ms/MeasurementSets/MSAntennaColumns.h>
+
+namespace LOFAR {
+
+  //# Forward Declaration
+  class MSLofarAntenna;
+
+  // This class provides read-only access to the columns in the MSLofarAntenna
+  // Table. It does the declaration of all the Scalar and ArrayColumns with the
+  // correct types, so the application programmer doesn't have to worry about
+  // getting those right. There is an access function for every predefined
+  // column. Access to non-predefined columns will still have to be done with
+  // explicit declarations.
+
+  class ROMSLofarAntennaColumns: public casa::ROMSAntennaColumns
+  {
+  public:
+
+    // Create a columns object that accesses the data in the specified Table.
+    ROMSLofarAntennaColumns(const MSLofarAntenna& msLofarAntenna);
+
+    // The destructor does nothing special.
+    ~ROMSLofarAntennaColumns();
+
+    // Access to columns.
+    // <group>
+    const casa::ROScalarColumn<casa::Int>& stationId() const
+      { return stationId_p; }
+    const casa::ROArrayColumn<casa::Double>& phaseReference() const
+      { return phaseReference_p; }
+    const casa::ROArrayQuantColumn<casa::Double>& phaseReferenceQuant() const 
+      { return phaseReferenceQuant_p; }
+    const casa::ROScalarMeasColumn<casa::MPosition>& phaseReferenceMeas() const 
+      { return phaseReferenceMeas_p; }
+    // </group>
+
+  protected:
+    //# Default constructor creates a object that is not usable. Use the attach
+    //# function correct this.
+    ROMSLofarAntennaColumns();
+
+    //# Attach this object to the supplied table.
+    void attach (const MSLofarAntenna& msLofarAntenna);
+
+  private:
+    //# Make the assignment operator and the copy constructor private to prevent
+    //# any compiler generated one from being used.
+    ROMSLofarAntennaColumns(const ROMSLofarAntennaColumns&);
+    ROMSLofarAntennaColumns& operator=(const ROMSLofarAntennaColumns&);
+
+    //# required columns
+    casa::ROScalarColumn<casa::Int> stationId_p;
+    casa::ROArrayColumn<casa::Double> phaseReference_p;
+    //# Access to Measure columns
+    casa::ROScalarMeasColumn<casa::MPosition> phaseReferenceMeas_p;
+    //# Access to Quantum columns
+    casa::ROArrayQuantColumn<casa::Double> phaseReferenceQuant_p;
+  };
+
+
+  // This class provides read/write access to the columns in the MSLofarAntenna
+  // Table. It does the declaration of all the Scalar and ArrayColumns with the
+  // correct types, so the application programmer doesn't have to
+  // worry about getting those right. There is an access function
+  // for every predefined column. Access to non-predefined columns will still
+  // have to be done with explicit declarations.
+
+  class MSLofarAntennaColumns: public casa::MSAntennaColumns
+  {
+  public:
+
+    // Create a columns object that accesses the data in the specified Table.
+    MSLofarAntennaColumns(MSLofarAntenna& msLofarAntenna);
+
+    // The destructor does nothing special.
+    ~MSLofarAntennaColumns();
+
+    // Read-write access to required columns.
+    // <group>
+    const casa::ROScalarColumn<casa::Int>& stationId() const
+      { return roStationId_p; }
+    casa::ScalarColumn<casa::Int>& stationId()
+      { return rwStationId_p; }
+    const casa::ROArrayColumn<casa::Double>& phaseReference() const
+      { return roPhaseReference_p; }
+    casa::ArrayColumn<casa::Double>& phaseReference()
+      { return rwPhaseReference_p; }
+    const casa::ROArrayQuantColumn<casa::Double>& phaseReferenceQuant() const 
+      { return roPhaseReferenceQuant_p; }
+    casa::ArrayQuantColumn<casa::Double>& phaseReferenceQuant()
+      { return rwPhaseReferenceQuant_p; }
+    casa::ROScalarMeasColumn<casa::MPosition>& phaseReferenceMeas()
+      { return roPhaseReferenceMeas_p; }
+    const casa::ScalarMeasColumn<casa::MPosition>& phaseReferenceMeas() const 
+      { return rwPhaseReferenceMeas_p; }
+    // </group>
+
+  protected:
+    //# Default constructor creates a object that is not usable. Use the attach
+    //# function correct this.
+    MSLofarAntennaColumns();
+
+    //# Attach this object to the supplied table.
+    void attach(MSLofarAntenna& msLofarAntenna);
+
+  private:
+    //# Make the assignment operator and the copy constructor private to prevent
+    //# any compiler generated one from being used.
+    MSLofarAntennaColumns(const MSLofarAntennaColumns&);
+    MSLofarAntennaColumns& operator=(const MSLofarAntennaColumns&);
+
+    //# required columns
+    casa::ROScalarColumn<casa::Int> roStationId_p;
+    casa::ScalarColumn<casa::Int>   rwStationId_p;
+    casa::ROArrayColumn<casa::Double> roPhaseReference_p;
+    casa::ArrayColumn<casa::Double>   rwPhaseReference_p;
+    //# Access to Measure columns
+    casa::ROScalarMeasColumn<casa::MPosition> roPhaseReferenceMeas_p;
+    casa::ScalarMeasColumn<casa::MPosition>   rwPhaseReferenceMeas_p;
+    //# Access to Quantum columns
+    casa::ROArrayQuantColumn<casa::Double> roPhaseReferenceQuant_p;
+    casa::ArrayQuantColumn<casa::Double>   rwPhaseReferenceQuant_p;
+  };
+
+} //# end namespace
+
+#endif
diff --git a/LCS/MSLofar/include/MSLofar/MSLofarObsColumns.h b/LCS/MSLofar/include/MSLofar/MSLofarObsColumns.h
new file mode 100644
index 0000000000000000000000000000000000000000..253a10186bb3ba813cc7de4cd83f692975327fc9
--- /dev/null
+++ b/LCS/MSLofar/include/MSLofar/MSLofarObsColumns.h
@@ -0,0 +1,427 @@
+//# MSLofarObsColumns.h: provides easy access to LOFAR's MSObservation columns
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#ifndef MSLOFAR_MSLOFAROBSCOLUMNS_H
+#define MSLOFAR_MSLOFAROBSCOLUMNS_H
+
+#include <ms/MeasurementSets/MSObsColumns.h>
+
+namespace LOFAR {
+
+  //# Forward Declaration
+  class MSLofarObservation;
+
+  // This class provides read-only access to the columns in the MSLofarObservation
+  // Table. It does the declaration of all the Scalar and ArrayColumns with the
+  // correct types, so the application programmer doesn't have to worry about
+  // getting those right. There is an access function for every predefined
+  // column. Access to non-predefined columns will still have to be done with
+  // explicit declarations.
+
+  class ROMSLofarObservationColumns: public casa::ROMSObservationColumns
+  {
+  public:
+
+    // Create a columns object that accesses the data in the specified Table.
+    ROMSLofarObservationColumns(const MSLofarObservation& msLofarObservation);
+
+    // The destructor does nothing special.
+    ~ROMSLofarObservationColumns();
+
+    // Access to columns.
+    // <group>
+    const casa::ROScalarColumn<casa::String>& projectTitle() const
+      { return projectTitle_p; }
+    const casa::ROScalarColumn<casa::String>& projectPI() const
+      { return projectPI_p; }
+    const casa::ROArrayColumn<casa::String>& projectCoI() const
+      { return projectCoI_p; }
+    const casa::ROScalarColumn<casa::String>& projectContact() const
+      { return projectContact_p; }
+    const casa::ROScalarColumn<casa::String>& observationId() const
+      { return observationId_p; }
+    const casa::ROScalarColumn<casa::Double>& observationStart() const
+      { return observationStart_p; }
+    const casa::ROScalarColumn<casa::Double>& observationEnd() const
+      { return observationEnd_p; }
+    const casa::ROScalarColumn<casa::Double>& observationFrequencyMax() const
+      { return observationFrequencyMax_p; }
+    const casa::ROScalarColumn<casa::Double>& observationFrequencyMin() const
+      { return observationFrequencyMin_p; }
+    const casa::ROScalarColumn<casa::Double>& observationFrequencyCenter() const
+      { return observationFrequencyCenter_p; }
+    const casa::ROScalarColumn<casa::Int>& subArrayPointing() const
+      { return subArrayPointing_p; }
+    const casa::ROScalarColumn<casa::String>& antennaSet() const
+      { return antennaSet_p; }
+    const casa::ROScalarColumn<casa::String>& filterSelection() const
+      { return filterSelection_p; }
+    const casa::ROScalarColumn<casa::Double>& clockFrequency() const
+      { return clockFrequency_p; }
+    const casa::ROArrayColumn<casa::String>& target() const
+      { return target_p; }
+    const casa::ROScalarColumn<casa::String>& systemVersion() const
+      { return systemVersion_p; }
+    const casa::ROScalarColumn<casa::String>& pipelineName() const
+      { return pipelineName_p; }
+    const casa::ROScalarColumn<casa::String>& pipelineVersion() const
+      { return pipelineVersion_p; }
+    const casa::ROScalarColumn<casa::String>& fileName() const
+      { return fileName_p; }
+    const casa::ROScalarColumn<casa::String>& fileType() const
+      { return fileType_p; }
+    const casa::ROScalarColumn<casa::Double>& fileDate() const
+      { return fileDate_p; }
+    // </group>
+
+    // Access to Quantity columns
+    // <group>
+    const casa::ROScalarQuantColumn<casa::Double>& observationStartQuant() const 
+      { return observationStartQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationEndQuant() const 
+      { return observationEndQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationFrequencyMaxQuant() const 
+      { return observationFrequencyMaxQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationFrequencyMinQuant() const 
+      { return observationFrequencyMinQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& clockFrequencyQuant() const 
+      { return clockFrequencyQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationFrequencyCenterQuant() const 
+      { return observationFrequencyCenterQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& fileDateQuant() const 
+      { return fileDateQuant_p; }
+    // </group>
+
+    // Access to Measure columns
+    // <group>
+    const casa::ROScalarMeasColumn<casa::MEpoch>& observationStartMeas() const 
+      { return observationStartMeas_p; }
+    const casa::ROScalarMeasColumn<casa::MEpoch>& observationEndMeas() const 
+      { return observationEndMeas_p; }
+    const casa::ROScalarMeasColumn<casa::MEpoch>& fileDateMeas() const 
+      { return fileDateMeas_p; }
+    // </group>
+
+  protected:
+    //# Default constructor creates a object that is not usable. Use the attach
+    //# function correct this.
+    ROMSLofarObservationColumns();
+
+    //# Attach this object to the supplied table.
+    void attach (const MSLofarObservation& msLofarObservation);
+
+  private:
+    //# Make the assignment operator and the copy constructor private to prevent
+    //# any compiler generated one from being used.
+    ROMSLofarObservationColumns(const ROMSLofarObservationColumns&);
+    ROMSLofarObservationColumns& operator=(const ROMSLofarObservationColumns&);
+
+    //# required columns
+    casa::ROScalarColumn<casa::String> projectTitle_p;
+    casa::ROScalarColumn<casa::String> projectPI_p;
+    casa::ROArrayColumn<casa::String>  projectCoI_p;
+    casa::ROScalarColumn<casa::String> projectContact_p;
+    casa::ROScalarColumn<casa::String> observationId_p;
+    casa::ROScalarColumn<casa::Double> observationStart_p;
+    casa::ROScalarColumn<casa::Double> observationEnd_p;
+    casa::ROScalarColumn<casa::Double> observationFrequencyMax_p;
+    casa::ROScalarColumn<casa::Double> observationFrequencyMin_p;
+    casa::ROScalarColumn<casa::Double> observationFrequencyCenter_p;
+    casa::ROScalarColumn<casa::Int>    subArrayPointing_p;
+    casa::ROScalarColumn<casa::String> antennaSet_p;
+    casa::ROScalarColumn<casa::String> filterSelection_p;
+    casa::ROScalarColumn<casa::Double> clockFrequency_p;
+    casa::ROArrayColumn<casa::String>  target_p;
+    casa::ROScalarColumn<casa::String> systemVersion_p;
+    casa::ROScalarColumn<casa::String> pipelineName_p;
+    casa::ROScalarColumn<casa::String> pipelineVersion_p;
+    casa::ROScalarColumn<casa::String> fileName_p;
+    casa::ROScalarColumn<casa::String> fileType_p;
+    casa::ROScalarColumn<casa::Double> fileDate_p;
+    //# Access to Quantum columns
+    casa::ROScalarQuantColumn<casa::Double> observationStartQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> observationEndQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> observationFrequencyMaxQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> observationFrequencyMinQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> observationFrequencyCenterQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> clockFrequencyQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> fileDateQuant_p;
+    //# Access to Measure columns
+    casa::ROScalarMeasColumn<casa::MEpoch> observationStartMeas_p;
+    casa::ROScalarMeasColumn<casa::MEpoch> observationEndMeas_p;
+    casa::ROScalarMeasColumn<casa::MEpoch> fileDateMeas_p;
+  };
+
+
+  // This class provides read/write access to the columns in the MSLofarObservation
+  // Table. It does the declaration of all the Scalar and ArrayColumns with the
+  // correct types, so the application programmer doesn't have to
+  // worry about getting those right. There is an access function
+  // for every predefined column. Access to non-predefined columns will still
+  // have to be done with explicit declarations.
+
+  class MSLofarObservationColumns: public casa::MSObservationColumns
+  {
+  public:
+
+    // Create a columns object that accesses the data in the specified Table.
+    MSLofarObservationColumns(MSLofarObservation& msLofarObservation);
+
+    // The destructor does nothing special.
+    ~MSLofarObservationColumns();
+
+    // Readonly access to columns.
+    // <group>
+    const casa::ROScalarColumn<casa::String>& projectTitle() const
+      { return roProjectTitle_p; }
+    const casa::ROScalarColumn<casa::String>& projectPI() const
+      { return roProjectPI_p; }
+    const casa::ROArrayColumn<casa::String>& projectCoI() const
+      { return roProjectCoI_p; }
+    const casa::ROScalarColumn<casa::String>& projectContact() const
+      { return roProjectContact_p; }
+    const casa::ROScalarColumn<casa::String>& observationId() const
+      { return roObservationId_p; }
+    const casa::ROScalarColumn<casa::Double>& observationStart() const
+      { return roObservationStart_p; }
+    const casa::ROScalarColumn<casa::Double>& observationEnd() const
+      { return roObservationEnd_p; }
+    const casa::ROScalarColumn<casa::Double>& observationFrequencyMax() const
+      { return roObservationFrequencyMax_p; }
+    const casa::ROScalarColumn<casa::Double>& observationFrequencyMin() const
+      { return roObservationFrequencyMin_p; }
+    const casa::ROScalarColumn<casa::Double>& observationFrequencyCenter() const
+      { return roObservationFrequencyCenter_p; }
+    const casa::ROScalarColumn<casa::Int>& subArrayPointing() const
+      { return roSubArrayPointing_p; }
+    const casa::ROScalarColumn<casa::String>& antennaSet() const
+      { return roAntennaSet_p; }
+    const casa::ROScalarColumn<casa::String>& filterSelection() const
+      { return roFilterSelection_p; }
+    const casa::ROScalarColumn<casa::Double>& clockFrequency() const
+      { return roClockFrequency_p; }
+    const casa::ROArrayColumn<casa::String>& target() const
+      { return roTarget_p; }
+    const casa::ROScalarColumn<casa::String>& systemVersion() const
+      { return roSystemVersion_p; }
+    const casa::ROScalarColumn<casa::String>& pipelineName() const
+      { return roPipelineName_p; }
+    const casa::ROScalarColumn<casa::String>& pipelineVersion() const
+      { return roPipelineVersion_p; }
+    const casa::ROScalarColumn<casa::String>& fileName() const
+      { return roFileName_p; }
+    const casa::ROScalarColumn<casa::String>& fileType() const
+      { return roFileType_p; }
+    const casa::ROScalarColumn<casa::Double>& fileDate() const
+      { return roFileDate_p; }
+    // </group>
+
+    // Readonly access to Quantity columns
+    // <group>
+    const casa::ROScalarQuantColumn<casa::Double>& observationStartQuant() const 
+      { return roObservationStartQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationEndQuant() const 
+      { return roObservationEndQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationFrequencyMaxQuant() const 
+      { return roObservationFrequencyMaxQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationFrequencyMinQuant() const 
+      { return roObservationFrequencyMinQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& observationFrequencyCenterQuant() const 
+      { return roObservationFrequencyCenterQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& clockFrequencyQuant() const 
+      { return roClockFrequencyQuant_p; }
+    const casa::ROScalarQuantColumn<casa::Double>& fileDateQuant() const 
+      { return roFileDateQuant_p; }
+    // </group>
+
+    // Readonly access to Measure columns
+    // <group>
+    const casa::ROScalarMeasColumn<casa::MEpoch>& observationStartMeas() const 
+      { return roObservationStartMeas_p; }
+    const casa::ROScalarMeasColumn<casa::MEpoch>& observationEndMeas() const 
+      { return roObservationEndMeas_p; }
+    const casa::ROScalarMeasColumn<casa::MEpoch>& fileDateMeas() const 
+      { return roFileDateMeas_p; }
+    // </group>
+
+    // Read/write access to columns.
+    // <group>
+    casa::ScalarColumn<casa::String>& projectTitle()
+      { return rwProjectTitle_p; }
+    casa::ScalarColumn<casa::String>& projectPI()
+      { return rwProjectPI_p; }
+    casa::ArrayColumn<casa::String>& projectCoI()
+      { return rwProjectCoI_p; }
+    casa::ScalarColumn<casa::String>& projectContact()
+      { return rwProjectContact_p; }
+    casa::ScalarColumn<casa::String>& observationId()
+      { return rwObservationId_p; }
+    casa::ScalarColumn<casa::Double>& observationStart()
+      { return rwObservationStart_p; }
+    casa::ScalarColumn<casa::Double>& observationEnd()
+      { return rwObservationEnd_p; }
+    casa::ScalarColumn<casa::Double>& observationFrequencyMax()
+      { return rwObservationFrequencyMax_p; }
+    casa::ScalarColumn<casa::Double>& observationFrequencyMin()
+      { return rwObservationFrequencyMin_p; }
+    casa::ScalarColumn<casa::Double>& observationFrequencyCenter()
+      { return rwObservationFrequencyCenter_p; }
+    casa::ScalarColumn<casa::Int>& subArrayPointing()
+      { return rwSubArrayPointing_p; }
+    casa::ScalarColumn<casa::String>& antennaSet()
+      { return rwAntennaSet_p; }
+    casa::ScalarColumn<casa::String>& filterSelection()
+      { return rwFilterSelection_p; }
+    casa::ScalarColumn<casa::Double>& clockFrequency()
+      { return rwClockFrequency_p; }
+    casa::ArrayColumn<casa::String>& target()
+      { return rwTarget_p; }
+    casa::ScalarColumn<casa::String>& systemVersion()
+      { return rwSystemVersion_p; }
+    casa::ScalarColumn<casa::String>& pipelineName()
+      { return rwPipelineName_p; }
+    casa::ScalarColumn<casa::String>& pipelineVersion()
+      { return rwPipelineVersion_p; }
+    casa::ScalarColumn<casa::String>& fileName()
+      { return rwFileName_p; }
+    casa::ScalarColumn<casa::String>& fileType()
+      { return rwFileType_p; }
+    casa::ScalarColumn<casa::Double>& fileDate()
+      { return rwFileDate_p; }
+    // </group>
+
+    // Read/write access to Quantity columns
+    // <group>
+    casa::ScalarQuantColumn<casa::Double>& observationStartQuant() 
+      { return rwObservationStartQuant_p; }
+    casa::ScalarQuantColumn<casa::Double>& observationEndQuant() 
+      { return rwObservationEndQuant_p; }
+    casa::ScalarQuantColumn<casa::Double>& observationFrequencyMaxQuant() 
+      { return rwObservationFrequencyMaxQuant_p; }
+    casa::ScalarQuantColumn<casa::Double>& observationFrequencyMinQuant() 
+      { return rwObservationFrequencyMinQuant_p; }
+    casa::ScalarQuantColumn<casa::Double>& observationFrequencyCenterQuant() 
+      { return rwObservationFrequencyCenterQuant_p; }
+    casa::ScalarQuantColumn<casa::Double>& clockFrequencyQuant() 
+      { return rwClockFrequencyQuant_p; }
+    casa::ScalarQuantColumn<casa::Double>& fileDateQuant() 
+      { return rwFileDateQuant_p; }
+    // </group>
+
+    // Read/write access to Measure columns
+    // <group>
+    casa::ScalarMeasColumn<casa::MEpoch>& observationStartMeas() 
+      { return rwObservationStartMeas_p; }
+    casa::ScalarMeasColumn<casa::MEpoch>& observationEndMeas() 
+      { return rwObservationEndMeas_p; }
+    casa::ScalarMeasColumn<casa::MEpoch>& fileDateMeas() 
+      { return rwFileDateMeas_p; }
+    // </group>
+
+  protected:
+    //# Default constructor creates a object that is not usable. Use the attach
+    //# function correct this.
+    MSLofarObservationColumns();
+
+    //# Attach this object to the supplied table.
+    void attach(MSLofarObservation& msLofarObservation);
+
+  private:
+    //# Make the assignment operator and the copy constructor private to prevent
+    //# any compiler generated one from being used.
+    MSLofarObservationColumns(const MSLofarObservationColumns&);
+    MSLofarObservationColumns& operator=(const MSLofarObservationColumns&);
+
+    //# required columns
+    casa::ROScalarColumn<casa::String> roProjectTitle_p;
+    casa::ROScalarColumn<casa::String> roProjectPI_p;
+    casa::ROArrayColumn<casa::String>  roProjectCoI_p;
+    casa::ROScalarColumn<casa::String> roProjectContact_p;
+    casa::ROScalarColumn<casa::String> roObservationId_p;
+    casa::ROScalarColumn<casa::Double> roObservationStart_p;
+    casa::ROScalarColumn<casa::Double> roObservationEnd_p;
+    casa::ROScalarColumn<casa::Double> roObservationFrequencyMax_p;
+    casa::ROScalarColumn<casa::Double> roObservationFrequencyMin_p;
+    casa::ROScalarColumn<casa::Double> roObservationFrequencyCenter_p;
+    casa::ROScalarColumn<casa::Int>    roSubArrayPointing_p;
+    casa::ROScalarColumn<casa::String> roAntennaSet_p;
+    casa::ROScalarColumn<casa::String> roFilterSelection_p;
+    casa::ROScalarColumn<casa::Double> roClockFrequency_p;
+    casa::ROArrayColumn<casa::String>  roTarget_p;
+    casa::ROScalarColumn<casa::String> roSystemVersion_p;
+    casa::ROScalarColumn<casa::String> roPipelineName_p;
+    casa::ROScalarColumn<casa::String> roPipelineVersion_p;
+    casa::ROScalarColumn<casa::String> roFileName_p;
+    casa::ROScalarColumn<casa::String> roFileType_p;
+    casa::ROScalarColumn<casa::Double> roFileDate_p;
+    //# Access to Quantum columns
+    casa::ROScalarQuantColumn<casa::Double> roObservationStartQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> roObservationEndQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> roObservationFrequencyMaxQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> roObservationFrequencyMinQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> roObservationFrequencyCenterQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> roClockFrequencyQuant_p;
+    casa::ROScalarQuantColumn<casa::Double> roFileDateQuant_p;
+    //# Access to Measure columns
+    casa::ROScalarMeasColumn<casa::MEpoch> roObservationStartMeas_p;
+    casa::ROScalarMeasColumn<casa::MEpoch> roObservationEndMeas_p;
+    casa::ROScalarMeasColumn<casa::MEpoch> roFileDateMeas_p;
+    //# required columns
+    casa::ScalarColumn<casa::String> rwProjectTitle_p;
+    casa::ScalarColumn<casa::String> rwProjectPI_p;
+    casa::ArrayColumn<casa::String>  rwProjectCoI_p;
+    casa::ScalarColumn<casa::String> rwProjectContact_p;
+    casa::ScalarColumn<casa::String> rwObservationId_p;
+    casa::ScalarColumn<casa::Double> rwObservationStart_p;
+    casa::ScalarColumn<casa::Double> rwObservationEnd_p;
+    casa::ScalarColumn<casa::Double> rwObservationFrequencyMax_p;
+    casa::ScalarColumn<casa::Double> rwObservationFrequencyMin_p;
+    casa::ScalarColumn<casa::Double> rwObservationFrequencyCenter_p;
+    casa::ScalarColumn<casa::Int>    rwSubArrayPointing_p;
+    casa::ScalarColumn<casa::String> rwAntennaSet_p;
+    casa::ScalarColumn<casa::String> rwFilterSelection_p;
+    casa::ScalarColumn<casa::Double> rwClockFrequency_p;
+    casa::ArrayColumn<casa::String>  rwTarget_p;
+    casa::ScalarColumn<casa::String> rwSystemVersion_p;
+    casa::ScalarColumn<casa::String> rwPipelineName_p;
+    casa::ScalarColumn<casa::String> rwPipelineVersion_p;
+    casa::ScalarColumn<casa::String> rwFileName_p;
+    casa::ScalarColumn<casa::String> rwFileType_p;
+    casa::ScalarColumn<casa::Double> rwFileDate_p;
+    //# Access to Quantum columns
+    casa::ScalarQuantColumn<casa::Double> rwObservationStartQuant_p;
+    casa::ScalarQuantColumn<casa::Double> rwObservationEndQuant_p;
+    casa::ScalarQuantColumn<casa::Double> rwObservationFrequencyMaxQuant_p;
+    casa::ScalarQuantColumn<casa::Double> rwObservationFrequencyMinQuant_p;
+    casa::ScalarQuantColumn<casa::Double> rwObservationFrequencyCenterQuant_p;
+    casa::ScalarQuantColumn<casa::Double> rwClockFrequencyQuant_p;
+    casa::ScalarQuantColumn<casa::Double> rwFileDateQuant_p;
+    //# Access to Measure columns
+    casa::ScalarMeasColumn<casa::MEpoch> rwObservationStartMeas_p;
+    casa::ScalarMeasColumn<casa::MEpoch> rwObservationEndMeas_p;
+    casa::ScalarMeasColumn<casa::MEpoch> rwFileDateMeas_p;
+  };
+
+} //# end namespace
+
+#endif
diff --git a/LCS/MSLofar/include/MSLofar/MSLofarObservation.h b/LCS/MSLofar/include/MSLofar/MSLofarObservation.h
new file mode 100644
index 0000000000000000000000000000000000000000..e12ce16382526f64be6b44320ae54f8c5b0477bf
--- /dev/null
+++ b/LCS/MSLofar/include/MSLofar/MSLofarObservation.h
@@ -0,0 +1,65 @@
+//# MSLofarObservation.h: LOFAR MS OBSERVATION_FIELD subtable
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#ifndef MSLOFAR_MSLOFAROBSERVATION_H
+#define MSLOFAR_MSLOFAROBSERVATION_H
+
+#include <ms/MeasurementSets/MSObservation.h>
+#include <MSLofar/MSLofarTable.h>
+
+namespace LOFAR {
+
+  class MSLofarObservation: public casa::MSObservation
+  {
+  public:
+
+    // Default constructor creates an unusable object.
+    MSLofarObservation();
+
+    // Create from an existing table.
+    MSLofarObservation (const casa::String& tableName,
+                    casa::Table::TableOption option);
+
+    // Create a new table.
+    MSLofarObservation (casa::SetupNewTable& newTab, casa::uInt nrrow,
+                    casa::Bool initialize);
+
+    // Create from an existing Table object.
+    MSLofarObservation (const casa::Table& table);
+
+    // Copy constructor (reference semnatics).
+    MSLofarObservation (const MSLofarObservation& that);
+
+    // The destructor flushes the table if not done yet.
+    ~MSLofarObservation();
+
+    // Assignment (reference semantics).
+    MSLofarObservation& operator= (const MSLofarObservation& that);
+  
+    // Create the table description containing the required columns. 
+    static casa::TableDesc requiredTableDesc();
+  };
+
+} //# end namespace
+
+#endif
diff --git a/LCS/MSLofar/src/BeamTables.cc b/LCS/MSLofar/src/BeamTables.cc
index e7607e31eb38c66fdb07db3d95cef232fd85c0aa..0fd9334f9fa3091cd9c8eaf5666ea2886b427a78 100644
--- a/LCS/MSLofar/src/BeamTables.cc
+++ b/LCS/MSLofar/src/BeamTables.cc
@@ -122,10 +122,12 @@ void BeamTables::create (Table& ms,
     blitz::Array<double,2> hbaOffsets;   // offsets of HBA dipoles in a tile
     bool done = false;
     int firstHbaOffset = 0;
-    if (antFieldName == "HBA") {
+    if (antFieldType == "HBA") {
       // Get the offsets of HBA dipoles w.r.t. tile center.
       hbaOffsets.reference (getHBADeltas (hbaDeltaPath + stationName +
                                           "-iHBADeltas.conf"));
+    }
+    if (antFieldName == "HBA") {
       // HBA can be split into HBA0 and HBA1.
       // They have to be written separately.
       if (antFieldName == "HBA") {
diff --git a/LCS/MSLofar/src/CMakeLists.txt b/LCS/MSLofar/src/CMakeLists.txt
index 7d0fd2c75f2a28fbcc58772b14d898180e9faeb4..b24b955e824ece802e99d9191c3b6090f89e8358 100644
--- a/LCS/MSLofar/src/CMakeLists.txt
+++ b/LCS/MSLofar/src/CMakeLists.txt
@@ -9,6 +9,10 @@ lofar_add_library(mslofar
   MSAntennaFieldColumns.cc
   MSElementFailure.cc
   MSElementFailureColumns.cc
+  MSLofarAntenna.cc
+  MSLofarAntennaColumns.cc
+  MSLofarObservation.cc
+  MSLofarObsColumns.cc
   MSStation.cc
   MSStationColumns.cc
   BeamTables.cc
diff --git a/LCS/MSLofar/src/MSLofar.cc b/LCS/MSLofar/src/MSLofar.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1ce628d1e12ad488002da3b03f382bee887d0b35
--- /dev/null
+++ b/LCS/MSLofar/src/MSLofar.cc
@@ -0,0 +1,418 @@
+//# MSLofar.cc: Class handling a LOFAR MeasurementSet
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#include<lofar_config.h>
+#include <MSLofar/MSLofar.h
+
+
+namespace LOFAR {
+
+  MeasurementSet::MeasurementSet()
+  {}
+
+  MeasurementSet::MeasurementSet(const String &tableName,
+                                 TableOption option) 
+    : MeasurementSet (tableName, option);
+  {
+    initRefs();
+  }
+
+  MeasurementSet::MeasurementSet(const String &tableName,
+                                 const TableLock& lockOptions,
+                                 TableOption option) 
+    : MeasurementSet (tableName, lockOptions, option);
+  {
+    initRefs();
+  }
+
+  MeasurementSet::MeasurementSet(SetupNewTable &newTab, uInt nrrow,
+                                 Bool initialize)
+    : MeasurementSet (newTab, nrrow, initialize);
+  {}
+
+  MeasurementSet::MeasurementSet(SetupNewTable &newTab,
+                                 const TableLock& lockOptions, uInt nrrow,
+                                 Bool initialize)
+    : MeasurementSet (newTab, lockOptions, nrrow, initialize);
+  {}
+
+  MeasurementSet::MeasurementSet(const Table &table)
+    : MeasurementSet (table)
+  {
+    initRefs();
+  }
+
+  MeasurementSet::MeasurementSet(const MeasurementSet &other)
+    : MeasurementSet (other)
+  {
+    if (!isNull()) initRefs();
+  }
+
+  MeasurementSet::~MeasurementSet()
+  {}
+
+  MeasurementSet& MeasurementSet::operator=(const MeasurementSet &other)
+{
+    if (&other != this) {
+      MeasurementSet::operator= (other);
+      if (!isNull()) initRefs(True);
+    }
+    return *this;
+}
+
+	
+  MeasurementSet MeasurementSet::referenceCopy(const String& newTableName, 
+                                               const Block<String>& writableColumns) const
+  {
+    return MSLofar (MeasurementSet::referenceCopy (newTableName,
+                                                   writableColumns));
+  }
+
+
+void MeasurementSet::initRefs(Bool clear)
+{
+  if (isNull()||clear) {
+    // clear subtable references
+    antenna_p=MSAntenna();
+    dataDesc_p=MSDataDescription();
+    doppler_p=MSDoppler();
+    feed_p=MSFeed();
+    field_p=MSField();
+    flagCmd_p=MSFlagCmd();
+    freqOffset_p=MSFreqOffset();
+    history_p=MSHistory();
+    observation_p=MSObservation();
+    pointing_p=MSPointing();
+    polarization_p=MSPolarization();
+    processor_p=MSProcessor();
+    source_p=MSSource();
+    spectralWindow_p=MSSpectralWindow();
+    state_p=MSState();
+    sysCal_p=MSSysCal();
+    weather_p=MSWeather();
+  }
+  if (!isNull()) {
+    // write the table info if needed
+    if (this->tableInfo().type()=="") {
+      String reqdType=this->tableInfo().type(TableInfo::MEASUREMENTSET);
+      this->tableInfo().setType(reqdType);
+      String reqdSubType=this->tableInfo().subType(TableInfo::MEASUREMENTSET);
+      this->tableInfo().setSubType(reqdSubType);
+      this->tableInfo().readmeAddLine("This is a MeasurementSet Table"
+				      " holding measurements from a Telescope");
+    }
+    if(this->tableOption() != Table::Scratch){
+      if (this->keywordSet().isDefined("ANTENNA"))
+	antenna_p=MSAntenna(this->keywordSet().asTable("ANTENNA", mainLock_p));
+      if (this->keywordSet().isDefined("DATA_DESCRIPTION"))
+	dataDesc_p=MSDataDescription(this->keywordSet().
+				     asTable("DATA_DESCRIPTION", mainLock_p));
+      if (this->keywordSet().isDefined("DOPPLER"))
+	doppler_p=MSDoppler(this->keywordSet().asTable("DOPPLER", mainLock_p));
+      if (this->keywordSet().isDefined("FEED"))
+	feed_p=MSFeed(this->keywordSet().asTable("FEED", mainLock_p));
+      if (this->keywordSet().isDefined("FIELD"))
+	field_p=MSField(this->keywordSet().asTable("FIELD", mainLock_p));
+      if (this->keywordSet().isDefined("FLAG_CMD"))
+	flagCmd_p=MSFlagCmd(this->keywordSet().asTable("FLAG_CMD", 
+						       mainLock_p));
+      if (this->keywordSet().isDefined("FREQ_OFFSET"))
+	freqOffset_p=MSFreqOffset(this->keywordSet().
+				  asTable("FREQ_OFFSET", mainLock_p));
+      if (this->keywordSet().isDefined("HISTORY"))
+	history_p=MSHistory(this->keywordSet().asTable("HISTORY", mainLock_p));
+      if (this->keywordSet().isDefined("OBSERVATION"))
+	observation_p=MSObservation(this->keywordSet().
+				    asTable("OBSERVATION",mainLock_p));
+      if (this->keywordSet().isDefined("POINTING"))
+	pointing_p=MSPointing(this->keywordSet().
+			      asTable("POINTING", mainLock_p));
+      if (this->keywordSet().isDefined("POLARIZATION"))
+	polarization_p=MSPolarization(this->keywordSet().
+				      asTable("POLARIZATION",mainLock_p));
+      if (this->keywordSet().isDefined("PROCESSOR"))
+	processor_p=MSProcessor(this->keywordSet().
+				asTable("PROCESSOR", mainLock_p));
+      if (this->keywordSet().isDefined("SOURCE"))
+	source_p=MSSource(this->keywordSet().asTable("SOURCE", mainLock_p));
+      if (this->keywordSet().isDefined("SPECTRAL_WINDOW"))
+	spectralWindow_p=MSSpectralWindow(this->keywordSet().
+					  asTable("SPECTRAL_WINDOW",mainLock_p));
+      if (this->keywordSet().isDefined("STATE"))
+	state_p=MSState(this->keywordSet().asTable("STATE", mainLock_p));
+      if (this->keywordSet().isDefined("SYSCAL"))
+	sysCal_p=MSSysCal(this->keywordSet().asTable("SYSCAL", mainLock_p));
+      if (this->keywordSet().isDefined("WEATHER"))
+	weather_p=MSWeather(this->keywordSet().asTable("WEATHER", mainLock_p));
+    }
+    else{ //if its scratch...don't bother about the lock as 
+          //We can't close and reopen subtables hence we can't use the version 
+      //of astable that does that.
+      if (this->keywordSet().isDefined("ANTENNA"))
+	antenna_p=MSAntenna(this->keywordSet().asTable("ANTENNA"));
+      if (this->keywordSet().isDefined("DATA_DESCRIPTION"))
+	dataDesc_p=MSDataDescription(this->keywordSet().
+				     asTable("DATA_DESCRIPTION"));
+      if (this->keywordSet().isDefined("DOPPLER"))
+	doppler_p=MSDoppler(this->keywordSet().asTable("DOPPLER"));
+      if (this->keywordSet().isDefined("FEED"))
+	feed_p=MSFeed(this->keywordSet().asTable("FEED"));
+      if (this->keywordSet().isDefined("FIELD"))
+	field_p=MSField(this->keywordSet().asTable("FIELD"));
+      if (this->keywordSet().isDefined("FLAG_CMD"))
+	flagCmd_p=MSFlagCmd(this->keywordSet().asTable("FLAG_CMD"));
+      if (this->keywordSet().isDefined("FREQ_OFFSET"))
+	freqOffset_p=MSFreqOffset(this->keywordSet().
+				  asTable("FREQ_OFFSET"));
+      if (this->keywordSet().isDefined("HISTORY"))
+	history_p=MSHistory(this->keywordSet().asTable("HISTORY"));
+      if (this->keywordSet().isDefined("OBSERVATION"))
+	observation_p=MSObservation(this->keywordSet().
+				    asTable("OBSERVATION"));
+      if (this->keywordSet().isDefined("POINTING"))
+	pointing_p=MSPointing(this->keywordSet().
+			      asTable("POINTING"));
+      if (this->keywordSet().isDefined("POLARIZATION"))
+	polarization_p=MSPolarization(this->keywordSet().
+				      asTable("POLARIZATION"));
+      if (this->keywordSet().isDefined("PROCESSOR"))
+	processor_p=MSProcessor(this->keywordSet().
+				asTable("PROCESSOR"));
+      if (this->keywordSet().isDefined("SOURCE"))
+	source_p=MSSource(this->keywordSet().asTable("SOURCE"));
+      if (this->keywordSet().isDefined("SPECTRAL_WINDOW"))
+	spectralWindow_p=MSSpectralWindow(this->keywordSet().
+					  asTable("SPECTRAL_WINDOW"));
+      if (this->keywordSet().isDefined("STATE"))
+	state_p=MSState(this->keywordSet().asTable("STATE"));
+      if (this->keywordSet().isDefined("SYSCAL"))
+	sysCal_p=MSSysCal(this->keywordSet().asTable("SYSCAL"));
+      if (this->keywordSet().isDefined("WEATHER"))
+	weather_p=MSWeather(this->keywordSet().asTable("WEATHER"));
+
+
+    }
+  }
+}
+
+void MeasurementSet::createDefaultSubtables(Table::TableOption option)
+{
+    SetupNewTable antennaSetup(antennaTableName(),
+			       MSAntenna::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::ANTENNA),
+			       Table(antennaSetup));
+    SetupNewTable dataDescSetup(dataDescriptionTableName(),
+			       MSDataDescription::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::DATA_DESCRIPTION), 
+			       Table(dataDescSetup));
+    SetupNewTable feedSetup(feedTableName(),
+			       MSFeed::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::FEED), Table(feedSetup));
+    SetupNewTable flagCmdSetup(flagCmdTableName(),
+			       MSFlagCmd::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::FLAG_CMD), 
+			       Table(flagCmdSetup));
+    SetupNewTable fieldSetup(fieldTableName(),
+			       MSField::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::FIELD), Table(fieldSetup));
+    SetupNewTable historySetup(historyTableName(),
+			       MSHistory::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::HISTORY), 
+			       Table(historySetup));
+    SetupNewTable observationSetup(observationTableName(),
+			       MSObservation::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::OBSERVATION), 
+			       Table(observationSetup));
+    SetupNewTable pointingSetup(pointingTableName(),
+			       MSPointing::requiredTableDesc(),option);
+    // Pointing table can be large, set some sensible defaults for storageMgrs
+    IncrementalStMan ismPointing ("ISMPointing");
+    StandardStMan ssmPointing("SSMPointing",32768);
+    pointingSetup.bindAll(ismPointing,True);
+    pointingSetup.bindColumn(MSPointing::columnName(MSPointing::ANTENNA_ID),
+			     ssmPointing);
+    rwKeywordSet().defineTable(MS::keywordName(MS::POINTING),
+			       Table(pointingSetup));
+    SetupNewTable polarizationSetup(polarizationTableName(),
+			       MSPolarization::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::POLARIZATION),
+			       Table(polarizationSetup));
+    SetupNewTable processorSetup(processorTableName(),
+			       MSProcessor::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::PROCESSOR),
+			       Table(processorSetup));
+    SetupNewTable spectralWindowSetup(spectralWindowTableName(),
+			       MSSpectralWindow::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::SPECTRAL_WINDOW),  
+			       Table(spectralWindowSetup));
+    SetupNewTable stateSetup(stateTableName(),
+			       MSState::requiredTableDesc(),option);
+    rwKeywordSet().defineTable(MS::keywordName(MS::STATE),  
+			       Table(stateSetup));
+    initRefs();
+}
+
+Bool MeasurementSet::makeComplexData()
+{
+  // for now we use an extremely simplistic implementation (should find out
+  // storage managers and tiles and keep things the same)
+  if (tableDesc().isColumn(MS::columnName(MS::DATA))) return False;
+  if (!tableDesc().isColumn(MS::columnName(MS::FLOAT_DATA))) return False;
+
+  // we have FLOAT_DATA but not DATA
+  // add DATA
+  addColumn(ArrayColumnDesc<Complex>("DATA",2));
+  
+  // now copy data across from FLOAT_DATA
+  ArrayColumn<Float> floatData(*this,MS::columnName(MS::FLOAT_DATA));
+  ArrayColumn<Complex> data(*this,MS::columnName(MS::DATA));
+  for (uInt i=0; i<nrow(); i++) {
+    Array<Float> floatArr(floatData(i));
+    Array<Complex> dataArr(floatArr.shape());
+    convertArray(dataArr,floatArr);
+    data.put(i,dataArr);
+  }
+  return True;
+}
+
+Bool MeasurementSet::validateMeasureRefs()
+{
+  Bool ok=True;
+  // check main table
+  {
+    Int nCol = tableDesc().ncolumn();
+    for (Int i=0; i<nCol; i++) {
+      Int fld = tableDesc()[i].keywordSet().fieldNumber("MEASINFO");
+      if (fld>=0) {
+	Int refFld = tableDesc()[i].keywordSet().asRecord(fld).
+	  fieldNumber("Ref");
+	if (refFld<0 || tableDesc()[i].keywordSet().asRecord(fld).
+	    asString(refFld) == "") {
+	  cerr << "Missing Measure reference for column "<<tableDesc()[i].name()
+	       << endl;
+	  ok = False;
+	}
+      }
+    }
+  }
+  // check all subtables
+  Int nKey = keywordSet().nfields();
+  for (Int i=0; i<nKey; i++) {
+    if (keywordSet().type(i)== TpTable) {
+      Table tab = keywordSet().asTable(i);
+      Int nCol = tab.tableDesc().ncolumn();
+      for (Int i=0; i<nCol; i++) {
+	Int fld = tab.tableDesc()[i].keywordSet().fieldNumber("MEASINFO");
+	if (fld>=0) {
+	  Int refFld = tab.tableDesc()[i].keywordSet().asRecord(fld).
+	    fieldNumber("Ref");
+	  if (refFld<0 || tab.tableDesc()[i].keywordSet().asRecord(fld).
+	      asString(refFld) == "") {
+	    cerr << "Missing Measure reference for column "
+		 <<tab.tableDesc()[i].name()<<" in subtable "<<tab.tableName() 
+		 << endl;
+	    ok = False;
+	  }
+	}
+      }
+    }
+  }
+  return ok;
+}
+
+void MeasurementSet::flush(Bool sync) {
+  MSTable<MSMainEnums::PredefinedColumns, MSMainEnums::PredefinedKeywords>::flush(sync);
+  antenna_p.flush(sync);
+  dataDesc_p.flush(sync);
+  if (!doppler_p.isNull()) doppler_p.flush(sync);
+  feed_p.flush(sync);
+  field_p.flush(sync);
+  flagCmd_p.flush(sync);
+  if (!freqOffset_p.isNull())  freqOffset_p.flush(sync);
+  history_p.flush(sync);
+  observation_p.flush(sync);
+  pointing_p.flush(sync);
+  polarization_p.flush(sync);
+  processor_p.flush(sync);
+  if (!source_p.isNull())  source_p.flush(sync);
+  spectralWindow_p.flush(sync);
+  state_p.flush(sync);
+  if (!sysCal_p.isNull())  sysCal_p.flush(sync);
+  if (!weather_p.isNull())  weather_p.flush(sync);
+}
+
+void MeasurementSet::checkVersion()
+{
+  // Check that the MS is the latest version (2.0). Throw an
+  // exception and advise the user to use the MS converter if it is not.
+  //
+  if (!keywordSet().isDefined("MS_VERSION") || 
+      (keywordSet().isDefined("MS_VERSION") &&
+       keywordSet().asFloat("MS_VERSION")!=2.0)) {
+    throw(AipsError("These data are not in MSv2 format - use ms1toms2 to convert"));
+  }
+}
+
+Record MeasurementSet::msseltoindex(const String& spw, const String& field, 
+		      const String& baseline, const String& time, 
+		      const String& scan, const String& uvrange, 
+				    const String& taql){
+  Record retval;
+  MSSelection thisSelection;
+  thisSelection.setSpwExpr(spw);
+  thisSelection.setFieldExpr(field);
+  thisSelection.setAntennaExpr(baseline);
+  thisSelection.setTimeExpr(time);
+  thisSelection.setScanExpr(scan);
+  thisSelection.setUvDistExpr(uvrange);
+  thisSelection.setTaQLExpr(taql);
+  TableExprNode exprNode=thisSelection.toTableExprNode(this);
+  Vector<Int> fieldlist=thisSelection.getFieldList();
+  Vector<Int> spwlist=thisSelection.getSpwList();
+  Vector<Int> scanlist=thisSelection.getScanList();
+  Vector<Int> antenna1list=thisSelection.getAntenna1List();
+  Vector<Int> antenna2list=thisSelection.getAntenna2List();
+  Matrix<Int> chanlist=thisSelection.getChanList();
+  Matrix<Int> baselinelist=thisSelection.getBaselineList();
+  Vector<Int> ddIDList=thisSelection.getDDIDList();
+  OrderedMap<Int, Vector<Int > > polMap=thisSelection.getPolMap();
+  OrderedMap<Int, Vector<Vector<Int> > > corrMap=thisSelection.getCorrMap();
+
+  retval.define("spw", spwlist);
+  retval.define("field", fieldlist);
+  retval.define("scan",scanlist);
+  retval.define("antenna1", antenna1list);
+  retval.define("antenna2", antenna2list);
+  retval.define("baselines",baselinelist);
+  retval.define("channel", chanlist);
+  retval.define("dd",ddIDList);
+  //  retval.define("polmap",polMap);
+  // retrval.define("corrmap",corrMap);
+
+  return retval;
+
+}
+
+
+} //# NAMESPACE CASA - END
+
diff --git a/LCS/MSLofar/src/MSLofarAntenna.cc b/LCS/MSLofar/src/MSLofarAntenna.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9ae225a767424230e1705e808fad94a02926d1cc
--- /dev/null
+++ b/LCS/MSLofar/src/MSLofarAntenna.cc
@@ -0,0 +1,75 @@
+//# MSLofarAntenna.cc: MS ANTENNA subtable with LOFAR extensions
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#include <lofar_config.h>
+#include <MSLofar/MSLofarAntenna.h>
+#include <measures/Measures/MPosition.h>
+
+using namespace casa;
+
+namespace LOFAR {
+
+  MSLofarAntenna::MSLofarAntenna()
+  {}
+
+  MSLofarAntenna::MSLofarAntenna (const String& tableName,
+                                  Table::TableOption option) 
+    : MSAntenna (tableName, option)
+  {}
+
+  MSLofarAntenna::MSLofarAntenna (SetupNewTable& newTab, uInt nrrow,
+                                  Bool initialize)
+    : MSAntenna (newTab, nrrow, initialize)
+  {}
+
+  MSLofarAntenna::MSLofarAntenna (const Table& table)
+    : MSAntenna (table)
+  {}
+
+  MSLofarAntenna::MSLofarAntenna (const MSLofarAntenna& that)
+    : MSAntenna (that)
+  {}
+
+  MSLofarAntenna::~MSLofarAntenna()
+  {}
+
+  MSLofarAntenna& MSLofarAntenna::operator= (const MSLofarAntenna& that)
+  {
+    MSAntenna::operator= (that);
+    return *this;
+  }
+
+  TableDesc MSLofarAntenna::requiredTableDesc()
+  {
+    TableDesc td (MSAntenna::requiredTableDesc());
+    MSLofarTable::addColumn (td, "LOFAR_STATION_ID", TpInt,
+                             "ID in LOFAR_STATION table");
+    MSLofarTable::addColumn (td, "LOFAR_PHASE_REFERENCE", TpArrayDouble,
+                             "Beamformer phase reference position",
+                             "m", "POSITION", MPosition::ITRF,
+                             1, IPosition(1,3),
+                             ColumnDesc::FixedShape + ColumnDesc::Direct);
+    return td;
+  }
+
+} //# end namespace
diff --git a/LCS/MSLofar/src/MSLofarAntennaColumns.cc b/LCS/MSLofar/src/MSLofarAntennaColumns.cc
new file mode 100644
index 0000000000000000000000000000000000000000..09d2e1edd190ea734e055e4f26f67e96404be610
--- /dev/null
+++ b/LCS/MSLofar/src/MSLofarAntennaColumns.cc
@@ -0,0 +1,81 @@
+//# MSLofarAntennaColumns.cc: provides easy access to LOFAR's MSAntenna columns
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#include <lofar_config.h>
+#include <MSLofar/MSLofarAntennaColumns.h>
+#include <MSLofar/MSLofarAntenna.h>
+
+using namespace casa;
+
+namespace LOFAR {
+
+  ROMSLofarAntennaColumns::ROMSLofarAntennaColumns
+  (const MSLofarAntenna& msLofarAntenna)
+  {
+    attach (msLofarAntenna);
+  }
+
+  ROMSLofarAntennaColumns::~ROMSLofarAntennaColumns()
+  {}
+
+  ROMSLofarAntennaColumns::ROMSLofarAntennaColumns()
+  {}
+
+  void ROMSLofarAntennaColumns::attach
+  (const MSLofarAntenna& msLofarAntenna)
+  {
+    ROMSAntennaColumns::attach (msLofarAntenna);
+    stationId_p.attach (msLofarAntenna, "LOFAR_STATION_ID");
+    phaseReference_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+    phaseReferenceQuant_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+    phaseReferenceMeas_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+  }
+
+
+  MSLofarAntennaColumns::MSLofarAntennaColumns
+  (MSLofarAntenna& msLofarAntenna)
+  {
+    attach (msLofarAntenna);
+  }
+
+  MSLofarAntennaColumns::~MSLofarAntennaColumns()
+  {}
+
+  MSLofarAntennaColumns::MSLofarAntennaColumns()
+  {}
+
+  void MSLofarAntennaColumns::attach
+  (MSLofarAntenna& msLofarAntenna)
+  {
+    MSAntennaColumns::attach (msLofarAntenna);
+    roStationId_p.attach (msLofarAntenna, "LOFAR_STATION_ID");
+    rwStationId_p.attach (msLofarAntenna, "LOFAR_STATION_ID");
+    roPhaseReference_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+    rwPhaseReference_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+    roPhaseReferenceQuant_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+    rwPhaseReferenceQuant_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+    roPhaseReferenceMeas_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+    rwPhaseReferenceMeas_p.attach (msLofarAntenna, "LOFAR_PHASE_REFERENCE");
+  }
+
+} //# end namespace
diff --git a/LCS/MSLofar/src/MSLofarObsColumns.cc b/LCS/MSLofar/src/MSLofarObsColumns.cc
new file mode 100644
index 0000000000000000000000000000000000000000..8067965d58b1dd2c30c582a37e3fd525126780ea
--- /dev/null
+++ b/LCS/MSLofar/src/MSLofarObsColumns.cc
@@ -0,0 +1,164 @@
+//# MSLofarObsColumns.cc: provides easy access to LOFAR's MSObservation columns
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#include <lofar_config.h>
+#include <MSLofar/MSLofarObsColumns.h>
+#include <MSLofar/MSLofarObservation.h>
+
+using namespace casa;
+
+namespace LOFAR {
+
+  ROMSLofarObservationColumns::ROMSLofarObservationColumns
+  (const MSLofarObservation& msLofarObservation)
+  {
+    attach (msLofarObservation);
+  }
+
+  ROMSLofarObservationColumns::~ROMSLofarObservationColumns()
+  {}
+
+  ROMSLofarObservationColumns::ROMSLofarObservationColumns()
+  {}
+
+  void ROMSLofarObservationColumns::attach
+  (const MSLofarObservation& msLofarObservation)
+  {
+    ROMSObservationColumns::attach (msLofarObservation);
+    projectTitle_p.attach (msLofarObservation, "LOFAR_PROJECT_TITLE");
+    projectPI_p.attach (msLofarObservation, "LOFAR_PROJECT_PI");
+    projectCoI_p.attach (msLofarObservation, "LOFAR_PROJECT_CO_I");
+    projectContact_p.attach (msLofarObservation, "LOFAR_PROJECT_CONTACT");
+    observationId_p.attach (msLofarObservation, "LOFAR_OBSERVATION_ID");
+    observationStart_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    observationEnd_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    observationFrequencyMax_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MAX");
+    observationFrequencyMin_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MIN");
+    observationFrequencyCenter_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_CENTER");
+    subArrayPointing_p.attach (msLofarObservation, "LOFAR_SUB_ARRAY_POINTING");
+    antennaSet_p.attach (msLofarObservation, "LOFAR_ANTENNA_SET");
+    filterSelection_p.attach (msLofarObservation, "LOFAR_FILTER_SELECTION");
+    clockFrequency_p.attach (msLofarObservation, "LOFAR_CLOCK_FREQUENCY");
+    target_p.attach (msLofarObservation, "LOFAR_TAGET");
+    systemVersion_p.attach (msLofarObservation, "LOFAR_SYSTEM_VERSION");
+    pipelineName_p.attach (msLofarObservation, "LOFAR_PIPELINE_NAME");
+    pipelineVersion_p.attach (msLofarObservation, "LOFAR_PIPELINE_VERSION");
+    fileName_p.attach (msLofarObservation, "LOFAR_FILE_NAME");
+    fileType_p.attach (msLofarObservation, "LOFAR_FILE_TYPE");
+    fileDate_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+    observationStartQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    observationEndQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    observationFrequencyMaxQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MAX");
+    observationFrequencyMinQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MIN");
+    observationFrequencyCenterQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_CENTER");
+    clockFrequencyQuant_p.attach (msLofarObservation, "LOFAR_CLOCK_FREQUENCY");
+    fileDateQuant_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+    observationStartMeas_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    observationEndMeas_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    fileDateMeas_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+  }
+
+
+  MSLofarObservationColumns::MSLofarObservationColumns
+  (MSLofarObservation& msLofarObservation)
+  {
+    attach (msLofarObservation);
+  }
+
+  MSLofarObservationColumns::~MSLofarObservationColumns()
+  {}
+
+  MSLofarObservationColumns::MSLofarObservationColumns()
+  {}
+
+  void MSLofarObservationColumns::attach
+  (MSLofarObservation& msLofarObservation)
+  {
+    MSObservationColumns::attach (msLofarObservation);
+    // Readonly.
+    roProjectTitle_p.attach (msLofarObservation, "LOFAR_PROJECT_TITLE");
+    roProjectPI_p.attach (msLofarObservation, "LOFAR_PROJECT_PI");
+    roProjectCoI_p.attach (msLofarObservation, "LOFAR_PROJECT_CO_I");
+    roProjectContact_p.attach (msLofarObservation, "LOFAR_PROJECT_CONTACT");
+    roObservationId_p.attach (msLofarObservation, "LOFAR_OBSERVATION_ID");
+    roObservationStart_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    roObservationEnd_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    roObservationFrequencyMax_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MAX");
+    roObservationFrequencyMin_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MIN");
+    roObservationFrequencyCenter_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_CENTER");
+    roSubArrayPointing_p.attach (msLofarObservation, "LOFAR_SUB_ARRAY_POINTING");
+    roAntennaSet_p.attach (msLofarObservation, "LOFAR_ANTENNA_SET");
+    roFilterSelection_p.attach (msLofarObservation, "LOFAR_FILTER_SELECTION");
+    roClockFrequency_p.attach (msLofarObservation, "LOFAR_CLOCK_FREQUENCY");
+    roTarget_p.attach (msLofarObservation, "LOFAR_TAGET");
+    roSystemVersion_p.attach (msLofarObservation, "LOFAR_SYSTEM_VERSION");
+    roPipelineName_p.attach (msLofarObservation, "LOFAR_PIPELINE_NAME");
+    roPipelineVersion_p.attach (msLofarObservation, "LOFAR_PIPELINE_VERSION");
+    roFileName_p.attach (msLofarObservation, "LOFAR_FILE_NAME");
+    roFileType_p.attach (msLofarObservation, "LOFAR_FILE_TYPE");
+    roFileDate_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+    roObservationStartQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    roObservationEndQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    roObservationFrequencyMaxQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MAX");
+    roObservationFrequencyMinQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MIN");
+    roObservationFrequencyCenterQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_CENTER");
+    roClockFrequencyQuant_p.attach (msLofarObservation, "LOFAR_CLOCK_FREQUENCY");
+    roFileDateQuant_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+    roObservationStartMeas_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    roObservationEndMeas_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    roFileDateMeas_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+    // Read/write
+    rwProjectTitle_p.attach (msLofarObservation, "LOFAR_PROJECT_TITLE");
+    rwProjectPI_p.attach (msLofarObservation, "LOFAR_PROJECT_PI");
+    rwProjectCoI_p.attach (msLofarObservation, "LOFAR_PROJECT_CO_I");
+    rwProjectContact_p.attach (msLofarObservation, "LOFAR_PROJECT_CONTACT");
+    rwObservationId_p.attach (msLofarObservation, "LOFAR_OBSERVATION_ID");
+    rwObservationStart_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    rwObservationEnd_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    rwObservationFrequencyMax_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MAX");
+    rwObservationFrequencyMin_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MIN");
+    rwObservationFrequencyCenter_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_CENTER");
+    rwSubArrayPointing_p.attach (msLofarObservation, "LOFAR_SUB_ARRAY_POINTING");
+    rwAntennaSet_p.attach (msLofarObservation, "LOFAR_ANTENNA_SET");
+    rwFilterSelection_p.attach (msLofarObservation, "LOFAR_FILTER_SELECTION");
+    rwClockFrequency_p.attach (msLofarObservation, "LOFAR_CLOCK_FREQUENCY");
+    rwTarget_p.attach (msLofarObservation, "LOFAR_TAGET");
+    rwSystemVersion_p.attach (msLofarObservation, "LOFAR_SYSTEM_VERSION");
+    rwPipelineName_p.attach (msLofarObservation, "LOFAR_PIPELINE_NAME");
+    rwPipelineVersion_p.attach (msLofarObservation, "LOFAR_PIPELINE_VERSION");
+    rwFileName_p.attach (msLofarObservation, "LOFAR_FILE_NAME");
+    rwFileType_p.attach (msLofarObservation, "LOFAR_FILE_TYPE");
+    rwFileDate_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+    rwObservationStartQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    rwObservationEndQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    rwObservationFrequencyMaxQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MAX");
+    rwObservationFrequencyMinQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_MIN");
+    rwObservationFrequencyCenterQuant_p.attach (msLofarObservation, "LOFAR_OBSERVATION_FREQUENCY_CENTER");
+    rwClockFrequencyQuant_p.attach (msLofarObservation, "LOFAR_CLOCK_FREQUENCY");
+    rwFileDateQuant_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+    rwObservationStartMeas_p.attach (msLofarObservation, "LOFAR_OBSERVATION_START");
+    rwObservationEndMeas_p.attach (msLofarObservation, "LOFAR_OBSERVATION_END");
+    rwFileDateMeas_p.attach (msLofarObservation, "LOFAR_FILE_DATE");
+  }
+
+} //# end namespace
diff --git a/LCS/MSLofar/src/MSLofarObservation.cc b/LCS/MSLofar/src/MSLofarObservation.cc
new file mode 100644
index 0000000000000000000000000000000000000000..f353fb54cfba76b56c8d6a3b04a1c4df34a1e6e1
--- /dev/null
+++ b/LCS/MSLofar/src/MSLofarObservation.cc
@@ -0,0 +1,117 @@
+//# MSLofarObservation.cc: MS OBSERVATION subtable with LOFAR extensions
+//# Copyright (C) 2011
+//# ASTRON (Netherlands Institute for Radio Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+//#
+//# This file is part of the LOFAR software suite.
+//# The LOFAR software suite is free software: you can redistribute it and/or
+//# modify it under the terms of the GNU General Public License as published
+//# by the Free Software Foundation, either version 3 of the License, or
+//# (at your option) any later version.
+//#
+//# The LOFAR software suite is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License along
+//# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
+//#
+//# $Id$
+//#
+//# @author Ger van Diepen
+
+#include <lofar_config.h>
+#include <MSLofar/MSLofarObservation.h>
+#include <measures/Measures/MEPoch.h>
+
+using namespace casa;
+
+namespace LOFAR {
+
+  MSLofarObservation::MSLofarObservation()
+  {}
+
+  MSLofarObservation::MSLofarObservation (const String& tableName,
+                                  Table::TableOption option) 
+    : MSObservation (tableName, option)
+  {}
+
+  MSLofarObservation::MSLofarObservation (SetupNewTable& newTab, uInt nrrow,
+                                  Bool initialize)
+    : MSObservation (newTab, nrrow, initialize)
+  {}
+
+  MSLofarObservation::MSLofarObservation (const Table& table)
+    : MSObservation (table)
+  {}
+
+  MSLofarObservation::MSLofarObservation (const MSLofarObservation& that)
+    : MSObservation (that)
+  {}
+
+  MSLofarObservation::~MSLofarObservation()
+  {}
+
+  MSLofarObservation& MSLofarObservation::operator= (const MSLofarObservation& that)
+  {
+    MSObservation::operator= (that);
+    return *this;
+  }
+
+  TableDesc MSLofarObservation::requiredTableDesc()
+  {
+    TableDesc td (MSObservation::requiredTableDesc());
+    MSLofarTable::addColumn (td, "LOFAR_PROJECT_TITLE", TpString,
+                             "Project description");
+    MSLofarTable::addColumn (td, "LOFAR_PROJECT_PI", TpString,
+                             "Principal investigator");
+    MSLofarTable::addColumn (td, "LOFAR_PROJECT_CO_I", TpArrayString,
+                             "Co investigators");
+    MSLofarTable::addColumn (td, "LOFAR_PROJECT_CONTACT", TpString,
+                             "Contact author");
+    MSLofarTable::addColumn (td, "LOFAR_OBSERVATION_ID", TpString,
+                             "Observation ID");
+    MSLofarTable::addColumn (td, "LOFAR_OBSERVATION_START", TpDouble,
+                             "Observation start",
+                             "s", "EPOCH", MEpoch::UTC);
+    MSLofarTable::addColumn (td, "LOFAR_OBSERVATION_END", TpDouble,
+                             "Observation end",
+                             "s", "EPOCH", MEpoch::UTC);
+    MSLofarTable::addColumn (td, "LOFAR_OBSERVATION_FREQUENCY_MAX", TpDouble,
+                             "Maximum frequency",
+                             "MHz");
+    MSLofarTable::addColumn (td, "LOFAR_OBSERVATION_FREQUENCY_MIN", TpDouble,
+                             "Minimum frequency",
+                             "MHz");
+    MSLofarTable::addColumn (td, "LOFAR_OBSERVATION_FREQUENCY_CENTER", TpDouble,
+                             "Center frequency",
+                             "MHz");
+    MSLofarTable::addColumn (td, "LOFAR_SUB_ARRAY_POINTING", TpInt,
+                             "Subarray pointing id");
+    MSLofarTable::addColumn (td, "LOFAR_ANTENNA_SET", TpString,
+                             "SAS Antenna set name");
+    MSLofarTable::addColumn (td, "LOFAR_FILTER_SELECTION", TpString,
+                             "SAS Filter selection");
+    MSLofarTable::addColumn (td, "LOFAR_CLOCK_FREQUENCY", TpDouble,
+                             "SAS Clock setting",
+                             "MHz");
+    MSLofarTable::addColumn (td, "LOFAR_TARGET", TpArrayString,
+                             "List of targets");
+    MSLofarTable::addColumn (td, "LOFAR_SYSTEM_VERSION", TpString,
+                             "Version of the system");
+    MSLofarTable::addColumn (td, "LOFAR_PIPELINE_NAME", TpString,
+                             "Pipeline identification");
+    MSLofarTable::addColumn (td, "LOFAR_PIPELINE_VERSION", TpString,
+                             "Pipeline version");
+    MSLofarTable::addColumn (td, "LOFAR_FILE_NAME", TpString,
+                             "Name of raw data set");
+    MSLofarTable::addColumn (td, "LOFAR_FILE_TYPE", TpString,
+                             "Data type (uv)");
+    MSLofarTable::addColumn (td, "LOFAR_FILE_DATE", TpDouble,
+                             "File creation time",
+                             "s", "EPOCH", MEpoch::UTC);
+    return td;
+  }
+
+} //# end namespace