diff --git a/modules/Bio/EnsEMBL/DBSQL/OperonAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/OperonAdaptor.pm
index ccf5a9682cbf9841cabd37d110a7a2d5a7e1e2e7..15058e06044462d44842e492039eb06df75bc2de 100644
--- a/modules/Bio/EnsEMBL/DBSQL/OperonAdaptor.pm
+++ b/modules/Bio/EnsEMBL/DBSQL/OperonAdaptor.pm
@@ -63,8 +63,7 @@ use vars '@ISA';
 #  Status     : Stable
 
 sub _tables {
-	return ( [ 'operon', 'o' ],
-			 [ 'operon_stable_id', 'osi' ]);
+	return ( [ 'operon', 'o' ], [ 'operon_stable_id', 'osi' ] );
 }
 
 # _columns
@@ -87,8 +86,8 @@ sub _columns {
 
 	return ( 'o.operon_id',      'o.seq_region_id',     'o.seq_region_start',
 			 'o.seq_region_end', 'o.seq_region_strand', 'o.display_label',
-			 'osi.stable_id',    'osi.version',         $created_date,
-			 $modified_date );
+			 'o.analysis_id',    'osi.stable_id',       'osi.version',
+			 $created_date,      $modified_date );
 }
 
 sub _left_join {
@@ -199,11 +198,12 @@ sub fetch_by_stable_id {
   Status      : At Risk
 
 =cut
+
 sub fetch_all {
 	my ($self) = @_;
 
 	my $constraint = '';
-	my @operons      = @{ $self->generic_fetch($constraint) };
+	my @operons    = @{ $self->generic_fetch($constraint) };
 	return \@operons;
 }
 
@@ -342,8 +342,9 @@ sub fetch_all_by_Slice {
 		if ( $slice != $ext_slice ) {
 			$new_tr = $tr->transfer($slice);
 			if ( !defined($new_tr) ) {
-				throw(  "Unexpected. "
-					  . "Transcript could not be transfered onto operon slice." );
+				throw(   "Unexpected. "
+					   . "Transcript could not be transfered onto operon slice."
+				);
 			}
 		} else {
 			$new_tr = $tr;
@@ -438,9 +439,9 @@ sub fetch_by_operon_transcript_stable_id {
 }
 
 sub fetch_by_operon_transcript {
-		my ( $self, $trans ) = @_;
-		assert_ref($trans,'Bio::EnsEMBL::OperonTranscript');
-		$self->fetch_by_operon_transcript_id($trans->dbID());
+	my ( $self, $trans ) = @_;
+	assert_ref( $trans, 'Bio::EnsEMBL::OperonTranscript' );
+	$self->fetch_by_operon_transcript_id( $trans->dbID() );
 }
 
 =head2 store
@@ -471,7 +472,14 @@ sub store {
 	if ( $operon->is_stored($db) ) {
 		return $operon->dbID();
 	}
-
+		    my $analysis = $operon->analysis();
+  throw("Operons must have an analysis object.") if(!defined($analysis));
+	my $analysis_id;
+	if ( $analysis->is_stored($db) ) {
+		$analysis_id = $analysis->dbID();
+	} else {
+		$analysis_id = $db->get_AnalysisAdaptor->store( $analysis );
+	}
 	# ensure coords are correct before storing
 	#$operon->recalculate_coordinates();
 
@@ -485,17 +493,19 @@ sub store {
                seq_region_start = ?,
                seq_region_end = ?,
                seq_region_strand = ?,
-               display_label = ?
+               display_label = ?,
+               analysis_id = ?
   );
 	# column status is used from schema version 34 onwards (before it was
 	# confidence)
 
 	my $sth = $self->prepare($store_operon_sql);
-	    $sth->bind_param(1,$seq_region_id,SQL_INTEGER);
-	$sth->bind_param( 2, $operon->start(),  SQL_INTEGER );
-	$sth->bind_param( 3, $operon->end(),    SQL_INTEGER );
-	$sth->bind_param( 4, $operon->strand(), SQL_TINYINT );
-	$sth->bind_param( 5, $operon->display_label(),   SQL_VARCHAR );
+	$sth->bind_param( 1, $seq_region_id,           SQL_INTEGER );
+	$sth->bind_param( 2, $operon->start(),         SQL_INTEGER );
+	$sth->bind_param( 3, $operon->end(),           SQL_INTEGER );
+	$sth->bind_param( 4, $operon->strand(),        SQL_TINYINT );
+	$sth->bind_param( 5, $operon->display_label(), SQL_VARCHAR );
+	$sth->bind_param( 6, $analysis_id,             SQL_INTEGER );
 
 	$sth->execute();
 	$sth->finish();
@@ -595,9 +605,9 @@ sub remove {
 		$dbe_adaptor->remove_from_object( $dbe, $operon, 'Operon' );
 	}
 
-#	# remove the attributes associated with this transcript
-#	my $attrib_adaptor = $self->db->get_AttributeAdaptor;
-#	$attrib_adaptor->remove_from_Operon($operon);
+	#	# remove the attributes associated with this transcript
+	#	my $attrib_adaptor = $self->db->get_AttributeAdaptor;
+	#	$attrib_adaptor->remove_from_Operon($operon);
 
 	# remove all of the transcripts associated with this operon
 	my $transcriptAdaptor = $self->db->get_OperonTranscriptAdaptor();
@@ -650,23 +660,24 @@ sub _objs_from_sth {
 	#
 
 	my $sa = $self->db()->get_SliceAdaptor();
-	#my $aa = $self->db->get_AnalysisAdaptor();
+	my $aa = $self->db->get_AnalysisAdaptor();
 
 	my @operons;
 	my %analysis_hash;
 	my %slice_hash;
 	my %sr_name_hash;
 	my %sr_cs_hash;
-	my ( $stable_id, $version, $created_date, $modified_date );
+	my ( $stable_id, $version, $created_date, $modified_date, $analysis_id );
 
-	my ( $operon_id, $seq_region_id, $seq_region_start, $seq_region_end,
-		 $seq_region_strand, $display_label );
+	my ( $operon_id,      $seq_region_id,     $seq_region_start,
+		 $seq_region_end, $seq_region_strand, $display_label );
 
 	$sth->bind_columns( \$operon_id,         \$seq_region_id,
 						\$seq_region_start,  \$seq_region_end,
 						\$seq_region_strand, \$display_label,
-						\$stable_id,         \$version,
-						\$created_date,      \$modified_date );
+						\$analysis_id,       \$stable_id,
+						\$version,           \$created_date,
+						\$modified_date );
 
 	my $asm_cs;
 	my $cmp_cs;
@@ -701,9 +712,10 @@ sub _objs_from_sth {
 	my $count = 0;
   OPERON: while ( $sth->fetch() ) {
 		$count++;
-		#    #get the analysis object
-		#    my $analysis = $analysis_hash{$analysis_id} ||=
-		#      $aa->fetch_by_dbID($analysis_id);
+		#get the analysis object
+		my $analysis = $analysis_hash{$analysis_id} ||=
+		  $aa->fetch_by_dbID($analysis_id);
+		$analysis_hash{$analysis_id} = $analysis;
 		#need to get the internal_seq_region, if present
 		$seq_region_id = $self->get_seq_region_id_internal($seq_region_id);
 		#get the slice object
@@ -774,21 +786,20 @@ sub _objs_from_sth {
 			$slice = $dest_slice;
 		} ## end if ($dest_slice)
 
-		push(
-			@operons,
-			Bio::EnsEMBL::Operon->new(
-				  -START          => $seq_region_start,
-				  -END            => $seq_region_end,
-				  -STRAND         => $seq_region_strand,
-				  -SLICE          => $slice,
-				  -DISPLAY_LABEL           => $display_label,
-				  -ADAPTOR       => $self,
-				-DBID        => $operon_id,
-				  -STABLE_ID     => $stable_id,
-				 -VERSION      => $version,
-				 -CREATED_DATE => $created_date || undef,
-				  -MODIFIED_DATE => $modified_date || undef
-				));
+		push( @operons,
+			  Bio::EnsEMBL::Operon->new(
+									  -START         => $seq_region_start,
+									  -END           => $seq_region_end,
+									  -STRAND        => $seq_region_strand,
+									  -SLICE         => $slice,
+									  -DISPLAY_LABEL => $display_label,
+									  -ADAPTOR       => $self,
+									  -DBID          => $operon_id,
+									  -STABLE_ID     => $stable_id,
+									  -VERSION       => $version,
+									  -CREATED_DATE  => $created_date || undef,
+									  -MODIFIED_DATE => $modified_date || undef,
+									  -ANALYSIS      => $analysis ) );
 
 	} ## end while ( $sth->fetch() )
 
diff --git a/modules/Bio/EnsEMBL/DBSQL/OperonTranscriptAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/OperonTranscriptAdaptor.pm
index 365b151efa124336737c19e2a2b21ddd241bd48e..8889f6918b5dd2f72b271da19b958e29503bf765 100644
--- a/modules/Bio/EnsEMBL/DBSQL/OperonTranscriptAdaptor.pm
+++ b/modules/Bio/EnsEMBL/DBSQL/OperonTranscriptAdaptor.pm
@@ -92,8 +92,9 @@ sub _columns {
 	return ( 'o.operon_transcript_id', 'o.seq_region_id',
 			 'o.seq_region_start',     'o.seq_region_end',
 			 'o.seq_region_strand',    'o.display_label',
-			 'osi.stable_id',          'osi.version',
-			 $created_date,            $modified_date );
+			 'o.analysis_id',          'osi.stable_id',
+			 'osi.version',            $created_date,
+			 $modified_date );
 }
 
 sub _left_join {
@@ -194,6 +195,7 @@ sub fetch_by_name {
 
 	return $operon;
 }
+
 =head2 fetch_all
 
   Example     : $operon_transcripts = $operon_adaptor->fetch_all();
@@ -203,6 +205,7 @@ sub fetch_by_name {
   Status      : At Risk
 
 =cut
+
 sub fetch_all {
 	my ($self) = @_;
 
@@ -529,7 +532,15 @@ sub store {
 
 	( $operon_transcript, $seq_region_id ) =
 	  $self->_pre_store($operon_transcript);
-
+	my $analysis = $operon_transcript->analysis();
+	throw("OperonTranscripts must have an analysis object.")
+	  if ( !defined($analysis) );
+	my $analysis_id;
+	if ( $analysis->is_stored($db) ) {
+		$analysis_id = $analysis->dbID();
+	} else {
+		$analysis_id = $db->get_AnalysisAdaptor->store($analysis);
+	}
 	my $store_operon_transcript_sql = qq(
         INSERT INTO operon_transcript
            SET seq_region_id = ?,
@@ -537,7 +548,8 @@ sub store {
                seq_region_end = ?,
                seq_region_strand = ?,
                display_label = ?,
-               operon_id = ?
+               operon_id = ?,
+               analysis_id =?
   );
 	# column status is used from schema version 34 onwards (before it was
 	# confidence)
@@ -549,6 +561,7 @@ sub store {
 	$sth->bind_param( 4, $operon_transcript->strand(),        SQL_TINYINT );
 	$sth->bind_param( 5, $operon_transcript->display_label(), SQL_VARCHAR );
 	$sth->bind_param( 6, $operon_id,                          SQL_INTEGER );
+	$sth->bind_param( 7, $analysis_id,                        SQL_INTEGER );
 
 	$sth->execute();
 	$sth->finish();
@@ -557,18 +570,18 @@ sub store {
 
 	# store stable ids if they are available
 	if ( defined( $operon_transcript->stable_id() ) ) {
-		my $statement = sprintf(
-			    "INSERT INTO operon_transcript_stable_id SET "
-			  . "operon_transcript_id = ?, "
-			  . "stable_id = ?, "
-			  . "version = ?, "
-			  . "created_date = %s, "
-			  . "modified_date = %s",
-			$self->db()->dbc()->from_seconds_to_date(
+		my $statement = sprintf( "INSERT INTO operon_transcript_stable_id SET "
+								   . "operon_transcript_id = ?, "
+								   . "stable_id = ?, "
+								   . "version = ?, "
+								   . "created_date = %s, "
+								   . "modified_date = %s",
+								 $self->db()->dbc()->from_seconds_to_date(
 											  $operon_transcript->created_date()
-			),
-			$self->db()->dbc()
-			  ->from_seconds_to_date( $operon_transcript->modified_date() ) );
+								 ),
+								 $self->db()->dbc()->from_seconds_to_date(
+											 $operon_transcript->modified_date()
+								 ) );
 
 		$sth = $self->prepare($statement);
 		$sth->bind_param( 1, $operon_transcript_dbID,         SQL_INTEGER );
@@ -674,9 +687,9 @@ sub remove {
 										  'OperonTranscript' );
 	}
 
-#	# remove the attributes associated with this transcript
-#	my $attrib_adaptor = $self->db->get_AttributeAdaptor;
-#	$attrib_adaptor->remove_from_OperonTranscript($operon_transcript);
+	#	# remove the attributes associated with this transcript
+	#	my $attrib_adaptor = $self->db->get_AttributeAdaptor;
+	#	$attrib_adaptor->remove_from_OperonTranscript($operon_transcript);
 
 	# remove the stable identifier
 	my $sth = $self->prepare(
@@ -722,7 +735,7 @@ sub _objs_from_sth {
 	#
 
 	my $sa = $self->db()->get_SliceAdaptor();
-	#my $aa = $self->db->get_AnalysisAdaptor();
+	my $aa = $self->db->get_AnalysisAdaptor();
 
 	my @operons;
 	my %analysis_hash;
@@ -732,13 +745,15 @@ sub _objs_from_sth {
 	my ( $stable_id, $version, $created_date, $modified_date );
 
 	my ( $operon_transcript_id, $seq_region_id,     $seq_region_start,
-		 $seq_region_end,       $seq_region_strand, $display_label );
+		 $seq_region_end,       $seq_region_strand, $display_label,
+		 $analysis_id );
 
 	$sth->bind_columns( \$operon_transcript_id, \$seq_region_id,
 						\$seq_region_start,     \$seq_region_end,
 						\$seq_region_strand,    \$display_label,
-						\$stable_id,            \$version,
-						\$created_date,         \$modified_date );
+						\$analysis_id,          \$stable_id,
+						\$version,              \$created_date,
+						\$modified_date );
 
 	my $asm_cs;
 	my $cmp_cs;
@@ -774,8 +789,9 @@ sub _objs_from_sth {
   OPERON: while ( $sth->fetch() ) {
 		$count++;
 		#    #get the analysis object
-		#    my $analysis = $analysis_hash{$analysis_id} ||=
-		#      $aa->fetch_by_dbID($analysis_id);
+		my $analysis = $analysis_hash{$analysis_id} ||=
+		  $aa->fetch_by_dbID($analysis_id);
+		$analysis_hash{$analysis_id} = $analysis;
 		#need to get the internal_seq_region, if present
 		$seq_region_id = $self->get_seq_region_id_internal($seq_region_id);
 		#get the slice object
@@ -848,18 +864,18 @@ sub _objs_from_sth {
 
 		push( @operons,
 			  Bio::EnsEMBL::OperonTranscript->new(
-									   -START         => $seq_region_start,
-									   -END           => $seq_region_end,
-									   -STRAND        => $seq_region_strand,
-									   -SLICE         => $slice,
-									   -DISPLAY_LABEL => $display_label,
-									   -ADAPTOR       => $self,
-									   -DBID          => $operon_transcript_id,
-									   -STABLE_ID     => $stable_id,
-									   -VERSION       => $version,
-									   -CREATED_DATE  => $created_date || undef,
-									   -MODIFIED_DATE => $modified_date || undef
-			  ) );
+									  -START         => $seq_region_start,
+									  -END           => $seq_region_end,
+									  -STRAND        => $seq_region_strand,
+									  -SLICE         => $slice,
+									  -DISPLAY_LABEL => $display_label,
+									  -ADAPTOR       => $self,
+									  -DBID          => $operon_transcript_id,
+									  -STABLE_ID     => $stable_id,
+									  -VERSION       => $version,
+									  -CREATED_DATE  => $created_date || undef,
+									  -MODIFIED_DATE => $modified_date || undef,
+									  -ANALYSIS      => $analysis ) );
 
 	} ## end while ( $sth->fetch() )
 
diff --git a/modules/t/operon.t b/modules/t/operon.t
index c9ee85fbff3c5e26407a7215e0e90c1d7fbef588..b5c8bfc7c968eabe384c8c33e42292b055d9271d 100644
--- a/modules/t/operon.t
+++ b/modules/t/operon.t
@@ -4,7 +4,7 @@ use warnings;
 BEGIN {
 	$| = 1;
 	use Test;
-	plan tests => 12;
+	plan tests => 15;
 }
 use Bio::EnsEMBL::DBEntry;
 use Bio::EnsEMBL::Operon;
@@ -31,6 +31,7 @@ my $end           = 31225946;
 my $strand        = 1;
 my $display_label = "accBC";
 my $analysis = $dba->get_AnalysisAdaptor->fetch_by_logic_name("Genscan");
+ok(defined $analysis);
 my $operon = Bio::EnsEMBL::Operon->new(
 	-START         => $start,
 	-END           => $end,
@@ -49,6 +50,7 @@ ok( $display_label, $operon->display_label(),     "Operon name" );
 ok( $start,         $operon->seq_region_start(),  "Operon start" );
 ok( $end,           $operon->seq_region_end(),    "Operon end" );
 ok( $strand,        $operon->seq_region_strand(), "Operon strand" );
+ok( $analysis,        $operon->analysis(), "Analysis" );
 
 my $operon_adaptor = Bio::EnsEMBL::DBSQL::OperonAdaptor->new($dba);
 
@@ -64,4 +66,7 @@ ok( $operon2->seq_region_end(),   $operon->seq_region_end(),   "Operon end" );
 ok( $operon2->seq_region_strand(),
 	$operon->seq_region_strand(),
 	"Operon strand" );
+ok( $operon2->analysis(),
+	$operon->analysis(),
+	"Analysis" );
 
diff --git a/modules/t/operon_fetch.t b/modules/t/operon_fetch.t
index 53b1c425d53044f5c89f1ebd5fc3c84a6860de4f..40ff0cf35df4822caa150937ca8ab88fbbcae27b 100644
--- a/modules/t/operon_fetch.t
+++ b/modules/t/operon_fetch.t
@@ -2,7 +2,7 @@ use strict;
 use warnings;
 BEGIN { $| = 1;
 	use Test;
-	plan tests => 12;
+	plan tests => 17;
 }
 
 use Bio::EnsEMBL::Test::MultiTestDB;
@@ -25,11 +25,13 @@ my $operon_adaptor =  Bio::EnsEMBL::DBSQL::OperonAdaptor->new($dba);
 my $operon = $operon_adaptor->fetch_by_name("16152-16153-4840");
 ok(defined $operon);
 	debug("O ".$operon->dbID());
+		ok(defined $operon->analysis());
 # iterate over its transcripts
 my $transcripts = $operon->get_all_OperonTranscripts();
 ok(defined $transcripts);
 ok(scalar(@$transcripts)>0);
 for my $ot (@$transcripts) {
+	ok(defined $ot->analysis());
 	debug("OT ".$ot->dbID());
 	for my $gene (@{$ot->get_all_Genes()}) {
 	debug("G ".$gene->dbID());
@@ -43,6 +45,7 @@ my $operons = $operon_adaptor->fetch_all_by_Slice($slice);
 ok(defined $operons);
 ok(scalar(@$operons)>0);
 for my $o (@$operons) {
+		ok(defined $o->analysis());
 	debug("O ".$o->dbID());
 	for my $ot (@{$o->get_all_OperonTranscripts()}) {
 	debug("OT ".$ot->dbID());
diff --git a/modules/t/operon_transcript.t b/modules/t/operon_transcript.t
index 64ec5f1db5805fe0c152fa8f2f4f7ecb6ce232fd..25d96f5af0c09b23665654a7ed3defe354bf8f53 100644
--- a/modules/t/operon_transcript.t
+++ b/modules/t/operon_transcript.t
@@ -4,7 +4,7 @@ use warnings;
 BEGIN {
 	$| = 1;
 	use Test;
-	plan tests => 40;
+	plan tests => 46;
 }
 use Bio::EnsEMBL::Test::MultiTestDB;
 use Bio::EnsEMBL::Test::TestUtils;
@@ -34,11 +34,13 @@ my $start         = 3403162;
 my $end           = 3405288;
 my $strand        = 1;
 my $display_label = "accBC";
+my $analysis = $dba->get_AnalysisAdaptor->fetch_by_logic_name("Genscan");
 my $operon = Bio::EnsEMBL::Operon->new( -START         => $start,
 										-END           => $end,
 										-STRAND        => $strand,
 										-SLICE         => $slice,
-										-DISPLAY_LABEL => $display_label, -STABLE_ID=>"op1" );
+										-DISPLAY_LABEL => $display_label, -STABLE_ID=>"op1", -ANALYSIS=>$analysis );
+	ok( $analysis,        $operon->analysis(), "Analysis" );
 
 my $gene_name    = "accB";
 my $gene_start   = 31225346;
@@ -54,7 +56,6 @@ my $gene        = Bio::EnsEMBL::Gene->new();
 my $transcript  = Bio::EnsEMBL::Transcript->new();
 my $exon        = Bio::EnsEMBL::Exon->new();
 my $translation = Bio::EnsEMBL::Translation->new();
-my $analysis    = $dba->get_AnalysisAdaptor->fetch_by_logic_name("Genscan");
 ok( defined $analysis );
 for my $feature ( $gene, $transcript, $exon ) {
 	$feature->start($gene_start);
@@ -117,18 +118,20 @@ my $operon_transcript =
   Bio::EnsEMBL::OperonTranscript->new( -START  => $start,
 									   -END    => $end,
 									   -STRAND => $strand,
-									   -SLICE  => $slice, -STABLE_ID=>"opt1" );
+									   -SLICE  => $slice, -STABLE_ID=>"opt1", -ANALYSIS=>$analysis  );
 $operon_transcript->add_gene($gene);
 $operon_transcript->add_gene($gene2);
 $operon->add_OperonTranscript($operon_transcript);
+	ok( $analysis,        $operon_transcript->analysis(), "Analysis" );
 
 my $operon_transcript2 =
   Bio::EnsEMBL::OperonTranscript->new( -START  => $start,
 									   -END    => $gene_start2,
 									   -STRAND => $strand,
-									   -SLICE  => $slice, -STABLE_ID=>"opt2" );
+									   -SLICE  => $slice, -STABLE_ID=>"opt2", -ANALYSIS=>$analysis  );
 $operon_transcript2->add_gene($gene);
 $operon->add_OperonTranscript($operon_transcript2);
+	ok( $analysis,        $operon_transcript->analysis(), "Analysis" );
 
 # store the lot
 # store operon
@@ -144,6 +147,7 @@ ok( $operon2->seq_region_end(),   $operon->seq_region_end(),   "Operon end" );
 ok( $operon2->seq_region_strand(),
 	$operon->seq_region_strand(),
 	"Operon strand" );
+	ok( $operon2->analysis(),             $operon->analysis(),             "Analysis" );
 my @operon_transcripts = @{ $operon2->get_all_OperonTranscripts() };
 # check operon transcript
 ok( scalar @operon_transcripts, 2, "Expected number of transcripts" );
@@ -160,6 +164,7 @@ ok( $operon_transcript_r->seq_region_end(),
 ok( $operon_transcript_r->seq_region_strand(),
 	$operon_transcript->seq_region_strand(),
 	"Operon transcript strand" );
+	ok( $operon_transcript->analysis(),             $operon_transcript_r->analysis(),             "Analysis" );
 
 # check genes
 my @ogenes = @{ $operon_transcript_r->get_all_Genes() };
@@ -188,6 +193,7 @@ ok( $operon_transcript_r2->seq_region_end(),
 ok( $operon_transcript_r2->seq_region_strand(),
 	$operon_transcript2->seq_region_strand(),
 	"Operon transcript strand" );
+	ok( $operon_transcript2->analysis(),             $operon_transcript_r2->analysis(),             "Analysis" );
 
 # check genes
 @ogenes = @{ $operon_transcript_r2->get_all_Genes() };